From df60dce04affbd11b19f9fb826e1dcaa6ae09b52 Mon Sep 17 00:00:00 2001 From: alaskowski <alaskowski@ethz.ch> Date: Fri, 20 Jan 2023 09:14:37 +0100 Subject: [PATCH] SSDM-13329 Moved deep_sequencing_unit and openbis_contrib to another repository: https://sissource.ethz.ch/openbis/openbis-private/openbis-dsu.ethz.ch --- deep_sequencing_unit/.gitignore | 10 - deep_sequencing_unit/.pydevproject | 7 - deep_sequencing_unit/.shadow_dependencies | 4 - .../HOW_TO_FIX_FAILING_CI_BUILD.txt | 25 - deep_sequencing_unit/build.gradle | 117 - .../createInvoices/dist/createInvoices.sh | 4 - .../dist/etc/service.properties | 23 - .../createInvoices/dist/log/.gitignore | 0 .../dist/createSampleSheet.sh | 30 - .../dist/createSampleSheet_nov.sh | 30 - .../dist/etc/createSampleSheet.properties | 55 - .../dist/etc/createSampleSheet_nov.properties | 34 - .../dist/etc/openBIS.keystore | Bin 98036 -> 0 bytes .../createsamplesheet/dist/log/.gitignore | 0 .../dist/etc/data-set-handler-alignment.py | 137 - .../etc/data-set-handler-basecall-stats.py | 53 - .../dist/etc/data-set-handler-bigwig.py | 124 - .../dist/etc/data-set-handler-cell.py | 111 - .../etc/data-set-handler-create-flow-cell.py | 165 - .../etc/data-set-handler-demultiplex-stats.py | 428 -- .../dist/etc/data-set-handler-lane.py | 269 - .../dist/etc/data-set-handler-pdf.py | 67 - .../dist/etc/data-set-handler-unaligned.py | 113 - .../dist/etc/data-set-handler_fastqc.py | 56 - .../etc/data-set-handler_runinfostatistics.py | 54 - .../etc/data-set-handler_takeRTA_timestamp.py | 48 - deep_sequencing_unit/dist/etc/log.xml | 56 - deep_sequencing_unit/dist/etc/passwd | 4 - .../dist/etc/service.properties | 228 - deep_sequencing_unit/etc/log.xml | 19 - deep_sequencing_unit/etc/service.properties | 189 - .../etc/web-client.properties | 77 - .../gradle/wrapper/gradle-wrapper.jar | Bin 55616 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - deep_sequencing_unit/gradlew | 188 - deep_sequencing_unit/gradlew.bat | 100 - deep_sequencing_unit/metadata/etc/log.xml | 19 - .../metadata/etc/openBIS.keystore | Bin 98036 -> 0 bytes .../metadata/etc/service.properties | 8 - .../resource/DSU TrackingClient.launch | 28 - .../resource/dependency-structure.ddf | 16 - .../resource/dsu-master-data.py | 3623 --------- .../eclipse/DSU Data Store Server.launch | 14 - .../property_types_for_admin_console.txt | 268 - .../DemoDropboxTest/demo-data/demo-file-1 | 1 - .../DemoDropboxTest/demo-data/demo-file-2 | 1 - .../141212_D00535_0037_AC5UMNANXX/RunInfo.xml | 23 - .../141212_D00535_0038_BC6A12ANXX/RunInfo.xml | 23 - .../runParameters.xml | 151 - .../RunInfo.xml | 23 - .../runParameters.xml | 151 - .../RunInfo.xml | 888 --- .../RunParameters.xml | 926 --- .../RTAComplete.txt | 1 - .../resource/test-db/.gitignore | 0 deep_sequencing_unit/settings.gradle | 1 - .../source/BDS/analysis_bcl2fastq.bds | 770 -- .../source/Jython/barcodeComplexityChecker.py | 62 - .../Jython/createInvoices_Illumina_NGS.py | 614 -- .../source/Jython/createSampleSheet.py | 702 -- .../source/Jython/createSampleSheetTest.py | 186 - .../Jython/createSampleSheet_Illumina_NGS.py | 507 -- .../createSampleSheet_Illumina_NGS_Test.py | 45 - .../Jython/createSampleSheet_bcl2fastq.py | 786 -- .../Jython/createSampleSheet_bcl2fastq.sh | 30 - .../createSampleSheet_bcl2fastq_Test.py | 575 -- .../source/Jython/createSampleSheet_miseq.py | 589 -- .../Jython/createSampleSheet_nextseq.py | 596 -- .../source/Jython/createSampleSheet_nov.py | 409 - .../source/Jython/create_QGF_Invoices.py | 403 - .../source/Jython/create_QGF_Invoices.sh | 4 - .../Jython/create_QGF_Invoices_simplified.py | 629 -- .../source/Jython/duplicateBarcodeChecker.py | 104 - deep_sequencing_unit/source/Python/bam2wig.py | 51 - .../source/Python/calculateCRC32.py | 56 - .../source/Python/concatenatePdfs.py | 70 - .../source/Python/fastq_quality.py | 42 - .../source/Python/fastqc_plots.py | 67 - .../Python/filterOnQualityForFastqGzip.py | 58 - .../Python/filter_on_quality_for_gzip.py | 58 - .../source/Python/rename_file.py | 41 - .../source/Python/solexaQa.py | 54 - .../source/R/CreatePerCycleReadQuality.R | 12 - .../source/R/barcodeDistribution.R | 113 - .../source/R/createQaReport.R | 7 - deep_sequencing_unit/source/R/fastq_quality.R | 101 - .../source/R/nucleotidesPerCycle.R | 14 - .../source/R/numberOfOccurrences.R | 19 - .../source/SQL/DBM_postgres_trigger.sql | 31 - .../source/bash/CreatePerCycleReadQuality.sh | 26 - .../bash/RTA_check_on_missing_images.sh | 63 - deep_sequencing_unit/source/bash/add_p.sh | 8 - .../source/bash/check_on_missing_images.sh | 62 - .../source/bash/check_read_numbers.sh | 26 - deep_sequencing_unit/source/bash/cif2txt.sh | 51 - .../source/bash/convert_template.sh | 3 - .../source/bash/createQaReport.sh | 10 - .../source/bash/create_srfs.sh | 79 - .../source/bash/createmd5sums | 18 - .../source/bash/datamover_post.sh | 10 - deep_sequencing_unit/source/bash/do-sync.sh | 45 - .../source/bash/ellac_create_srfs.sh | 150 - .../source/bash/goat_with_missing_tiles.sh | 13 - .../source/bash/illumina2srf-pre1.3 | Bin 704053 -> 0 bytes deep_sequencing_unit/source/bash/lanes2srf | 7 - .../source/bash/lanes2srf-pre1.3 | 6 - .../source/bash/lanes2srf_RTA | 21 - deep_sequencing_unit/source/bash/rm_p.sh | 8 - .../core-plugins/core-plugins.properties | 0 .../as/webapps/downloader/html/body-style.css | 60 - .../1/as/webapps/downloader/html/button.css | 39 - .../1/as/webapps/downloader/html/d3.js | 4013 ---------- .../1/as/webapps/downloader/html/d3.layout.js | 1865 ----- .../1/as/webapps/downloader/html/d3.time.js | 692 -- .../downloader/html/images/openBIS_Logo.svg | 68 - .../webapps/downloader/html/images/sprite.png | Bin 748 -> 0 bytes .../1/as/webapps/downloader/html/index.html | 9 - .../html/openbis-dsu-downloader.html | 835 -- .../as/webapps/downloader/html/openbis-dsu.js | 103 - .../1/as/webapps/downloader/html/tree.css | 138 - .../1/as/webapps/downloader/plugin.properties | 3 - .../1/as/initialize-master-data.py | 3385 -------- .../1/dss/data-sources/.gitignore | 0 .../create-flowcell-dropbox.py | 195 - .../create-flowcell-dropbox/plugin.properties | 12 - .../create-flowcell-hiseq.py | 194 - .../create-flowcell-hiseq/plugin.properties | 12 - .../create-flow-cell-miseq.py | 199 - .../create-flowcell-miseq/plugin.properties | 12 - .../read-demultiplex-stats/plugin.properties | 10 - .../read-demultiplex-stats.py | 538 -- .../read-rta-timestamp/plugin.properties | 11 - .../read-rta-timestamp/read-rta-timestamp.py | 45 - .../register-basecall-stats/plugin.properties | 11 - .../register-basecall-stats.py | 72 - .../register-bigwig/plugin.properties | 10 - .../register-bigwig/register-bigwig.py | 140 - .../register-bowtie/plugin.properties | 11 - .../register-bowtie/register-bowtie.py | 130 - .../register-fastqc/plugin.properties | 11 - .../register-fastqc/register-fastqc.py | 73 - .../plugin.properties | 11 - .../register-flowcell-dropbox.py | 66 - .../register-flowcell-hiseq/plugin.properties | 12 - .../register-flowcell-hiseq.py | 97 - .../register-flowcell-miseq/plugin.properties | 12 - .../register-flowcell-miseq.py | 60 - .../register-lane-hiseq/plugin.properties | 12 - .../register-lane-hiseq.py | 279 - .../register-lane-miseq/plugin.properties | 12 - .../register-lane-miseq.py | 203 - .../register-macs/plugin.properties | 11 - .../drop-boxes/register-macs/register-macs.py | 22 - .../register-runstatistics/plugin.properties | 11 - .../register-runstatistics.py | 73 - .../register-thumbnails/plugin.properties | 12 - .../register-thumbnails.py | 55 - .../register-unaligned/plugin.properties | 11 - .../register-unaligned/register-unaligned.py | 179 - .../1/dss/maintenance-tasks/.gitignore | 0 .../1/dss/reporting-plugins/.gitignore | 0 .../illumina-ngs/1/dss/services/.gitignore | 0 .../2/as/initialize-master-data.py | 2792 ------- .../2/dss/data-sources/.gitignore | 0 .../create-flowcell-hiseq.py | 221 - .../create-flowcell-hiseq/plugin.properties | 12 - .../read-rta-timestamp/plugin.properties | 11 - .../read-rta-timestamp/read-rta-timestamp.py | 76 - .../register-basecall-stats/plugin.properties | 11 - .../register-basecall-stats.py | 62 - .../register-flowcell/plugin.properties | 11 - .../register-flowcell-hiseq.py | 138 - .../register-lane-hiseq/plugin.properties | 12 - .../register-lane-hiseq.py | 223 - .../register-runstatistics/plugin.properties | 11 - .../register-runstatistics.py | 57 - .../register-unaligned/plugin.properties | 11 - .../register-unaligned/register-unaligned.py | 185 - .../2/dss/maintenance-tasks/.gitignore | 0 .../2/dss/reporting-plugins/.gitignore | 0 .../illumina-ngs/2/dss/services/.gitignore | 0 .../core-plugins/illumina-ngs/package-to-dist | 0 .../as/webapps/cellStatistics/html/index.html | 248 - .../as/webapps/cellStatistics/html/style.css | 47 - .../webapps/cellStatistics/plugin.properties | 6 - .../webapps/laneStatistics/html/d3.layout.js | 1 - .../webapps/laneStatistics/html/d3.v3.min.js | 4 - .../as/webapps/laneStatistics/html/index.html | 641 -- .../laneStatistics/html/openbis-dsu.js | 81 - .../1/as/webapps/laneStatistics/html/pie.js | 94 - .../as/webapps/laneStatistics/html/style.css | 47 - .../webapps/laneStatistics/plugin.properties | 6 - .../html/assets/css/bootstrap-responsive.css | 815 -- .../html/assets/css/bootstrap.css | 4984 ------------ .../sample-graph/html/assets/css/docs.css | 846 -- .../sample-graph/html/assets/css/openbis.css | 16 - .../ico/apple-touch-icon-114-precomposed.png | Bin 6043 -> 0 bytes .../ico/apple-touch-icon-144-precomposed.png | Bin 8457 -> 0 bytes .../ico/apple-touch-icon-57-precomposed.png | Bin 2260 -> 0 bytes .../ico/apple-touch-icon-72-precomposed.png | Bin 3204 -> 0 bytes .../sample-graph/html/assets/ico/favicon.ico | Bin 1150 -> 0 bytes .../sample-graph/html/assets/img/bird.png | Bin 3092 -> 0 bytes .../assets/img/bootstrap-mdo-sfmoma-01.jpg | Bin 130647 -> 0 bytes .../assets/img/bootstrap-mdo-sfmoma-02.jpg | Bin 84505 -> 0 bytes .../assets/img/bootstrap-mdo-sfmoma-03.jpg | Bin 50755 -> 0 bytes .../sample-graph/html/assets/img/browsers.png | Bin 19776 -> 0 bytes .../html/assets/img/example-sites/fleetio.png | Bin 39837 -> 0 bytes .../html/assets/img/example-sites/jshint.png | Bin 7258 -> 0 bytes .../html/assets/img/example-sites/kippt.png | Bin 50695 -> 0 bytes .../assets/img/example-sites/soundready.png | Bin 53979 -> 0 bytes .../img/examples/bootstrap-example-fluid.jpg | Bin 25832 -> 0 bytes .../img/examples/bootstrap-example-hero.jpg | Bin 22280 -> 0 bytes .../examples/bootstrap-example-starter.jpg | Bin 7182 -> 0 bytes .../html/assets/img/github-16px.png | Bin 398 -> 0 bytes .../assets/img/glyphicons-halflings-white.png | Bin 8777 -> 0 bytes .../html/assets/img/glyphicons-halflings.png | Bin 13826 -> 0 bytes .../img/glyphicons/glyphicons_009_magic.png | Bin 316 -> 0 bytes .../img/glyphicons/glyphicons_042_group.png | Bin 305 -> 0 bytes .../img/glyphicons/glyphicons_079_podium.png | Bin 213 -> 0 bytes .../glyphicons/glyphicons_082_roundabout.png | Bin 345 -> 0 bytes .../glyphicons_155_show_thumbnails.png | Bin 117 -> 0 bytes .../img/glyphicons/glyphicons_163_iphone.png | Bin 172 -> 0 bytes .../glyphicons_214_resize_small.png | Bin 301 -> 0 bytes .../glyphicons/glyphicons_266_book_open.png | Bin 292 -> 0 bytes .../html/assets/img/grid-18px-masked.png | Bin 405 -> 0 bytes .../html/assets/img/icon-css3.png | Bin 370 -> 0 bytes .../html/assets/img/icon-github.png | Bin 312 -> 0 bytes .../html/assets/img/icon-html5.png | Bin 452 -> 0 bytes .../html/assets/img/icon-twitter.png | Bin 264 -> 0 bytes .../html/assets/img/less-logo-large.png | Bin 13078 -> 0 bytes .../html/assets/img/less-small.png | Bin 1181 -> 0 bytes .../assets/img/responsive-illustrations.png | Bin 1077 -> 0 bytes .../sample-graph/html/assets/js/README.md | 106 - .../html/assets/js/application.js | 184 - .../html/assets/js/bootstrap-alert.js | 90 - .../html/assets/js/bootstrap-button.js | 96 - .../html/assets/js/bootstrap-carousel.js | 169 - .../html/assets/js/bootstrap-collapse.js | 157 - .../html/assets/js/bootstrap-dropdown.js | 100 - .../html/assets/js/bootstrap-modal.js | 218 - .../html/assets/js/bootstrap-popover.js | 98 - .../html/assets/js/bootstrap-scrollspy.js | 151 - .../html/assets/js/bootstrap-tab.js | 135 - .../html/assets/js/bootstrap-tooltip.js | 275 - .../html/assets/js/bootstrap-transition.js | 61 - .../html/assets/js/bootstrap-typeahead.js | 285 - .../sample-graph/html/assets/js/bootstrap.js | 1825 ----- .../html/assets/js/bootstrap.min.js | 6 - .../sample-graph/html/assets/js/d3/d3.js | 4150 ---------- .../html/assets/js/d3/d3.layout.js | 1892 ----- .../sample-graph/html/assets/js/d3/d3.time.js | 692 -- .../html/assets/js/dagre/dagre.js | 4049 ---------- .../html/assets/js/dagre/dagre.min.js | 22 - .../js/google-code-prettify/prettify.css | 30 - .../js/google-code-prettify/prettify.js | 28 - .../1/as/webapps/sample-graph/html/index.html | 92 - .../1/as/webapps/sample-graph/html/webapp.js | 1064 --- .../as/webapps/sample-graph/plugin.properties | 7 - .../sample-bottom-up-data/plugin.properties | 3 - .../sample-bottom-up-data/sample-bottom-up.py | 8 - .../cisd/dsu/dss/DataSetInfoExtractor.java | 115 - .../dsu/dss/FlowLaneDataSetInfoExtractor.java | 60 - .../bsse/cisd/dsu/dss/FlowLaneFeeder.java | 493 -- .../bsse/cisd/dsu/dss/StorageProcessor.java | 44 - .../dsu/dss/plugins/ChipResultsSummary.java | 89 - .../cisd/dsu/dss/plugins/ChipSummary.java | 72 - .../cisd/dsu/dss/plugins/DataSetToSOFT.java | 360 - .../ethz/bsse/cisd/dsu/dss/plugins/Date.java | 38 - .../cisd/dsu/dss/plugins/IlluminaSummary.java | 134 - .../IlluminaSummaryReportingPlugin.java | 302 - .../ethz/bsse/cisd/dsu/dss/plugins/Lane.java | 191 - .../dsu/dss/plugins/LaneResultsSummary.java | 46 - .../ethz/bsse/cisd/dsu/dss/plugins/Read.java | 64 - .../cisd/dsu/dss/plugins/doubleStats.java | 71 - .../ethz/bsse/cisd/dsu/dss/plugins/stats.java | 71 - .../ethz/bsse/cisd/dsu/metadata/DbAccess.java | 103 - .../bsse/cisd/dsu/metadata/Parameters.java | 91 - .../cisd/dsu/metadata/create_metadata.java | 445 -- .../dsu/tracking/dto/TrackedEntities.java | 73 - .../dsu/tracking/dto/TrackingStateDTO.java | 93 - .../bsse/cisd/dsu/tracking/email/Email.java | 82 - .../dsu/tracking/email/EmailWithSummary.java | 46 - .../email/EntityTrackingEmailData.java | 140 - .../email/EntityTrackingEmailDataManager.java | 206 - .../email/EntityTrackingEmailGenerator.java | 586 -- .../email/IEntityTrackingEmailGenerator.java | 37 - .../tracking/main/FileBasedTrackingDAO.java | 141 - .../cisd/dsu/tracking/main/ITrackingDAO.java | 29 - .../cisd/dsu/tracking/main/Parameters.java | 224 - .../cisd/dsu/tracking/main/TrackingBO.java | 801 -- .../dsu/tracking/main/TrackingClient.java | 287 - .../cisd/dsu/tracking/utils/LogUtils.java | 88 - .../source/java/service.properties | 141 - .../core-plugins/core-plugins.properties | 1 - .../drop-boxes/demo-dropbox/demo-dropbox.py | 14 - .../drop-boxes/demo-dropbox/plugin.properties | 5 - .../1/as/webapps/.gc3pie/html/body-style.css | 4 - .../html/bootstrap3/css/bootstrap-theme.css | 384 - .../bootstrap3/css/bootstrap-theme.min.css | 1 - .../.gc3pie/html/bootstrap3/css/bootstrap.css | 6805 ----------------- .../html/bootstrap3/css/bootstrap.min.css | 9 - .../fonts/glyphicons-halflings-regular.eot | Bin 14079 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 228 - .../fonts/glyphicons-halflings-regular.ttf | Bin 29512 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 16448 -> 0 bytes .../.gc3pie/html/bootstrap3/js/bootstrap.js | 1999 ----- .../html/bootstrap3/js/bootstrap.min.js | 6 - .../1/as/webapps/.gc3pie/html/button.css | 54 - .../1/as/webapps/.gc3pie/html/d3.v2.min.js | 4 - .../.gc3pie/html/images/openBIS_Logo.svg | 68 - .../1/as/webapps/.gc3pie/html/index.html | 452 -- .../1/as/webapps/.gc3pie/html/index.html.sv | 314 - .../1/as/webapps/.gc3pie/html/index2.html | 14 - .../webapps/.gc3pie/html/jquery-1.8.2.min.js | 2 - .../.gc3pie/html/openbis-action-deferrer.js | 31 - .../1/as/webapps/.gc3pie/html/openbis-dsu.js | 103 - .../as/webapps/.gc3pie/html/openbis-login.js | 77 - .../.gc3pie/html/openbis-request-cache.js | 51 - .../webapps/.gc3pie/html/openbis-screening.js | 655 -- .../1/as/webapps/.gc3pie/html/openbis.js | 1987 ----- .../1/as/webapps/.gc3pie/html/spin.min.js | 2 - .../1/as/webapps/.gc3pie/plugin.properties | 6 - .../1/as/webapps/bee/html/index.html | 428 -- .../1/as/webapps/bee/plugin.properties | 6 - .../as/webapps/cellStatistics/html/index.html | 324 - .../as/webapps/cellStatistics/html/style.css | 47 - .../webapps/cellStatistics/plugin.properties | 6 - .../html/bootstrap3/css/bootstrap-theme.css | 442 -- .../bootstrap3/css/bootstrap-theme.css.map | 1 - .../bootstrap3/css/bootstrap-theme.min.css | 5 - .../html/bootstrap3/css/bootstrap.css | 6203 --------------- .../html/bootstrap3/css/bootstrap.css.map | 1 - .../html/bootstrap3/css/bootstrap.min.css | 5 - .../fonts/glyphicons-halflings-regular.eot | Bin 20335 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41280 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23320 -> 0 bytes .../html/bootstrap3/js/bootstrap.js | 2114 ----- .../html/bootstrap3/js/bootstrap.min.js | 6 - .../css/bootstrapValidator.min.css | 13 - .../js/bootstrapValidator.min.js | 13 - .../webapps/demultiplexing/html/css/main.css | 8 - .../html/images/openBIS_Logo.svg | 68 - .../as/webapps/demultiplexing/html/index.html | 175 - .../demultiplexing/html/js/d3.v2.min.js | 4 - .../html/js/jquery-1.8.2.min.js | 2 - .../as/webapps/demultiplexing/html/js/main.js | 180 - .../html/js/openbis-action-deferrer.js | 31 - .../demultiplexing/html/js/openbis-dsu.js | 103 - .../demultiplexing/html/js/openbis-login.js | 77 - .../html/js/openbis-request-cache.js | 51 - .../html/js/openbis-screening.js | 655 -- .../webapps/demultiplexing/html/js/openbis.js | 1987 ----- .../demultiplexing/html/js/spin.min.js | 2 - .../webapps/demultiplexing/plugin.properties | 6 - .../as/webapps/downloader/html/body-style.css | 60 - .../1/as/webapps/downloader/html/button.css | 39 - .../1/as/webapps/downloader/html/d3.time.js | 692 -- .../downloader/html/images/openBIS_Logo.svg | 68 - .../webapps/downloader/html/images/sprite.png | Bin 748 -> 0 bytes .../1/as/webapps/downloader/html/index.html | 1 - .../html/openbis-dsu-downloader.html | 836 -- .../1/as/webapps/downloader/html/tree.css | 138 - .../1/as/webapps/downloader/plugin.properties | 3 - .../1/as/webapps/invoicing/html/index.html | 179 - .../1/as/webapps/invoicing/plugin.properties | 6 - .../as/webapps/laneStatistics/html/index.html | 1037 --- .../as/webapps/laneStatistics/html/style.css | 52 - .../webapps/laneStatistics/plugin.properties | 6 - .../illumina-qgf/1/as/webapps/openbis-dsu.js | 358 - .../webapps/sampleSheet/html/body-style.css | 4 - .../1/as/webapps/sampleSheet/html/button.css | 54 - .../1/as/webapps/sampleSheet/html/index.html | 155 - .../as/webapps/sampleSheet/plugin.properties | 6 - .../create-flowcell-hiseq.py | 221 - .../create-flowcell-hiseq/plugin.properties | 12 - .../create-flow-cell-miseq.py | 251 - .../create-flowcell-miseq/plugin.properties | 12 - .../create-flow-cell-nextseq.py | 290 - .../create-flowcell-nextseq/plugin.properties | 12 - .../create-flowcell/create-flowcell.py | 309 - .../create-flowcell/plugin.properties | 9 - .../export-meta-data/export-meta-data.py | 464 -- .../dss/drop-boxes/export-meta-data/lib/crc32 | Bin 13196 -> 0 bytes .../export-meta-data/plugin.properties | 12 - .../plugin.properties | 10 - .../read-demultiplex-stats-miseq.py | 594 -- .../plugin.properties | 10 - .../read-demultiplex-stats-nextseq.py | 364 - .../read_demultiplex_stats.java | 736 -- .../read_demultiplex_statsTest.java | 64 - .../start_read_demultiplex_stats.java | 21 - .../read-demultiplex-stats/plugin.properties | 10 - .../read-demultiplex-stats.py | 595 -- .../read-rta-timestamp/plugin.properties | 12 - .../read-rta-timestamp/read-rta-timestamp.py | 49 - .../register-basecall-stats/plugin.properties | 11 - .../register-basecall-stats.py | 51 - .../drop-boxes/register-bee/plugin.properties | 11 - .../drop-boxes/register-bee/register-bee.py | 64 - .../register-bigwig/plugin.properties | 10 - .../register-bigwig/register-bigwig.py | 140 - .../register-bowtie/plugin.properties | 11 - .../register-bowtie/register-bowtie.py | 40 - ...gnmentJavaDataSetRegistrationDropboxV2.jar | Bin 3750 -> 0 bytes .../lib/alignment.jar.sv | Bin 2103 -> 0 bytes .../lib/alignment.jar.sv2 | Bin 2103 -> 0 bytes .../plugin.properties | 7 - .../register-dummy/plugin.properties | 11 - .../register-dummy/register-dummy.py | 56 - .../register-fastqc/plugin.properties | 11 - .../register-fastqc/register-fastqc.py | 82 - .../register-flowcell-hiseq/plugin.properties | 12 - .../register-flowcell-hiseq.py | 61 - .../register-flowcell-miseq/plugin.properties | 12 - .../register-flowcell-miseq.py | 60 - .../plugin.properties | 12 - .../register-flowcell-nextseq.py | 62 - .../register-flowcell/plugin.properties | 6 - .../register-flowcell/register-flowcell.py | 106 - .../register-flowlane/lib/crc32_v2.c | 206 - .../register-flowlane/plugin.properties | 6 - .../register-flowlane/register-flowlane.py | 360 - .../drop-boxes/register-lane-hiseq/lib/crc32 | Bin 10567 -> 0 bytes .../register-lane-hiseq/plugin.properties | 12 - .../register-lane-hiseq.py | 493 -- .../drop-boxes/register-lane-miseq/lib/crc32 | Bin 10567 -> 0 bytes .../register-lane-miseq/plugin.properties | 12 - .../register-lane-miseq.py | 327 - .../register-lane-nextseq/lib/crc32 | Bin 10567 -> 0 bytes .../register-lane-nextseq/lib/crc32_v2.c | 206 - .../register-lane-nextseq/plugin.properties | 12 - .../register-lane-nextseq.py | 398 - .../register-macs/plugin.properties | 11 - .../drop-boxes/register-macs/register-macs.py | 22 - .../register-runstatistics/plugin.properties | 11 - .../register-runstatistics.py | 73 - .../register-thumbnails/plugin.properties | 12 - .../register-thumbnails.py | 55 - .../plugin.properties | 11 - .../register-unaligned-miseq.py | 176 - .../register-unaligned/plugin.properties | 11 - .../register-unaligned/register-unaligned.py | 195 - .../register-undetermined/plugin.properties | 11 - .../register-undetermined.py | 63 - .../plugin.properties | 11 - .../register-aggregated-basecall-stats.py | 72 - .../setInvoiceSent/plugin.properties | 3 - .../setInvoiceSent/script.py | 65 - .../plugin.properties | 3 - .../triggerCreateSampleSheet/script.py | 44 - .../triggerInvoice/plugin.properties | 3 - .../triggerInvoice/script.py | 75 - .../triggerbee/lib/jyson-1.0.2.jar | Bin 7805 -> 0 bytes .../triggerbee/plugin.properties | 3 - .../reporting-plugins/triggerbee/script.py | 194 - .../triggergc3pie/plugin.properties | 3 - .../reporting-plugins/triggergc3pie/script.py | 201 - .../illumina-qgf/1/jython-lib/gfb_utils.py | 120 - .../create-flowcell/create-flowcell.py | 312 - .../create-flowcell/plugin.properties | 9 - .../plugin.properties | 6 - .../read-demultiplex-stats-miseq-hiseq.py | 366 - .../read_demultiplex_stats_miseq_hiseq.java | 736 -- .../plugin.properties | 10 - .../read-demultiplex-stats-nextseq.py | 353 - .../read_demultiplex_stats.java | 727 -- .../read_demultiplex_statsTest.java | 64 - .../start_read_demultiplex_stats.java | 21 - .../drop-boxes/read-json/plugin.properties | 6 - .../2/dss/drop-boxes/read-json/read-json.py | 96 - .../read-rta-timestamp/plugin.properties | 12 - .../read-rta-timestamp/read-rta-timestamp.py | 67 - .../register-fastqc/plugin.properties | 6 - .../register-fastqc/register-fastqc.py | 54 - .../register-flowcell/plugin.properties | 6 - .../register-flowcell/register-flowcell.py | 107 - .../drop-boxes/register-flowlane/lib/a.out | Bin 13120 -> 0 bytes .../drop-boxes/register-flowlane/lib/crc32 | Bin 10567 -> 0 bytes .../drop-boxes/register-flowlane/lib/crc32.sv | Bin 10567 -> 0 bytes .../register-flowlane/lib/crc32_v2.c | 206 - .../register-flowlane/plugin.properties | 6 - .../register-flowlane/register-flowlane.py | 477 -- .../register-undetermined/plugin.properties | 6 - .../register-undetermined.py | 51 - .../plugin.properties | 6 - .../register-demuliplex-stats.py | 78 - .../v2_register-trimming/plugin.properties | 6 - .../v2_register-trimming/register-trimming.py | 50 - .../illumina-qgf/2/jython-lib/gfb_utils.py | 123 - .../bsse/cisd/dsu/DependencyCheckingTest.java | 25 - .../dsu/dss/DataSetInfoExtractorTest.java | 112 - .../bsse/cisd/dsu/dss/FlowLaneFeederTest.java | 735 -- .../ethz/bsse/cisd/dsu/dss/plugins/.gitignore | 1 - .../dsu/dss/plugins/DataSetToSOFTTest.java | 277 - .../plugins/IlluminaSummaryXMLLoaderTest.java | 200 - .../dss/systemtests/DSUDropboxSystemTest.java | 73 - .../dsu/dss/systemtests/DSUSystemTest.java | 37 - .../dss/systemtests/DSUTestInitializer.java | 72 - .../dsu/dss/systemtests/DemoDropboxTest.java | 64 - .../main/FileBasedTrackingDAOTest.java | 212 - .../sourceTest/java/tests.xml | 14 - .../tracking/dist/etc/email-template.txt | 10 - .../tracking/dist/etc/log.xml | 56 - .../tracking/dist/etc/service.properties | 57 - .../tracking/dist/etc/tracking-local-database | 2 - .../dist/etc/tracking-sample-database | 2511 ------ .../tracking/dist/tracking.sh | 29 - .../tracking/etc/email-template.txt | 26 - deep_sequencing_unit/tracking/etc/log.xml | 19 - .../tracking/etc/openBIS.keystore | Bin 98036 -> 0 bytes .../tracking/etc/service.properties | 21 - .../tracking/etc/tracking-local-database | 2 - .../tracking/etc/tracking-sample-database | 1 - gradle/build.gradle | 1 - gradle/settings.gradle | 2 +- installation/build.gradle | 1 - installation/settings.gradle | 4 +- js-test/settings.gradle | 2 +- openbis_all/build/build.xml | 7 - openbis_all/source/bash/build/branch.sh | 1 - openbis_contrib/.classpath | 20 - openbis_contrib/.project | 17 - .../.settings/org.eclipse.jdt.core.prefs | 12 - openbis_contrib/build/build.xml | 72 - openbis_contrib/dist/.gitignore | 0 openbis_contrib/etc/log.xml | 19 - openbis_contrib/etc/service.properties | 22 - openbis_contrib/properties/dist/properties.sh | 27 - .../ControlledVocabulariesDTO.java | 36 - .../DataSetPropertyAssignmentsDTO.java | 50 - .../DbDataTypeComparison.java | 172 - .../DbDataTypeComparisonQueryDAO.java | 71 - .../ExperimentPropertyAssignmentsDTO.java | 50 - .../MaterialPropertyAssignmentDTO.java | 50 - .../PropertyTypeAndDataTypeDTO.java | 68 - .../SamplePropertyAssignmentsDTO.java | 49 - .../TermsOfControlledVocabulariesDTO.java | 50 - .../bsse/cisd/dsu/properties/GenomeMap.java | 84 - .../dsu/properties/GetSampleProperties.java | 454 -- .../categoryoracle/CategoryOracle.java | 84 - .../FeatureVectorConverter.java | 69 - .../cisd/dynamix/categoryoracle/Features.java | 176 - .../cisd/dynamix/categoryoracle/InputRow.java | 75 - .../categoryoracle/InputRowFactory.java | 33 - .../categoryoracle/InputRowsHelper.java | 76 - .../InputRowsNamedCollection.java | 50 - .../dynamix/categoryoracle/OutputRow.java | 81 - .../dynamix/categoryoracle/TsvBuilder.java | 62 - openbis_contrib/source/java/log.xml | 19 - openbis_contrib/source/java/log4j.properties | 11 - openbis_standard_technologies/build.gradle | 5 +- openbis_standard_technologies/settings.gradle | 2 +- ui-test/settings.gradle | 2 +- 554 files changed, 7 insertions(+), 114002 deletions(-) delete mode 100644 deep_sequencing_unit/.gitignore delete mode 100644 deep_sequencing_unit/.pydevproject delete mode 100644 deep_sequencing_unit/.shadow_dependencies delete mode 100644 deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt delete mode 100644 deep_sequencing_unit/build.gradle delete mode 100644 deep_sequencing_unit/createInvoices/dist/createInvoices.sh delete mode 100644 deep_sequencing_unit/createInvoices/dist/etc/service.properties delete mode 100644 deep_sequencing_unit/createInvoices/dist/log/.gitignore delete mode 100755 deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh delete mode 100644 deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh delete mode 100644 deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties delete mode 100644 deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties delete mode 100644 deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore delete mode 100644 deep_sequencing_unit/createsamplesheet/dist/log/.gitignore delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-alignment.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-cell.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-lane.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-pdf.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py delete mode 100644 deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py delete mode 100755 deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py delete mode 100644 deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py delete mode 100644 deep_sequencing_unit/dist/etc/log.xml delete mode 100644 deep_sequencing_unit/dist/etc/passwd delete mode 100644 deep_sequencing_unit/dist/etc/service.properties delete mode 100644 deep_sequencing_unit/etc/log.xml delete mode 100644 deep_sequencing_unit/etc/service.properties delete mode 100644 deep_sequencing_unit/etc/web-client.properties delete mode 100644 deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar delete mode 100644 deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties delete mode 100755 deep_sequencing_unit/gradlew delete mode 100644 deep_sequencing_unit/gradlew.bat delete mode 100644 deep_sequencing_unit/metadata/etc/log.xml delete mode 100644 deep_sequencing_unit/metadata/etc/openBIS.keystore delete mode 100644 deep_sequencing_unit/metadata/etc/service.properties delete mode 100644 deep_sequencing_unit/resource/DSU TrackingClient.launch delete mode 100644 deep_sequencing_unit/resource/dependency-structure.ddf delete mode 100644 deep_sequencing_unit/resource/dsu-master-data.py delete mode 100644 deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch delete mode 100644 deep_sequencing_unit/resource/property_types_for_admin_console.txt delete mode 100644 deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 delete mode 100644 deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml delete mode 100644 deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt delete mode 100644 deep_sequencing_unit/resource/test-db/.gitignore delete mode 100644 deep_sequencing_unit/settings.gradle delete mode 100755 deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds delete mode 100644 deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py delete mode 100644 deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheetTest.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py delete mode 100755 deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py delete mode 100644 deep_sequencing_unit/source/Jython/createSampleSheet_nov.py delete mode 100644 deep_sequencing_unit/source/Jython/create_QGF_Invoices.py delete mode 100755 deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh delete mode 100644 deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py delete mode 100644 deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py delete mode 100644 deep_sequencing_unit/source/Python/bam2wig.py delete mode 100644 deep_sequencing_unit/source/Python/calculateCRC32.py delete mode 100644 deep_sequencing_unit/source/Python/concatenatePdfs.py delete mode 100755 deep_sequencing_unit/source/Python/fastq_quality.py delete mode 100755 deep_sequencing_unit/source/Python/fastqc_plots.py delete mode 100644 deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py delete mode 100644 deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py delete mode 100644 deep_sequencing_unit/source/Python/rename_file.py delete mode 100644 deep_sequencing_unit/source/Python/solexaQa.py delete mode 100644 deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R delete mode 100644 deep_sequencing_unit/source/R/barcodeDistribution.R delete mode 100644 deep_sequencing_unit/source/R/createQaReport.R delete mode 100644 deep_sequencing_unit/source/R/fastq_quality.R delete mode 100644 deep_sequencing_unit/source/R/nucleotidesPerCycle.R delete mode 100644 deep_sequencing_unit/source/R/numberOfOccurrences.R delete mode 100644 deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql delete mode 100644 deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh delete mode 100755 deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh delete mode 100755 deep_sequencing_unit/source/bash/add_p.sh delete mode 100755 deep_sequencing_unit/source/bash/check_on_missing_images.sh delete mode 100644 deep_sequencing_unit/source/bash/check_read_numbers.sh delete mode 100755 deep_sequencing_unit/source/bash/cif2txt.sh delete mode 100755 deep_sequencing_unit/source/bash/convert_template.sh delete mode 100644 deep_sequencing_unit/source/bash/createQaReport.sh delete mode 100644 deep_sequencing_unit/source/bash/create_srfs.sh delete mode 100755 deep_sequencing_unit/source/bash/createmd5sums delete mode 100644 deep_sequencing_unit/source/bash/datamover_post.sh delete mode 100755 deep_sequencing_unit/source/bash/do-sync.sh delete mode 100755 deep_sequencing_unit/source/bash/ellac_create_srfs.sh delete mode 100755 deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh delete mode 100755 deep_sequencing_unit/source/bash/illumina2srf-pre1.3 delete mode 100755 deep_sequencing_unit/source/bash/lanes2srf delete mode 100755 deep_sequencing_unit/source/bash/lanes2srf-pre1.3 delete mode 100755 deep_sequencing_unit/source/bash/lanes2srf_RTA delete mode 100755 deep_sequencing_unit/source/bash/rm_p.sh delete mode 100644 deep_sequencing_unit/source/core-plugins/core-plugins.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css delete mode 100755 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js delete mode 100755 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css delete mode 100644 deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/data-sources/.gitignore delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/maintenance-tasks/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/reporting-plugins/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/services/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/data-sources/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties delete mode 100755 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/maintenance-tasks/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/reporting-plugins/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/services/.gitignore delete mode 100644 deep_sequencing_unit/source/core-plugins/illumina-ngs/package-to-dist delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js delete mode 100755 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css delete mode 100644 deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties delete mode 100644 deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java delete mode 100644 deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java delete mode 100644 deep_sequencing_unit/source/java/service.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png delete mode 120000 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 delete mode 100755 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py delete mode 100644 deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java delete mode 100644 deep_sequencing_unit/sourceTest/java/tests.xml delete mode 100644 deep_sequencing_unit/tracking/dist/etc/email-template.txt delete mode 100644 deep_sequencing_unit/tracking/dist/etc/log.xml delete mode 100644 deep_sequencing_unit/tracking/dist/etc/service.properties delete mode 100644 deep_sequencing_unit/tracking/dist/etc/tracking-local-database delete mode 100644 deep_sequencing_unit/tracking/dist/etc/tracking-sample-database delete mode 100755 deep_sequencing_unit/tracking/dist/tracking.sh delete mode 100644 deep_sequencing_unit/tracking/etc/email-template.txt delete mode 100644 deep_sequencing_unit/tracking/etc/log.xml delete mode 100644 deep_sequencing_unit/tracking/etc/openBIS.keystore delete mode 100644 deep_sequencing_unit/tracking/etc/service.properties delete mode 100644 deep_sequencing_unit/tracking/etc/tracking-local-database delete mode 100644 deep_sequencing_unit/tracking/etc/tracking-sample-database delete mode 100644 openbis_contrib/.classpath delete mode 100644 openbis_contrib/.project delete mode 100644 openbis_contrib/.settings/org.eclipse.jdt.core.prefs delete mode 100644 openbis_contrib/build/build.xml delete mode 100644 openbis_contrib/dist/.gitignore delete mode 100644 openbis_contrib/etc/log.xml delete mode 100644 openbis_contrib/etc/service.properties delete mode 100644 openbis_contrib/properties/dist/properties.sh delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java delete mode 100644 openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java delete mode 100644 openbis_contrib/source/java/log.xml delete mode 100644 openbis_contrib/source/java/log4j.properties diff --git a/deep_sequencing_unit/.gitignore b/deep_sequencing_unit/.gitignore deleted file mode 100644 index 12cf7890270..00000000000 --- a/deep_sequencing_unit/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/.shredder -/.settings -/test-output -/temp-testng-customsuite.xml -/targets -/bin -/build -/.idea/ -*.iml -*.eml \ No newline at end of file diff --git a/deep_sequencing_unit/.pydevproject b/deep_sequencing_unit/.pydevproject deleted file mode 100644 index a9cca037b33..00000000000 --- a/deep_sequencing_unit/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?eclipse-pydev version="1.0"?> - -<pydev_project> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> -</pydev_project> diff --git a/deep_sequencing_unit/.shadow_dependencies b/deep_sequencing_unit/.shadow_dependencies deleted file mode 100644 index d3dfcd195f7..00000000000 --- a/deep_sequencing_unit/.shadow_dependencies +++ /dev/null @@ -1,4 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="lib" path="/libraries/openbis-apis"/> -</classpath> diff --git a/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt b/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt deleted file mode 100644 index 94f6ee1dcdf..00000000000 --- a/deep_sequencing_unit/HOW_TO_FIX_FAILING_CI_BUILD.txt +++ /dev/null @@ -1,25 +0,0 @@ -Problem: - -java.lang.IllegalArgumentException: No dump file found. - at ch.ethz.bsse.cisd.dsu.dss.systemtests.DSUTestInitializer.init(DSUTestInitializer.java:71) - at ch.ethz.bsse.cisd.dsu.dss.systemtests.DSUDropboxSystemTest.beforeSuite(DSUDropboxSystemTest.java:33) - -Solution: - -ssh jenkins (i.e. ci@bs-ci01.ethz.ch) -cd ~/jenkins/workspace_fast/deep_sequencing_unit/resource/test-db -ln -s ../../../../test-db/openbis_test_qgf.dmp openbis_test_qgf.dmp -ls -la - -Problem: - -Caused by: ch.systemsx.cisd.common.exceptions.ConfigurationFailureException: Store root 'targets/playground/store' does not exist. - at ch.systemsx.cisd.common.exceptions.ConfigurationFailureException.fromTemplate(ConfigurationFailureException.java:49) - at ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin.<init>(AbstractDatastorePlugin.java:66) - at ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin.<init>(AbstractDatastorePlugin.java:58) - -Solution: - -ssh jenkins (i.e. ci@bs-ci01.ethz.ch) -cd ~/jenkins/workspace_fast/deep_sequencing_unit/targets -mkdir -p playground/store diff --git a/deep_sequencing_unit/build.gradle b/deep_sequencing_unit/build.gradle deleted file mode 100644 index 6133f7e7ada..00000000000 --- a/deep_sequencing_unit/build.gradle +++ /dev/null @@ -1,117 +0,0 @@ -evaluationDependsOn(':commonbase') -evaluationDependsOn(':common') -evaluationDependsOn(':openbis_api') -evaluationDependsOn(':openbis-common') -evaluationDependsOn(':authentication') -evaluationDependsOn(':dbmigration') -evaluationDependsOn(':openbis') -evaluationDependsOn(':datastore_server') - -apply from: '../gradle/javaproject.gradle' - -archivesBaseName = 'datastore_server_plugin-dsu' - -configurations.create('trackingClient') -configurations.create('trackingClientPartial') -dependencies { - api project(':common'), - project(':openbis-common'), - project(':openbis_api'), - project(':openbis'), - project(':datastore_server'), - 'apache:commons-cli:1.2' - - - testImplementation project(path: ':commonbase', configuration: 'tests'), - project(path: ':common', configuration: 'tests'), - project(path: ':dbmigration', configuration: 'tests'), - project(path: ':authentication', configuration: 'tests'), - project(path: ':openbis_api', configuration: 'tests'), - project(path: ':openbis-common', configuration: 'tests'), - project(path: ':openbis', configuration: 'tests'), - project(path: ':datastore_server', configuration: 'tests'), - 'fjelmer:classycle:1.4.2', - 'testng:testng:6.8-CISD' - - trackingClient 'sis:sis-base:18.09.0', - 'javax:mail:1.4.3', - 'apache:log4j:1.2.15', - 'springframework:spring-aop:5.0.1.RELEASE', - 'springframework:spring-beans:5.0.1.RELEASE', - 'springframework:spring-context:5.0.1.RELEASE', - 'springframework:spring-core:5.0.1.RELEASE', - 'springframework:spring-web:5.0.1.RELEASE', - 'springframework:spring-webmvc:5.0.1.RELEASE', - 'springframework:spring-expression:5.0.1.RELEASE', - 'marathon:marathon-spring-util:1.2.5', - 'apache:httpclient:4.3.6', - 'apache:httpcore:4.3.3', - 'apache:commons-logging:1.2', - 'aopalliance:aopalliance:1.0', - 'apache:commons-cli:1.2' - - trackingClientPartial 'google:gwt-user:2.4' -} - -task trackingJar(type: Jar) { - archiveName "openbis-tracking-qgf-client.jar" - - from zipTree(project(':common').jar.archivePath).plus( - zipTree(project(':openbis-common').jar.archivePath).plus( - zipTree(project(':commonbase').jar.archivePath).plus( - zipTree(project(':openbis_api').jar.archivePath).plus( - zipTree(project(':datastore_server').jar.archivePath).plus( - zipTree(project(':openbis').jar.archivePath)))))).matching { - include '**/*.class' - } - - from zipTree(configurations.trackingClientPartial.files.iterator().next()).matching { - include '**/com/google/gwt/user/client/rpc/IsSerializable.class' - include '**/com/google/gwt/user/client/rpc/SerializableException.class' - } - - from (sourceSets.main.output.classesDirs) { - include '**/*' - } - - manifest { - attributes 'Main-Class': 'ch.ethz.bsse.cisd.dsu.tracking.main.TrackingClient', - "Class-Path": configurations.trackingClient.files.collect { it.getName() }.join(' ') - } -} - -task trackingZip(type: Zip, dependsOn: [trackingJar]) { - baseName = "openbis-tracking-qgf-client" - - from (trackingJar.archivePath) { - into "tracking-${project.version}/lib" - } - - from (configurations.trackingClient.files) { - into "tracking-${project.version}/lib" - } - - from ('tracking/dist/etc') { - into "tracking-${project.version}/etc" - } - - from ('tracking/dist/tracking.sh') { - into "tracking-${project.version}/" - } -} - -task zip(type: Zip) { - includeEmptyDirs false - from (jar.archivePath) { - into 'datastore_server/lib/' - rename 'datastore_server_plugin-dsu(.*)\\.jar', 'datastore_server_plugin-dsu.jar' - } - - from (fileTree(dir: 'source/core-plugins', includes:['illumina-ngs/**'], excludes:['**/as/**', '**/package-to-dist'])) { - into 'core-plugins' - } -} - -zip.dependsOn jar -build.dependsOn zip -build.dependsOn trackingZip \ No newline at end of file diff --git a/deep_sequencing_unit/createInvoices/dist/createInvoices.sh b/deep_sequencing_unit/createInvoices/dist/createInvoices.sh deleted file mode 100644 index 74d82376726..00000000000 --- a/deep_sequencing_unit/createInvoices/dist/createInvoices.sh +++ /dev/null @@ -1,4 +0,0 @@ -LIB=/home/sbsuser/openbis/createInvoices/lib/ -CLASSPATH=/home/sbsuser/openbis/createInvoices/lib/ -cd $LIB/.. -java -cp $LIB/dom4j-1.6.1.jar:$LIB/geronimo-stax-api_1.0_spec-1.0.jar:$LIB/openbis-query-api.jar:$LIB/dss_client.jar:jython.jar:$LIB/stream-supporting-httpinvoker.jar:$LIB/spring.jar:commons-logging.jar:$LIB/commons-httpclient.jar:$LIB/commons-codec.jar:$LIB/commons-lang.jar:$LIB/log5j.jar:$LIB/poi.jar:$LIB/poi-ooxml.jar:$LIB/poi-ooxml-schemas.jar org.python.util.jython create_QGF_Invoices_simplified.py "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/createInvoices/dist/etc/service.properties b/deep_sequencing_unit/createInvoices/dist/etc/service.properties deleted file mode 100644 index 5ac20ddbe85..00000000000 --- a/deep_sequencing_unit/createInvoices/dist/etc/service.properties +++ /dev/null @@ -1,23 +0,0 @@ -# Config file for QGF Invoicing -[GENERAL] -facilityName = Quantitative Genomics Facility -facilityNameShort = QGF -facilityInstitution = ETHZ_D-BSSE -mailList = mail@myinstitute.ch -mailFrom = invoicing@myinstitute.ch -smptHost = <smtpHost> -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = http://<openbisserver>:8080 -openbisUserName = <username> -openbisPassword = <password> -connectionTimeout = 5000 -principalInvestigator = PRINCIPAL_INVESTIGATOR -sampleCodePrefix = BSSE-QGF- - -[EXCEL] -defaultFonts = Calibri - -jython-version=2.7 diff --git a/deep_sequencing_unit/createInvoices/dist/log/.gitignore b/deep_sequencing_unit/createInvoices/dist/log/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh b/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh deleted file mode 100755 index 05c34e7514b..00000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython.jar org.python.util.jython $JYTHON_FILE "$@" diff --git a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh b/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh deleted file mode 100644 index d6046d92033..00000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/createSampleSheet_nov.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet_nov.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython.jar org.python.util.jython $JYTHON_FILE "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties b/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties deleted file mode 100644 index 82e5adc3f18..00000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet.properties +++ /dev/null @@ -1,55 +0,0 @@ -# Config file for Illumina Sample Sheet Creation - -[GENERAL] -facilityName = Quantitative Genomics Facility -facilityNameShort = QGF -facilityInstitution = ETHZ_D-BSSE -mailList = mail@ethz.ch -mailFrom = SampleSheetCreator@ethz.ch -smptHost = smtphost.ethz.ch -SampleSheetFileName = SampleSheet -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = http://<openbis-server>:<port> -openbisUserName = <username> -openbisPassword = <password> -connectionTimeout = 5000 -illuminaFlowCellTypeName = ILLUMINA_FLOW_CELL -index1Name = BARCODE -index2Name = INDEX2 -index1Length = INDEXREAD -index2Length = INDEXREAD2 -endType = END_TYPE -cycles = CYCLES_REQUESTED_BY_CUSTOMER -controlLane = CONTROL_LANE -ncbi = NCBI_ORGANISM_TAXONOMY -externalSampleName = EXTERNAL_SAMPLE_NAME -laneCount = LANECOUNT - -[ILLUMINA] -hiSeqNames = SN792 SN100 -miSeqNames = M00721 M00100 -hiSeqHeader = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject - -miSeqHeaderSection = [Header], IEMFileVersion, Investigator Name, Project Name,Experiment Name, Date, Workflow, Application, Assay, Description, Chemistry -miSeqReadsSection = [Reads] -miSeqSettingsSection = [Settings], Adapter -miSeqDataSection = [Data], Sample_ID Sample_Name Sample_Plate Sample_Well I7_Index_ID index Sample_Project Description - -miSeqWorkflow = GenerateFASTQ -miSeqApplication = FASTQ Only -miSeqChemistry = Amplicon - -truSeqAdapter = Adapter,AGATCGGAAGAGCACACGTC -nexteraAdapter = Adapter,CTGTCTCTTATACACATCT -iemFileVersion = 4 - -configureBclToFastqPath = /usr/local/bin/configureBclToFastq.pl -failedReads = --with-failed-reads -clusterCount = --fastq-cluster-count -clusterCountNumber = 50000000 -outputDir = --output-dir -sampleSheetName = --sample-sheet -baseMask = --use-bases-mask \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties b/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties deleted file mode 100644 index e8f710e8d66..00000000000 --- a/deep_sequencing_unit/createsamplesheet/dist/etc/createSampleSheet_nov.properties +++ /dev/null @@ -1,34 +0,0 @@ -# Config file for Illumina Sample Sheet Creation - -[GENERAL] -facilityName = Novartis -facilityNameShort = NOV -facilityInstitution = Novartis_NIBR_NGS -sampleSheetFileName = SampleSheet -lanePrefix = S_ - -separator = , -indexSeparator = - - -[OPENBIS] -openbisServer = https://localhost:8443 -openbisUserName = admin -openbisPassword = admin -connectionTimeout = 5000 - -illuminaFlowCellTypeName = FLOWCELL -index1Name = INDEX_1 -index2Name = INDEX_2 -species = SPECIES -sampleName = SAMPLE_NAME -operator = OPERATOR -endType = END_TYPE -readLength = READ_LEN -lengthIndex1 = LENGTH_OF_INDEX1 -lengthIndex2 = LENGTH_OF_INDEX2 -gaNumber = GA_NUMBER_L - -[ILLUMINA] -hiSeqNames = SN792 SN100 -miSeqNames = M00721 M00100 -hiSeqHeader = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject \ No newline at end of file diff --git a/deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore b/deep_sequencing_unit/createsamplesheet/dist/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98036 zcmdqJ1zc2ZyDrYq-HpHif;2O9h)8#bNDnYHLzf_(0)ikRA|)XqNJuECNC+Z`bSX*- z2oi!cXAPjD@4LTu@ALomKL2z0{dDG8Yt4FA-1l|Ybw7v8hs!7^D5$_c!{bjXYkOOJ zE4aHS%)`UW9d2!J?e5~@X$3<;0a59vPsO8P81f21#86Pso<c&=>L8)0**R#aAXHRh z{P~ZwR3i$939}aabgK|C2mvMzXQWc(cLERy0|NyDhvGqSFwykUG09N%b)ggxGUNc4 z3||hIQ5KjHtc<XN(m<$?oAJnqeSCa)e_RZ&m5Vd<JcJp!3yqBK=P#sBE)uLP2i5^D z6D%tYVW1*_2t%Pz$jP4(6@dUS`Z@fcx{Oc|^VtUg!azX_1reb@LP5Bwp&$^-Lqdw4 z8QEZy%BYPxiyb%8g7OKr+tDT8dN#pg?1mQj+reYS6e;|$i;pYW!*AS}$i~GFqq>%m zSaxIHPuBz*&bdXD&M)l!=EM7o5Awb`>@ltDz$UZ7!;DjvqleVieWb?bJBHLkjf&m5 z!aI&Z1CK;6HPf}k35<^LQ6I7sRTqT~wIJkPz=TpM53gp%dOHuV<*5>I9pSl;Wm)vz zOcZMO)sF(_zMXZ(?NAPYrVBVRFGTh78|6JA3nf_=qq=uT+&y=0H-B`H3hGrJah<tb z3ZxLZ#qQTpIW}{Jsx|N&;iH<QLWAn2s<h>jqSd;#2U01Ny+^sJOW5YrKANa#AQaGj zD+mli2)tB!A`s{Z9UTy)NC**fOokj|K+u2>2t9HGAvz^Gx%^UI#kZucP$-XfY*7)@ zy$$CMA_yaLHw!v7gfjT=5BOaUf!6>+$s=r>oLXL;cK5huef#-$cbgIZ85u9j@~EZt z!O;%})!A=)$k`hR(kx6!)eL9)CBu~E4bz0|X&)#q8npYBl8)Ghgii+HT)aJ3&&CaI zlB{Nr`EGv1Je3yCxB&ke^>MP<R=L`AsS1a4iEY{U*>x$djXE|VXY&|Pt+H`82;*+4 zBy01V+Mt(fE|KlK)^<xFJhzu*>UQH8-dnCc)3U8|YT8(1bi^0Nq6`uVC^mM!wnnO8 z5jK1Q{h4Y{+Orm0PCJsx;CXxjo9AQ%<cN(RMk`{5-FP}yXQzaMIvA+3?><{DvD>|e zQ!P6!ceLxcu&{f0=d`Mdc5&tT@>bW6Rh`1q-OIz%3XbrEyIVN{`p$0!v$sE1^!RC~ zpNfuN4hcms0hB%IM9~R(9Z*0hsEorpOxz?U5@)3xspj5i)Lc#;dJaMhydOZ#$@FBw zddLZ7k0%5xI$J71nIT~0UOY0IKlaKZuLsNzC^VE6!h$>ojqKcicnnxs`9$v_P$)lC zP(V~r0ML7WAt=89l%HQnOi0Y=|JZf?6A+XJN8P=-+7b{o{P}z+N%h6|vX(2`E%IZZ zKjoOe<E&atwwtW!7?NFR^|~6g|A~GZ>dHbFopqtX|3JL2vv`4=FYy_gPP20N*1-(6 z4c?U-c``ZmgF*HtiTqV*1g}*l6fU9a$LLPe8g&V`V;OvpdrR_7?J2|+J*8kvEbhP~ z1p9i789xJaF|)ktBO6}Gn{4>Oepg8G+DD0s`;qTr7F*^0v`otvm^_ozW3PrL+@4-g zS({gWL_WP~*){0i#Msc6ozwkb7t}FIFgdobc(1xcZ&F!hjj8yMT4P0NfadAf>oZgL zx{PZPN7LO#^PZs?Pl8!RyJqaODx^zj!#7WWAQU7BKqKU@%Ktk$V4eYk=~6wl;M{Qo z*}7XQT^pg-$V{+HAtB3vtk5%}hs;7krXV4cIUy4{A)}E(cAlQD;(UBan{r0#d9C4m zR_;!G-u!%?R_4b#V9sxD1v6Jx<^{G#hGaWg!~TQc$!bXI$+Gf8&d4+{I+k1DlOOqA z8u(9HnOpPk4n&GSx2C@2v2_KEp9i;`tmK(XLk_LsQb<c|Z)0x-^Mvcby<LD$dl!V7 zy@#iiCCmdZ^@s8uV_V$tWZ(*2FmZL*<~Yfsqw0es>e265Vw>F0FuktX=~A3qR9QCL zXQ?8~>Bl+R+TwMTcJu3=ay}@(>KH*^ufd$LY$JwHy*;PDk4G2l)2vHo6En&_6uTj> zVpVtGj|VfYcYf9~VeHqp966h({>;oXz+stElrhLK#E5o@Kbog%L(C_*!mJkN#WBvJ z9{pO2y(^-xpE&O-qCZ&=<yxLXN+d>RF-`g`)EysX%69bf$MXXIF5C?!rSN;)W!{TI zcQ(@+h|Yg`<;}znFTe5`E80uNAg2#QJbx}eDVlp@{Zn&0Y+SnS)!pxewA%77VU82l z7pUTl>c%|TyVGWxPO;4n=Hm%>b%#6KdpUc+-Ms;fLpm|6n!|U?e_|V&IDl)yXPg*e zQs&gQY0(03ZlAf@Fpl0I4;T{Ca|Ygwq<?rZ*kt%u;2r>uBEYgRS2&auLX5;LEHWJA z5Ul6ogMiXQ=#blR$;kDNuMI5gg7ENi^0Y_Tf~~Be><~8OZagwZq%U;x&VhFg)&;H| zaL7Esa`xW#9>5kT)3M0|0FnCiL|P|zd3-3`9f_I9ll^eMa6ptar_X`s<Uw5aJiY*= zQ-y?0F=2=(<kUez!X^|L0LXa)oBz+<a7gyqcZ&4OLgG;%Au*^SAt-&q!Va;+FO9Rt zLZmGdL|2s2^@n=Do}){lRQyV<BqXl$jmrTuL4t45V7ekQK8xymRt?+>RsCxhP9Br? z$lYGs-X{b}nB*P<$z5rjD48Z2_>H?1I{WK#h%pis1a>wb&-6}-c%(<Ig05jl3`SEJ zNxg?u30C|!8TI+g_s)r&U?CZV<gYmRhZ6%_EIhF+n#f>u4k9?f_NrHFE$M^ffLJsR zb9<px7~1zcJ|k7L)b*xT8v`DDPMLRn*HnG4)0}VNLJi+;WFEc2Je;%d_T^R-c&+|R z<*a^inWRpK7~#v+7Z{pDp<Z!K=6w_185pFU749t)tbzIJH>nCfMg@J!F#2RMVa;+; zhFASW&pdqWJv=<@Z4s_c05&1KoNWOw0?;$MCO5q=KlKcw4HAmc4Cq?%i4TFTQH5fQ zk7lZQ_FW*o2jw&BC9Cv9y?`J=7dekEFb`N-5y}E#Lh1?{8SSslTBq{^;t%ElEApQP z0uX*7h^T-t1cD3%grUEN|IVpGQUB`fqavMsRKVFs1);p2%tM_T+up~bto&e6@*&m4 zn(-B1;9J{WIhi4EtCaGk3U}}gdBsRe-^d}b7~8k<`v)xZ1(}bTnP}=nl9^v<Wrq3> z45G`Kbk)4fPI`8J#NU>A%HDhy!*?KR)Xi0ZRktQef+LY#I743!VwWG57DT|1>3u|T z&ms*a{ze4am*8iM+z4Xrq&I<s_XS3Vls_19R%}r&sro1Kr!_peXSlX~MH!tT&lJ=3 zz1#TC``8S+xVMt`)qA=Eww`9@?BevWSXM0%FiyF%CuEn|fv>wrJcxke1mV5<3}2Y` zCB(6X#0rM)nSOk8FT~k$1)Bk#TjTDR!(vVI1AE`EIE=Y9&v!SzCNijD#4;>iyLGK) zcy<rc=tM_snEsvCyqAL?jZ8ru<`AK#<H?7~=ua{gp4NV6!#QZ!HY||LZp4k<Xr$-; zXJYb<LuZyK#7!gDi-YkvC`BcWkDwyX9pU5*#!d28U`JKYxTbM&!sfR|lnDjt>)tU{ zWTX;!K0aknXD@Q7B)Pwa(Q=uoO@(>-><TGei%^fx&~2UceVukoiA$af^!*%d-ZJ$Q z+@`Qym&W)j$r1wtg*^;wIh8%72VCqKnsmc0?&JBb&rQ`f-}|T9uh<38&8I&Rt~*35 zb2Wjt;WT6VIDxDahcHX`oj_{TuU0j^dlj=1R&lloCwd)H1_>$tBizCKtET@7ceE<r zU`0_Vx`?*bz~6mHDOs4zeDhnl^S1{m0IER`Mwfy}LL@M8EFwHXS3$rZgcrh%iOq!x z#Nt?}AWHD5N8}E7b@8zGbaD6N{i(`G!@&24W}+eG7(1eHlM;Vlj<(tA<Bq-p_P*;m z8TQnhb#2YkUK%)VezVT0uT=}8EqWoI^{=rfY9Lvcu_ztkDL$a`{5m1LkTExkVoxej zf5X>1e0wk8-toquhU*_fC9Uh9k$c|9)$8X@p{5er)OM6g$V-KZ`8ul37Upd0PHGb; zTh0gbO}+crcvD!xN8n5S-pvf|7<DKK5nC4e(>nBcy!D2Cqk9sRb$lJ^rH41PuJYcO z*yk{fZC34^x<N)?`TVI2z0P}$5ppx)b|}_Yw+r9t#Be4;7h|haBFzpq$4sGxAEC9k z=j4<<+bCzhGor!R+d8^Pb7WL^9HX)0Yxt=*ys}$^P&6@8GVfENwp8ohEdh&haM|qM zt1zoh>U&)HiFSua+CGH5rsnZ-jAYMV@jW3Kxyp0o9wBczK|&eOL7oKX@X28HE7MYK z;a+1g?U1KS30=(CIprm5Xinm)>No|2?(GJSOfniQtmJm(-naqySgzJP8GKt9Vr=dB z2{b{nW{7Xb6nx__(>Yr{DeT)j7B%V6G0(N|WH)v5JqyEkd#%mRF?mnHjQ8Abb@AUN zle~02Nk^zG>2_W}^~-=)ixu7&l<#dXybL^t#muyE8JA8FOOEVixWmm!8l&eyOY~E; zqVG&96q6i-A43W{<3~!NA&iqRZAAK$iz6ca;C;uCPxezzJnWqSx9TV0yQ=y80(=1M zF`59tFE|B!O}YU-y{CMte~1-C@jnIlzg(VQfUkQz``^Mnzo770xJM5EeG~l?*tf1l z1@-$vzl(Nmx7?9!eD%FiWM0GViE2WD2fYa*y&UaIxu}RNAC)9yM~@wGvu`;K8W-^{ zw_n)S=LWk5{dIJ?BC(x)^jL<qJoO7ZF#jiYvw38-OR!75PVeUScFmUQYqD~LjB}H^ zR+W<uBXBV;&5hzsX+E7u5!t`Bz%Ru7j!|6WLd3mC6u0@uU<8Wl7Bb~Yil4)bv<w$+ z#5S1bPQ1UP!YFL}RB0xxR%A&@yn@I!fePz0`s=R_(5QhIwL7=n{B5o4Yj3H@_``W2 z4)~jiD=Bm9-JxGbb5*`<RjJO(N6b0<CZqFahB^xuw?eHMBg61GzX{>`cIv;Cex$en z$-eUp_5d@yf&H4f=qO#W=%cV8kLDH$CC*SHrn~iT9tgFB(}h)EdX}GJ4-$_-@kJl) z{C0<?)F99}Hd2h@Rz5K|4u7ykb@B_&T57y|f$_@g#415Mg9>~!N%!v*v6VfIyEsSK zsE9S;p}pp6&4;~Hqeu^Nl3U~uiAb`uX$%uR^cUmp*IH%VGqb2IF5JB!y>^${eSI_B zQ>D|kRj*vhdNS@E;t~BPtORU^JDF|^Y9j^T6-gOA-)Uz>ZoJH6xs2yAu39+nff?7F zv(S9COksD9Z~LuVrh;=rD@DAhADX<<*H+VE?3E}n=Ey1nB175lZpBKx2a7|D|C?Y> zmDAlkBV8+QEYT%@uj$;&^xa6q-@yKF5BNK<2a;z04zTxV5BYeZkB8`E3S=rnI!KG# z+}sjY9O+<Bjqj;EWE#FGtwZf%_)yCL?9krCZf|&N;ueWeu{eDrZGlDB2xE}^E&I{H zr@rpZm_(dC2@$TavYc+bdNB@zaDI)*r;@Flqr;5uD~H;-%+i%^s8+P0k1R{gu8=ZL zcD?t?d13087)SR}YwiQ|Fx}tPydZJp;WlcmOTWeY%c{(6k`KkNWz*6s-trT85<0<e zkCuvHR9$sDoVIn(seEn{JF|O-`BiuWT|7&g)H3VGxA3Q%F!ZnQ8LEt=nT>L@O}RfC zcRCm2<NKCav>POVjPUIm?P>g483WTWp0_QW*ESm%RMlM`Wib*)gWqpPdngUrP@s!Q ztbjirtel}V_VuDqyXJhgm@~ouLrYW)@f~Fk-ww$pZ6Qz2!L>kpI?ksOO|119Mw0HZ zM4PA;{2}!L5>GsbLp-$o`}$X64pq9!jj1p?*5g^Ax}tqN4pN~F@z@UE&7?gMEhK?h zWgHf_q(om|Atq>o@VzRSlg=3{$B4?v$%i|s;o!$Ssqb%ik$eNP8$X-jNCDEYEg7>k zxD<|U)7L6|z33A0e)PwI;8~QWk_`>a`_~+HEZwJZG?(rYf>_qFp9V}!IFY2WR;|}q zk@sP8+Qx-#_AFwJWH>N<nZbR^skVe;A=dNSa)cLg4EBU4q2g}=^r+{xpE!@k24Flh z;ONGlRsjU_kG3EcY6TYssAO_)+j#wn_aUuk0RR6`0DW3xKqDhQ4WN-R_DSH(204E= zaHcxBaUNtE#^b*fHvhkIoBt|U?$6gkbQ~Et&b>9QUBtKZQp_uPITp^k|KOXV_E^MY zu;=Ya1|qM{1#H+RrZWUVL4&%W^TKjm{Z7`D1HPPS_u;c?YaG|M!%9bvT0Z3tiGd5~ zti)-2^NG$c*k$evtI2+7*<^Co%QkH>{PbdG)c8^TM2-KXu=vZzHq4|$Q3U^`VENf) zduf;U@#doESTE#fdLPR&sHF%9EttK$#J=@_Kx^=53ZH0S3-xCCt%iq!H{!D|xRubn zQ3Y(`0F@&t?NGb<P`BApjQ8^qrID*m*f(P6uXM{Z=sY3K2;ZfSG5@>+5pn=oG~5Xe zi@-&Ued|mx^WcH1Smk)GGsZIaaa>wDRwf#_o0q)}%+~{M1(ep{mR=tA2)Kub6$}dO z-tunXUHqw6sF8q9g#szjr4zjZp`TSGbRbgJJ)=iJIqg@TUH)VeARC071zA+%g(AiJ zIAEs#V=r9h^dbO1iU)d}4HAP011TUuWcdu44T78*{`XA!uY|0JkEW5T&gVmNvAGce zm8Kvqe)>1&(W?Wkb_%OCLTwRf;Pwjn0w!&F=_N`-VSbk>Elca21MSR`^P}JHg>gpV zGWC;+3OdE3AdGTGWmagJQg(FI^o`nxL^Tz5ows>~hUf#9rdA($1$Pval|768Dvl^M z=M=R>eMIVim{5pzB4joYYX}JtOGPSyBDZBgAY`Qq1?#V&+u2f-iZ8zo$@o=DVYA6* za^cGkiUDf5XR_CSyZcO%2YAJ3K$6GH_`zK?lDP!~weFo_wHE{#8*kwDbFAKPuGS6d zwa|CpDWiE`6EXNva^DhM6s~FrUz^%VVUpS$2sC6+jMBSgnEUwgHs@Ej`No#5N@azq z;T*?VgKHTV(gPGM$>%%w5on}-!J_m^q4E1vhn%Tgk1Y!eC7Xhhu67%7hE|FA9m_4T zo0p3>%-Y_=9GR^K^5Z~$CosdKH~go#Vps$2z6D?klupEzT<(hCdE=0nyF%+d^;{Ch zMQp2H>}Mqy50GG`GZHML{-g4XOGd2i<zj%G4y<PHZ0`xThB83Toro{R&t0eGUZ6yz zD1a1ODF1QoM^s2mfFBTB!L!4E<4phL{O6XlR)MG|u0%^IEbUZGEwQ*wWxRvgFqxNB zT+p6H&`}QXT-SP}>(k^bZZTzzdN&~Q?hx(GhewPQL4zp_q+N65;poki!qt@7H>Nws z(*=7*1gO{*_KP}K`)UT&aom-6)}yA2$FApIcdQa;Eq2zCE8BjC*qbQyxRnSiL?Z{U z&qv*le)upa?x+xtRflz+5;WLVFBF1*Ut;ysr+p*So?tiUZROHS5>M)fgF$-*OUBi0 zW)_^#oC=Z8VDan+{M`6&aOnH9Zkjf#rLVNn+WCLcEnFZMx<A<+oQ<!vckbKTbCvqt z!8kXSSBwu2r8BC-OxME=z7|}O?csPBSE~QKb<Y^|o`osb5anh|uLIdK*)%Cv@PzGL zN>w)lGlFwldSLxEIad4)ebRRO&H6|?K3%g%eI-oI>2r{2Tm4se5oI(F^b6%Nds)QC zm*A$HBqXa6ny;O|3AVb;9HAI(nUu3wM0l*t5LdF64<<b&YsUX5HdZ5c<#DM{i93@- zn9w|Q@){GOo*(-<J^w8V6-)QG(>}S4gCum`AY1H@(s(UP6o~D7n$f({im3}a23)8& zxXI7&JeNUz&eqYM@DU+;U6*HeIlVf?$}VU}=-Xs;n}tx)ivas`Fra|F^Z~Ep5<0Ow z+)zujLTUYKE#>+}f<)AIS6<M=ixk5rcp(G1{8w=Jk1JWr^Df>-&n><v8@CtuJawmZ zyW1-Hhq4@}Uv5nXOUdE{y1o3qR2`l0NxQ01(rbs^w4?FPU4PS(+1H<Nzkjak&wg(U z4SWJBdF3E2kvM>DQf1+gxZ2T!X1No)yocbNz*N7;K@>xI!%$6$=yN!1@uGX7&x}lY z^nF=Fzrga>1-b;qlCDi)8d$!Q=)Nrfr)I^Y?JsL2%>1dDFSm^CQ~kmCveFsGTUTkK zKj=q`Xyf^s;4<8oIe2w1n&`#4FY0-{<cgT6=uVYj`o&(vB^a;pQz60&sRuTK5-@j< zHA)jjOg&|kYlftcaKA<zRMrc4IV7JWowG1=p%3b0Wa$crWiy1z?U+Bb)IXo0lfJAy zpBtDaKF7yMGNv2M9g$TkL_E%H?$BnIrn}CMiUYZCxJm#TbZ@T=u=j7-6qbJjLzt=E zZZj+YOlTJS{CoGu<y=BKffYUKL!xJ21H&C<r(M&>O}(lJu3|+{u!s$<O%}5e4Jo~< zE@a*m5HU(o%=UjmP2qAhL~b3X+=pw+G)^RBWx>uoU6~Tr9Z~q6k7(Xj2l13IB4AU+ zW4`UuizX&g45|G(G-Xud4%WFTJ<(0Ss5pAvDvbz#Owm`|+uM)a<5_2YbiSdTQ!3Ol zj|M{!>!Grxl4;@dx_eB`nncVQk@Z(Ow-hC5qIo_?e9HO~f$dP~B-ly+MTtwociE=( zrk{P-hoHD)FsAqNM0f#isg1omP`r1t2de2XFHbwTGtA!U7@2W5xr1YWA~Sj+P`%Fs zkom@`gD&?BKUNFnd<{vzFe|HVXUthaLuTMZ%Fn<u;8>iJcCZ1`jvkZ>LV*NgEHXk} zn3E@14dw_3%i4ST{Xl43G73FAI9Oj-UPn(yUsn&T0r&KAad-Stv%({zK2wQB-o|ms z^O)Wv3=up5c^-W|4Ibnv6p**bBYS+0U}@w{B0Q0$P-IyQhOh?9Bk%dtXAyyjK}GmQ zg^)fAR19)F6c82?HTu8rhW?2$P$d?Tzka<`TEbF6q`bS?!mCjXzN12`nAh+|>5W7B zpt=xEL%z&xkMh(FK8AokDAp^DnlS5oyc~mh)~yju5!yn2`5JbK{^zdcCq1BAPp4Q< ze$$!HpYjx66VjBPgBJ_fsXT>U-^M(b(yL|#d~aWmIhXJ)mE~4Dl+^Ls3dQ<;Vz7^% znp5b`DOh}l*W)dIjqvW`{@4X$Ne@QmIVD)T+J=4Q175n?0VtTeG4#gGe8Pg^7}<SF zqY8SrVUnw3PofAab~iq~T+MH@jT;)$6aRpl{{+pa8s2fh(C=wkLjBq<nIShKa8nW9 zwXJ@I-Lp^d2vWPUWeFjV<6b&VurxqIY9V-l$j}oVGl$y$3c0^h=`o?U*IVzgxuU4n zXekAJkSs?>T!$DUf6R!k4bg<C=cwi=M=G8QCs6z6{Y^Oe{!S!+mq<V$kL3|b960gw zSkWmV<UdmGXsAEG{pQL8DtBD9uXKi)7SaX<l&Z`?_H|uY&$qu`o`RZi5w5Jj^j**| zy%qb=MyGsxW(llTGnb{s>pmL4S#rNxWz685MOyGgXx>AWrW*i#3#X=i7>q7I(;W<Y z@`MY~Q!<=%I8(9ojg6j?Gsp>&BEly?S{C&F)jN_n?ewbN`?q=@Ze?eMB{R^=)GJgt z+N|CUTAW5hoki7dE*TWM=YAP2<_VO(jo3~nYcemQ%>=v9cTQKc@^f83c~){^i}iF_ zpj&ri_5vE+o4tiHXmdpXg(vErmMX=<m;A8dS1wBDwJ+ojM(MBnC!|YKX03SDZuj0? z-)JvqH!fP;5T@F1!RUXDrlJR68wds6%HG2o_yTo|)4)YR!9WGD>kz1z-~wd}bPy*h z3BV*oK@UY={7ls0aeIPf8c2R`usUQtY!~7P?szyh-HOtt<{{h0<PmglCPmIaI{O)O z$D7y?&sWi`%-#D5!FiSYM@k$!uSoKR@f*LOH(V&GpLuMi*$Bq!OLLO!*Z6vc5kI+? z*_~}A8=jq)M4WF;eAl=tm|xTNx|=jj#SO2oxi@S2-J5&KHLMu6zbd`IoA{NtL7nk& z?ZXoACbmvt#N&L_PmgaVamdWRb#B1I9>tkK33zI>i{`<VtUOVfI_+a2>sunWT!+hV z$I`^XDY7T(W&MgSXnz|0(UtOXiv8F`4Ss1tSJLMchx$@)$ehW>=Tx@z>0gY;q`oOI z4u0K|A)-U>%XZIv#{`D%d~?ul{zb{{BJ*z~U#1usLFXk+nxBJHTHdj4?w@NWCVJn9 zxzH>p?_;q{Ck-jWrqV@#@aV=QEk4?WOsHLTG42+Bw3C+T+so0}`0zaQoh%zdnX*iB z&$tWIDFO6cUmi3Tu3+5Cnny2H5w4C!BUvlZE+o%OdTz1R^lAQCpYn(33PROnq3Z|a z@*sPN4UD!?z|p6n={B?Q0VycDiTq3AZ6XCRS=oL~#^4b;Atu^x_xJkeYmcP#i6m## zQ8sPj7@rUmo8Q;2SYZhNV&S2ZZ3gb%y%yX73CDoHRh#~n$-*4q&}Mmv5^-}ORn_2? ztp`zeQKXF)-zUA)BHcg}X6nOeGoi!Q`fU!C_b$5N0=k_`m!MnOZ#Rh)D7IH9(CO>K zg5-A%bx7W87Cj*TkoWk-3#}`+YWpW0R}CI7xpd;4yVNqZB~lX+l-i+Y&mtTi*zPWi zZ<kWK9xP7vfUi`d^2-KMr@2z_vfH~a#f|R^gqe2+sfcDdUZU{ttf5c}Nj=Y@qxU9c z4@e;#F2wGkd$#$|;)!M~R}MM7$3a_cZky5C&gx;Bg3?m!_MNJ!ehSJp|KWF!pLPuk ziKn7<^C@GZKoR(w2KHdJZ^mJ^Pi^fwss)U-zS%O_p!PEyKF?r!yOJ3q@6T4`dW}A- zde<UVXpYRkzE{MpQoH|VlL+&HppSshJpvGeGZqiMR%0P0O4lTKeVN`y*f*G5FB{i{ zg^5nv;kCi|woxI(Lq|2=tx>vdz-7dfzPe)MK>dLS3I&-qcI?<zmR$M^rsSKW45iAV zlc{SRS3lCvy)K=8R*YvDu*91wCI}xQlyUM}6JQp5NR==Z82N<5j9kZSxDxyPA@P0h z$B27P=2-d@MbJ8!E$TbvqTTozGs5oA;}6T+^X|UDJ?x4gd^n{mPe$#QlTeG3jb*KL zMeeOlsJrGtc1>N#^9w=DmtO{^W@XtudYwf@!X~Y=In*J-CndHZyV0?4^dSTVw}||4 z(YTG6sp-?o>jDvTs{VV8X(><^?a`USChX@JHg?<V-8~I5k6!zD>&1Fbzr5nI_HFN_ zf1Yf7m+FJ7jQkx>Ro)d3dSd~h5fPs5Q20w6i*8t_&Iitn0ca(W{9PG=RR%&M_xX{B z*w<yuJE$gOKf4f@*5FaUN~drb%G<^*qH5jdiI8_wTvB_GBOh>S6qSdTw>pik^DTdn z1$X_T*W_w(W+U6g3Puk0T3dPHhs?Qfe9|k=qLVnsZhXFZAj6z#oIAVH&7k?J(uNPc zY?Cr0S}~VtWHRG&x<!Suz{?phhlKr2ot5|U&JV3wGTCLMj&boP=lU|>$Xx_7L+4MN zIdlyO8tb19oW&294d7V=6pCN|n~W}$5Q2Z=zhTG#^f4zWKs7;*amjGy^_0LyUhei* zc2I(2s|qlY&}Ef%<)FmJC2N3ef#u=~N60Aa9*5gdhzP$3K&}*kK#^G@<WTT*2>I{7 zf`4+6?t)r^`giBtzHCchq{aWf<J4vsw!WD3<-V&*0gI;!zj;!kJAXvN0S@X*m_zN( z6q%p}Y2_RRp3RjDD6<N9GnS63M?#8P=gj=ye%Xe`WaYnGfD(`GwNt#BSeOq_8rfx& zbEn{8$Jq(fwwB9DK3biaAeK*0uBN||>6Q_E<r{CMy1;?{X5sE8yRd^mz!ZOT#P0A_ zN9_9yI%)P~!2|gen*}$iA+fz1HECVc`oyS#{%^h4Qg{;S(P#*v5dTLR!g!6#?eA#w zW=+0LzmLX=iz8opEf9*?c9eT1Y7vL(Bbf3i>2aS#TRdiF&zn)rOH^@dBJh^_(!_D+ zBAdEn7wHedICe8csXHV<=n;#rx9MtM`IE-Py?A^8X{YR0hvu7_(#m;(i&V0|YdF&k zJs>QLO`R>{ooRT0GA^*IK9vvS7BAysq20gqK1PhdL^zZ)$bM&cKGh-aTBqv(6Rq&K z<a|2K2w}EMw~Tp6OEV1BoH~_dTVs9DX1XhF(MblJHP{c*%^BHL`sKb{dLUx`!6{_S zr}WE(*uHMVc!oxd(UPdCw^wKPMjN7tS`w?2?#0Bn<2Y)L5pY%WG$8b@FT9_ve5Mc# zPcRe`UZ`=2TClKnST{~9pF(|kpeMSsLs=%l-4@2ueokbB^9#d)-0fl~?goR|UcB9x zUai#X>op&-Q-Y5}DC(1<hAZ6N!vz6zvH^0jKcgpB&DRZp=kcS-;fKPVma&ORC0FOi zIGGjmMPokRSn0I=;~7Ij-u+NGK>Pk{<qcX0^@%Q$oK_`%@dN)0<iKA|5~pX;I=xG< z!s%@SnO-OtgyU?P<J^x&!Smx;{I%ABWCb4oov8a+is1i)_x!JN(gXIx1CMT78@nwi zj^Jz8F1p`(6mE8%hakb9bTWd~i``RPhTG~wc8b61*Fc&m`pCum?;Cnjt!ZD9Bjm~g z<`O=u6S*;77A-`%ALYBXb34-P;o=K3@1;@l`=*F%0r&-~`azg996?zbY=aI@MbBe9 zq`#^hyPtmRz;ArksP$aKN&NGlWC=2)TMW#u>sdUKqz$oF{BC@I)TM<3uc)s$M0u;l zIf9&BUJmrl%_N1FoQRg|U9n@cxveDSnmf4S8Rct2h<RsMK{9uXtsa9r^9>enr`z<} zI!^amKPsXQzj?kI>`#qgov?%r6&^Oz2aQ%A#GA+y8@0o&GnTkF(KLsYEcbYi6%G#w z+>z9Oxc6~}0=yja;oDCgLr(#`{9Axw^E)+a@{U@6<=s9yqgOyy0vTBy8!iI*lT&k_ z6gq&&AGsZm41%P3pH9n*fP3=EYUzT3l(Id-%EjH)#T_72TZ1kA!0vDxxH}wS1&1;o zM{U4QDcP+!z{t7>`1f=3K)8_SMk70ay8X20=r_79GAML$2T~$PD~W7G;uitf-~xik zq%{BOPzX7Mg#6!kOaEkcYg1}vWp>-0IbD<{Z>x!2!B}bWBayZfUjA~J0ZPafW#9i! ztYE{d&Olp9tI_`MMN0Ie&Le270NQw6nExekxY=@*0ejK*$A-&pB5hrYglU|1FPKv- zDaI8?H+#8`LRC8-UizRmo*1kpg>xeu<qHH?lDd2Efb(hwO9~aYd=?`@*3TK=B>hmS zsEtL@#Oweu&rq{vC;u)o%sB5xeC0Gp@FA;P^uuS331vE|swLX-Gh|Sj&l>94<7L$j zgN<T(Zm+Lh3rc){oj!Op<mpwmmn4UC$y48hXW)B+B7_{luId${k-S+!S1Pio%9qY{ zu``+1o*S9ZLucOU9~<d9%}hLkggpFbo*z<}=!ww*zz!xtO4}Jx2>~|zE-Ys&OLmDf zw)us+!LK51^4Gqr%I<|XIiIO4{Rg{`>EK(}v7}MZ0gsLj+dzaDDlW(iK|@7P{KJYJ zdkV<|kVnI4V9wqhtIxOaF~G&<G_U>LH3lljdsFxHjA*#=vA<U}Mm)F|<Se06%{e|l z5FTf>MbyOxx~1jx&76EH+4BWi7DQZYy2hgI+$ytNyqjWK2W{uV-3$~9vLn|(a}srB zx@rm?|4zNJ=l4=795Y6;7S?8D<EKdE#Gh9*g~@p6#FjiQ;&{7heGXUsU1LdEHfQfq zP|(=*#mZ#}YjgORV4tyXn8BA!;TE<jk}X?h`lQmhy``gTD-kM1TEVMDCMvgi%`xs= z)RF$!U1RkYB>N;YY$CxzV#BDW#=m?FFHzL%YY4qf-}fu7!qw0B*(=;wBaF!o8G?*z zE*=9H<=JGb9n9U@2j&hx&9d?YN&LbvUjV~A0Sq(wYnGMs5RQBB#}kHxr2UR(zr6JS z<}B+e%At`_{+`lOI=#6w=~Pjm3XFuU({!pRRE!@9TmQek@_$07%I__rQZ)~P-in24 z+x9wV_Z=B-%x80bA&Akt(;#|>^7}_7Kc$yXVV<O^^cNl62QL!aii<6Ck#*ZFrQitU zJEc{AZvWEk<(H{o7GK)yaL~Z1PerU(O|zP@wN`0bTjad=(T&P6FM1DU@{ktlgP#Gq zR>?oj1;P?Vv=o@JG|J!g*J|#BB#h5;UF$dA6S&NfGnh`*7#r0R({Gw{v#O+I>!y7) zX4`HI(+2iEdtMxYyBq`xL~(DF1s~aKH|=0{+dZ^VYrIqjYr>5t?3k2X2|!o7him3| zYiQ-wGJAZfdQ^-@FCxE}fijl-leZjNkX6}Cw{m7%(zjCnTqWcGoxEwTyEz*jd%A3j zDVE4!MCv`&z7~0i91^)0(E)xjL@Y-nM<`O@KbbfEA!NrnQYi8)tmvE&_Me$i(9dre zKfhuA{D$?15*@>oA`Q_8&-OcM75fj_&Ae_d@z}0t_;U^8A8mc;($B;Fq^1W?ws6cQ z&3tGU#=T@z{$hsb8;TWu{R^k{x5`h|lU*<iaha=>EwMF@Iy%U!qA5-1K{KQ&v+{z~ zvGz@GYa$Z7w6m^@i;9ygk+$y@Nzld<gkA>7lGus4F<mrTldsQ#8tKt#{E5BOBvuj= zU$+u6QX;&*3T*eg7&D|!fAsY6^uLjZ;Cb&oBnAmxEzQ(f=X_P6Y!>*+ZZ<Te!{Nft zg=o$}L#-6XRf%&~o?a&xv*gO?yq&~(pBeushV8mJ3zy<B1%0tYmNo&Wc2>yFfP|SV zX%I1gCd1Qv+cpo5VT!=Y%h?j{#N+DjVhsVvB%te8U=kWX(Fx-#P@P`_5UT$Kok-D4 zX!Ux+fmYGy5pMj%!C|!fXCE!HHqZY%JpFRF)Zm^MJOIbY%H7Y^^T$DGWT-mFRd{}& z(OLis0opD2kqlgZpbF0q@JWE7kP!s@qe_HEM)BJP^TIvtuJKyg0d$wY_EDT|n*LDT zbs?@Sl;51O@Cho(=T?w#<~<oJd0!H}0dp1}mez0knEDfmqa*<@)ivr<q)>VXI%isj z59Oyq(rp8*-13WwBlSPjRhEB)x)~A1k}J`*`vug+d8X4G1r~W73f2qTzonJxc&$z@ zXJht+k=d?A&Y4Y@xq`qPKRu$D>xu9YeR}T3+dO$+RnwaU(~Vs(=&7RH-pftv`F%_r zsCW8`mr7S(<+?HdA}2gC2PKAz3O;_F*Y;dyOb*0>bDrOzVXMgQ#$wpzimxQqaXDcJ z6zAK5j9Vu%C0~r+g+A-@hrbL7&?8^vjPF9ZMM3j45o+`y@%=`5ml=+GPIPID^N9wB zqTvCS2J3eZ10(0}iVnXN3iUYibJACh3PCyJFK~2942>9WfAIaj@9!Sg$p4`BOWJS5 zQ*z#Fsyai1u5vA$%X5qs_hQLkwnOxPs3pLLQHCf24LPU11rSgq#VH)P3-G$|IswkL zJFknoEzrIH;}FzH%3p`r|2l*Z5;B2A1rqd-0U(qP{d+M9rE`aSz+vuIc05)tPEK$u zWI^zU427Qio1Gp%_tO5@`!~O2M1~AM_W#|f!T-SlzfR9^_K3eu0Z~KV9Z;Tu$U?9& zF>OQeL8u@gV!=DEZ-h<)UGE?WvUl%Sp9bv@Xm#}fo|C5s@@WE^cl<y@L8zytks&`+ zbX4?^4fK#zlob>&6zPuFm6Oa0D#Y!%;y5x<W*X2~I<%!F)mL__iI%CDTL44^46@0L zprD|mp(sG)P{GFVcJ$jxO3Ns-^(>uvxL)rDysZo#^e&q3N)Nwca?d~ovoXE2?z}<B zmmPR(a*40_$eKY@1*<YRuqq)V|H&AGFfc8L-?P;$F)^l91CMO00-xDuSFUGT;BN1z zo3fd(n!XA@owohgv`+P$5^BqJXe0YDt}!m<2yq9_)Dq8$5$-^?O#A)UH&DR=J?Hm@ zeB1($K&gm8yoa{V&ONQLqO0`!t^^n|k{?R`K(1q>;Pahea*Hv`vonwLxtxO0!Mmtx z(0bi?S=NE@$lA)&sfV5y{SVYr1GZ=sEU-~YpVHt^wvZih2VdI_ZEyUd54~<!VL|5g z;BlSm%7oONjrG#=q8F^=Dyb=Ot<sBvwr~)NmImhsZ!AkqIbiJc-JIg6o8Z;?&h6k5 z*mZ}V2c@NUFIY?dfx?^@Caww8h8k0^*42xNk1g~d*z?wq5M9xfP^kI$q%H0}7+0sx zYPq=QfbKPR%?Ipkda5ef%BkxQFNjUZ-?7IpmS(Bb=rOv9JDZ_r%9^(fIefd>*OF{P zNhP}F_f4vXzM;{R%HR`!>6D|=+G4Old%&2(eN$S#W21nLB&~WmAA75euri9FpY{Na z7{CvF0BygW*aKiG2JqR(h@=5r`ho309!pCNN(Z3<L>EXDlj<YvufaWCz`Cxy;A>zP zK*N7@yP^TzuE$dX8K&dtm;YoT4nbi7F{CjNIWzqKeExqj6+M;By#1O1-K;&-mo!`B zT!I}uI*hfq@AgeRMKP(&+4n+Q30aL^VbNKbqY#KM<H2e3-r*7pj+seQO)PleyX_(C zpAUO9V)*8hlTBde29BA&Rruh8uN#%T5WDKuiz8)-_&Y|48iEtT83`fLT6NB;GB_K< zDPaWCs*fBTxA%zxEwgP~m)XpT*@&<;SM#s1_axLW%Wol8SWQb1V$Wuh`9>9U+?RF> zjVoU3N=*^Ary7tTzAxAmvyB9$=q}?%L_g8wD3FOWtKE+Pqm<a;<<drgGFug_LZfS$ zD_0In6s`uo72+PO9W(u|BtWiLyEN+3(;YojN;j4&L4Wl>pCk$e*2Ace@A*1U{^ae- zBe^7}8nH`x;fROzOg?=BKA}-_VCj&Rscn)vt9Mi)&uF~QpF^irTaqlXb>SK4K7>PE z+vo~Wai3WDI~%^tP(HNc$8($(e^FK{@#u3uj&>YzSi9iIHm;AfwHD+TocMj>8mrvX z-*&%|YUnsGLq2q6e~wMIn0_`mu?J0${nB@-{%!ST2VC)Fvbz%GEM!)hQtzTJ_|2+m zPlFytn9@pA4tfyh_pdi1tT&Ae5+A%GRP!X_b(8qsq4>?-g<_q=EQ}#DK&Siwb&T}E zRa@%uM%VXuEA5wqdtxptIS>lH=CGk)y3PIBg7a>K%H<8m8|S}ZQgVA7D-1Er+WMpe zAG!Dh^fb(4yQuh6anR2JP82nuJSZoM1EBR8$|h26&MtDJD-R`yke;Xwp0u^K9x??6 zmX`U^364ib{&TCIp4OjS8KA%W=kAl`Fra{99p{{mwF?3f0*WsX0a1bD3e4Hz|I}st zlM<$;4lpTOOgVm*#=`&5`f-AcrMp?^)!vW>39hZ#CZ@4t0k(uO2c`IYRFxoRTO&pR zT0m$Q2XXnQ=#ZwNto}nDgJz1JX|{V5yu^E$2@v!TMKxA6N0pi77b|>f4cZ=;<}KKZ zOA-qB@k_aeCf$KK$3w6a+@uPXuF!0=PN>?L6nG}2mv`*Ez+|2;^O!8)-P4(<q=18W zg>39UOmeRw8X@D{=SjzxgoNx8yHFmbF-dwdvA_knp88(BKlI64EF)j}W}IgQB0uB) z=-ob1le>A;Z@gH-pDj(P3%K2+U46OziazflS{nEETh{ii`t#6AE7PPPt5w!cU0%lL z>ZcJ`A0*`M8HX#SvS#&mZPTl<cO*DW&zdWg4~YHG5?TJHCp07h={T^UheSa_!h^~G z?hLv1`L_Q<?;SvlKji+{>T)|<(=m1vyl(*QrdkQ|D=FS7Pg_24r!4ePH2SvmeqnQH zPyP)@jGXCn1u@CbD~;-Ukqq=s(^MB^KgAeu6}z}=C<{!x2XL}vG+sJl=Ul#jbdKeT z>=hhabyZ7Dp6w&2dln2M=TxshhVqT}2AFPta15jN6}iIqSpds+lHrvjXNq@u!j=20 z-*jq<b+O-m)a<{e8+-8doPqHAVO8y{_tQaUc#+iMJDZ1ijgEIBze-)-pyq$=-#%Sx zt&p<KW<RPQ=Fgpqb##?m?tc61Lh(edRj?708Pi)`z11f!G2;(PQr^Z+yS-tc1IuB* zxK?}lpmj#*6Fud*-bSvQLvEwTAVPGSb3R_z17^z)xI7%@yHA9FVTcTXA(sFQVLQPP zbQRsWzfhw?o}Dqj|03P}YtaZ@IQ-Z>J)81&g4@EJcz{(YoIQ{^93&C}iSg6yw%G64 zZJ=k~#>E|sq!I$@>uW%A93Vh}T@X%w0J9o`{3#k4$A2d8{j2#N$-)x>NO?j+f`Iu4 zu!<i!6haOm|JUE(KSAG<@LKorEPThQI|~p{k@q5heTp<~=NL@G(EaV<R;b@|4;UtH z!G)1(^L}}abM8YL{Oj&Fh`xu>^g09wqsTKndNrT%ob<|tbNB7|aHE<W90|?f8|Qom z2O{EKnQE%}=VS8*BgIfF>-!XYW;&HyC5k@m>0Q6_Z1pqZrC*gep8k|pIwe1u37@Y) z^UK@S>qavdGP2JPw}0uq%NjcU=4GpVTU^>TOh-<V>|$Jml7!3n011uE_XMoxo4V$i zm%dSP&)Ju0@T*z+EY^LVeJa>U6I-6CJzp32ShrGudDi)@>qXk#sk^qdVc+5lDlFC1 zKN^-<3zDL3*T&zrI-l=$0)0p#^q;)vf3d!ogFD-`UWTvN=Oyg52b|)w6G?4K&ms+w znK(uozij%{_F6wF=J=@oC^U2n2geNFt1%uVWwP%!$&TX1xL&L`X}ZQ0^DR=f;^}1# z(50peTzv4*G7rVO^r}4qlRmJuK`uVMf^+~jj!UDUxUuxzs`)a;<$}JtZ;vyCpBG1a zN2BYbb7e*a(TZFQ<SC#X8Hh1^-Bc#&G~!$_xZzFIEfFose9tL4qgC>GC>>m?kjS)T zf3}L^_2Y-_jgr0LpBFLRAE}G+`#!%!l8KjpFN0}g^)4R7cf5HbO7^hPD&uwA%X6Kt z;*TUq4YB8HCBIzb*4PV6?ZLljAEoD!@9{GENSnBfLJu^uk5L(u8{`?5p*%dH;eSKP zB~~5?-+&eSh<@uPLV7De4^bVZ?@y#bI}e}?7+{OUoFa|Thi`AsK2D^=qVYS>oRU3o z$*@ivg`lTZFFc^?^?PH{uVrfB$K>3fRWC77h$uflR9Fxyg!D|HXNUjx`TkX*w%N4O z&=%WrB`1T25!?9|xm`Lg!{HdZ3t6}&Q_H)6o@|Vd^`KP^!7o!cQqZl-)*N-sF{-<4 zgMn6nn}_c~IA1=YkZbPmt>V9zePYb@i80vq4#kyZ$~B@ihq{+`Ea%>+Uxk!uGe}f$ z4Xs$o`?rmnYxPZQ5s637KPNx<`0BJ!8w$b!LM;r4E7F8BqT53NGo53V1IssunErbo z{txC38o=DqQG*_@yarU5fJ!m4p!EBDI76Jp{4Lv~G-tQN)mN1=tT@5~Ce{>4Ps|=T z<GlRsZX~IQp6thZeY7Xkf|FVkKqjKYFc9E{SOE;!7k@|}vct)+hhuU7`-jIps0~z) zBi=Pke@uD93MD`(OhN?JCRt@^rM$~<nIZXL6@f@!d2nRZ(XU@+<96l43#KJW&LS3N z5PGDH|Ncr)9;MD>TigE2;}UF!RqQ^J<>WrFp<Pa!3poV4MII)Lu4}iM;Bw}>`(HWi ziu0oUzWRODEW`2<J<+8f9Zn}^TL7@yOl=$YmwxIJW-cTY^B!QiBTjS)6{G!+dx6NG zd71yZo#`}~Mk6ErOFPqX7WKFmC<qk;DuT#$>;!=2D*<v9kVh2+Ea$&znty6!dUHjF zQZI8Zy}w_5<#72`wyc;6y!ta`wBR_w)mxr#lj_kgKSWi9mNv%UvKs*t(t@UF{WYje zr*70q-J$JXf|b667c$n>HPt2TAGjvq<=8$0<z0R2Hb=zaeN<`SC(p&0bxrT{eGVbJ ze2^wlKCj4Ey64jg#1Gs{4X@1WMRs&<7>{v}nchTPynktIFLd_(x=9s=fXfZxo?bGI zqvtC4f@*~=Oifzo`b(8h@9oJmSW|q^2gRX!KkmwvlCf{(YqFE2G>G98f!#VNEZ2C^ zMGn6$qMC&H6}`73GkP4)Kcu2klCu>q?pwPu5nS2Ve<xFX#nH&II=*hOC-ddA0#!cB z$}BqxOqcTO+1nq!yx}NHzt1Ym_jS#j?NhY+wi#l0lpH}LU|%E=9+TXvt524z?R$B< zzB6yd|A~%FSQhy*hK|uygQB$kds4U@BNLjp2+0~hq~uS=-g#DbS0MW9<B$rvc4pm< ztye2)<d50{e04fjdk{Vr;e`vF-r!|J5EUeOfj0J|ht;S<(rsmpnujV8t@oKB`#8&X z%pQf&`1(wSZJ)%mIp4qjl=yMfqtq$5{xhC+a!zI(%~5q9{+C;9Q8%jdKDj1v<IZ+F z+i5S2Nnr%V^3Rc(I3Ai`o?`B(sj=1^dU9Rq(gS<^;ir*qogVd468BhD$Br(alI%l4 z067D6>#xlEkWWaJ2cw6KLPCZhA^n&*$0^KbhA3!|kTyt2^3N0|DkLP5HY7|M;dkOu z+JHUn03OC!>tO{fgyw1Q>E#Kmat5=qg1dUc073@X1$ihO{8t_M?Z;X!PWD!QV7@aO zk^LcB?l2%P44g&R6QFuH18y-dgy-i)fhd_y^Qy>%?GNR*b#k$UIUTQlW991cdr0=H zm0<k^*~d`XOM5GPw*09=Cgb&8sJ##b@^P@B1JE8!{&xrDD(5Tyn^ZUSuh?_k9j5s( zhg)s;#k$LP8~sui!IgQAu@>XnM`5GAy;Dqk8x}<prWU#v^6qY7Gjq;A&vBp4JnsOl zOuTksJe(xvLZOe5=<xHh$o&=5utv=GcRr3p&gc15uQ?TArM{jH&wdykOJ7PEZ)`&~ zO8G4|xbOXTm3Pa&C|L>q2N`=V#Ky&?;0xoMg>nShM*3Ir1_^YO+RC%n`GVUP`L%>d z(|DUd9j&oMYl~*D+ZcGy6KSUv=-{g>Yo`cHKF?FdC#H|QqgJxvPLe#cxOI2zfoYL? zT^4G&2TI2n3)<(MMH){_l-pg*;Agjsu09TRcy`C{TJgHdd7bZ`2TwHS9?+vADhYz+ zn#=oHM9iN?1aKwsehw^%eShcE^9wFKrX~JShq&)m_it{p%^+N55CUJIS^mk*GoALd zk}n)Jn4MQj4b|IwrJK1HHA$n)mgGmAHq%l2b4K)UVBVq0%kg;!$tru}wGy`Z$WrXB z)0HW;zFT;NUhH%k&kty2*IxVVNhHAP?b#`1(9K*q&oPZ8d}?Ab=JC9oG-^dd;PKwR z(NeMTqbFC@()DN3bdO&swB<5)nQJt&Cw-uPGRVpPlq8laIsJ~sZ4;KaMi<h|@Gvlw zMHnRPg_nx6VDt(6V>j`KJTLj<oF4=ED7H#;3&!2qeEo?PCQx;iZVE9ha;27_m~`y# z3>h-~WNKS)Q2lAhFo0#7F@R;8(N33bM#aGSZ!u&))?Y(fE>R%$d%XVIi6Il^7Z4Em zHyJX1z`gxz&G78nYZ=t9Rc{lZ@Km62+*l<F=_psDiJ-^MF6EGm*x(C!$j^|d@ce!x z8!f|O;5lk>lS~ULPI1pL0myZj9!b}7>BqUgyueLI7wS4(Jf4GvOJ8x@tBDsTUMf&+ zn;ztk9c3vSWzGrAolpHP1^9^Pt_i&yvOO%d(Ta6ux8V9ZY|-*6xiMb&)<)3wI0;#6 zrjK`Xc^#@l$hBhmuqlkW27~6?A_+=vR?J_h;8-a)R3{VKjc{ilO`DrJl9b}_L@dcI zY@>UuFC3br$8CC4IMxJq5162Gsfm56N=f07i5ecPPL!>4B3t|LeyepmM(Ul{W>U+o z!5h)NiC-q1Kg7I*yQRhwpdDmBH>NC08ecs03wXFx@tv}3yqlG4mT@m5drJF_xGuiZ z9AQ&ujW?#w90^&3yA>MxM|5E>Fb(Qw&mzX!P6L}&FV+d$W<r=nboHfo5BBem(LZ`u z$)YzY=k2^KJ<?poT&sI-Qiy&c*M}22!?QU%JKpi}Xf}8l&no9gAeZO~HwDFFT6JIE z<7ew}sSLCU^iKIOk%mYQf#I~&ESBq``D!6kx$mCXnx|mhzd*7=N$lS!ucB6k-dFl{ z@Bm-CN6P^lx^rs`Kf&4rtwlT*EQN@-l@uR3ylx!bX}0$UHW4e}(=W#_gky=GL`gi7 zbwP1Yf@yktiT(%c;h2;4m(cS!FZdV4(}r6%Dya#uq7SU}ZlSf(D7?Gv_#4Fk-2wkT zi020&{!gtuhWJakl<L`-#t+KfO!+YQZ0E@2!&-&6HeRsd6FgS5Hr=jq?^Gy2qrRXY z<9pqEF;y^_3Oq3%wjIBZRX=8~&TCs0elRMx@1qqm7f{nlfak8e?Tv*ct(c0x_c4?$ zSwHTOnb86sU_Q@Q{hdECU28zZO@Awi$@hDT-|jXKTa=9f#HUciS3rl@uv`jubKRlx zD|MjCRjb$Wc?N?;e2oT-Z^fFY_HZ9ia9>xyX4USLCU>#VrA37bcRR7~N*;}N0Z*Fr z7?x(S)>vZvZG}&lR&O5=qlj)we7^jt24O%8e&b>ozsxJ2Ftm^?HDAd+DL%v;Hxd4n z*`;@Trd@0SJ^EtHlO_FY&cS!iZ#seYw$mQnHeNdDb6NATBM`D?DXZ7dMSG_%Lo>1M zb=Bbh&I4t??FzyMlAM4#hh@RuS~g2j+9>?(&j-Byi9uMmIO&H1O(MeXJQBs0S}@xY z!kX!{L|h3f(n|UMq~q?~%{)-skj-;H*v7?kpBh3<OmkWmMwFUp@<_;O5LJ<Mc9)by zXrt>)Q_V78eZ63bJ#~x5q;HMs{Szvg&@{IYU1)Lk)^*G0?w{@_)4#dFW`rZ!+cQiM zOj+YwAReU_f1_YfA#I(TxS>&x`2|SJUN-An)mP{3FJo)dm0u@sCFpVDu{N{OwCWIJ zzz0K#7hgiVPsp?w&VG(?U||N3$+vx}fS<sQo(e=KNdT~4JBd(;aY52Dz)`vp9u9aB zUy88L!aS1VA@yTHecY1;^*v!uVB`XuFi+&NAt%KOS)jUi+VhJ>Mkog~^!`|P!SH0& z1z~{hAp(T@kmD8CfHsg{Lx{?mfatdz=I<PmUyFJEw*6O50SwIbPwBSIe*9IVSzg6D zcT<tDYC9{);;;}K4eO_-XF_YPNqlwns?r#x#aTkwhF>Z<TkWFo?oWHo%xx4|x;^m= zv0xm&m65&C>uc-QVNaNH>+Rv(odt`FN^b&RtNW0izo$rNwAAp0K?LPoW|@Bx#$u1k zQj_$oaC$@6f%C;wyGa&KnMC|ZPuq^5f{c0{7&(~~d?7TdYkZf`U@J0aBSI=Ivf|MM z?N>*F6w2$ZTsiQnJLtk*!H#7r8+3`vzI=J9nw(%(4)k`<7roH#1gK~V<&y^j^|EV~ zj4hC$JU=LzB#-d+^!~blLxUK!t)exafZm!?pkz0kqjmuA#mM!R<Wpt{=sNJE{EmxG zCsYq?2qv(EKCpD-A8EKqNYD>w7$9(XK-?hwKgIxogYDEgw)b$iJy|dNe{uH}U{$r- zy0oNpH%Ql_LsCIPk?!v94v`Q9lv28+JEXfsQb42|r9+TZK)rJ<K+*l*-@W&9&OYZ} zp6CA`=VGoo=URMYd}F-h9q+I(X0<bNvS+n0z66-T;=wn6yay(T?czNK_5f4im($q5 zNwpK3v6J(8cJ0o|YR_x*3+V7Fw=Bzx+2Le*@ouEc_gA?3fgu<m<?|Fn7IgOtSwiGj zvIGdkdie~1s3q0KGXT*$EBIb4?(F|Snh*qEl^l*61OU=$Y-ub(OqXv0ntp$MZeYDD z%E>9;7E|X0@DvDX?dKkmCu3;@_h7bu<t=|rj)ck1e%@C4Zzcx8DrY&zG53ws`DO`l zPmxrbT~+JsrLrv~>Ac!+AU^w~NiKuMz<a}4fyB_f_Dzhv+46B#<9&LCH%V(Hk5e`# z>NV4$6K8g3ElDjWgw?21bI9Nf6Tgqc_tub$v?5D2M!&2!F<fX<Ue07Jrg*i!(lFC~ zRMo+e8Q<@gx8h-Pjj50Rn*g4o-+&@2t6sp`C<5oHoArR`21hFSGi|XpXKO7TWIfJ) z*%w88yKG*}hAESoQFb)MY>{PzcZ807h;uw2*JXOz5S-9tM?J<}*u!H}e~G}xY)<?7 zZv3067pPwzMsDAh!4ki3=j2JhkyT*pb??FB*@Ye$@!ZFy9b8(KfC~b!O47?g9_AKi z=0I`P#Sxt0nYf-W2*69>t0aDX`NNmN_5gkikPL<?zVKx*McTBMD56ObC?0zycWB(M ze$ikQ)B0Ce^RLeq0XM`zY8+HQW{XGxk4hnS`K%NYs+Yd+lG*=brpWIjM*g!;^C#E% zx_{Ye<#eQBnT3TTXMWjFq~{HdbhQIx$7nQ{Sq3u6OFfGm(Xv-H<q<>iS@~ib0`F#` z#{{RH`LbmCWoi76WwMp9_&)AS+c-q|7*!YM=yha0`YdOt(EPb`Ynt!b2ZUwBDAZT< zVk)P7njyG84r|;kvW`eX%>sP#T5jybVHI6BBocFrY@l#7;cDu!Hx-cM#l)!Yn;1Oy z6O+&J&<>d+lu;XHUC|*?V)luDLxg~rW$rY@1&6Jj?(k02TV-0;c#-!pNEL1wvy#CV z>yrn6a0U#fH=SusaE<$3FLEAVA+m9Mi>Xe`qqcM!vd20^@+cHo{bCKaC<=VFcP~i! z|Kg;PGT{yj*v~DJ&?E7*M2LWxuQ5}{FCObJPxzG#05N|OB80e^@#GhR!KMg^YLwHI zlAjsP3R(y_TtzX|+Cuj|CoxUJxldBhB&t#;@3G&ljas|S9A4o*F#SQv!(nWhG8%eH z<#FN-<D*d1{<&n{H+fuT7D?3IsqR!v_P0N%NU|Fc?x=SLvfT$ArLp5tcdx!T!Q<>} zAtFu_`rNDgg#C#=Vh9T=g0^DKt1rm$Z*lcrU^RR581XfUXFXh^WkP-xXMwi<^nELa zT5Y#0R+P$~l*L3NBa9Zh_y`62^g+EntxlwVYU5peB(};vvfJi8*XY`YwU0L_>&&r| z1(RD+&wRC$jNWWX7SPa{rSa}V`9Dw|&;Pv6ik<1UMlJ&}e_SUMV7qWN0FWAhAOxAS za89ov%vyr|sm2cja8zMdf&b)T{-MGQ@@u$^SFT|bs{)q-BS;kBe;A)Dg51B58o7v9 zkg=~{o^{b11h{;#jiX>QU;cvPl2>s7B3-%Kk3ODD=@NjBaj{W=AtTp|&jJC9*eO6{ zSKH|@Eo@EgM6aH5!K&xs;N}2YX1VylWf8E>+U4Q@<Dc&DiZBxz{+=PVvGqA@=633= zxymF6wg($wQjP4<_`Cb}8_R3CpSivq%Fc!!hl0hTB1HWB9g{j~;M!q}1rhDH`|EEX zrZ9_=YM9&Rd{%#%LKN{%<kJixf?wYC1%cUaB?%;i6?FTK6VaUO?^WT^31rVG{NFmM zIET49rje$Qw$6&27b1V#FTiyNd2=D@17;G0==m7^hp}Gx-{c&Mjk{;vhIcen)<o9A z;Tb9St_@e^Dt=2YtA4NLhA+C|I7Zz^@5j*r<w3BefgjTI+LFwn=WC5~HjRWur&J-~ zqC_Z-72(I_2CTz}$2nmN9lI&cHTlA6+25<BVX>#E`nMhYnGyyCY7SW(yCH@_{!0z- z9Dg+VT^F!cedNc^2onvMM<fvBeL3G5f3*{^E}-VGTjAg90$yop`?a_y34uZ>{zZAf z|IT~=-5RT3#gBwBDdSQRlx|lTozH#C8}WA4&q+*CKPe?0pVqy&t89%nnxkrtGfaSO zdN0va(<wevd;K)jiCBBJqs7<yP5!|cQ|s}UgaV_CGD#TpktGEIEJ5o~P31@S(`}uR zgN_n?c^a*6I8#J2V>bgiDM^IMg!OG*lg$D<yE_cdqwjx5C9pX!&Dl}jO1!3rdg3(i zdxe^n`GtB6WZ>0b{`$%;bD<IldJnBo(6ymARX1dU4jL1lLc@`^je1Up!@l$Cm__3A zR#!`g7#eluvoC~DW=+tgZx$TRGzX1eEyTtTWs1Is4&9-<_Q?b~RGbCD#6__+2!n!B z&)N#zx&(=&bT5N|>y=BE6UnErnVsS<6|R-fT4rJ}$eR1QZ)!f$Csd8jSAnc$Y%>!( z2z}1Q)&fvdbuu`YqoPp}u>PqR3vUg;j{wmhR{pQnFF2IDTHpF5Ym_vxJ5Nd>ik3em z0e`#>FjLR(3(({sF&Y;T<8y(y!ClLM!vz`<ejff;-R4i|V-BuLTITBo@~0`3^5bpI zOj=c0sp*rB>P=9@_gV~ka7ZQm3tyA^jtOmIBny<<-1yw+0G*0(=&eWAc3q`6AW;KU zLf8kAirJ>(4LguYbTkz%j%i)MgId5KXJWrT9<BWD7H1k4DVc=ptXwYv?^YnLCn4h5 zXjk&?UOp>E{<9S!b)kGbb3ry2N`i;<ZrO_l_%%7}pUD!Yooo+~GbpV;P89?`Gc7&x zwDO;-r$XdLAH4O6`^5624--wl0OpcSsZ+TtY4K3GyBSdyKZyd0nQFjSJ{`1y+1&=F zSn@e94#lse4OIx~<&?VFV=?9rcN0=)BoKvHhmp{@qi22ZE5(ghA&FBM<Ke@?+*3j` zpBpW3lzndFe|<U`=&sq<)=~DfK#Cok#%v37$*UaX?;a3ryy3lK*t^*DAh$`)1ZC+P z&33f~#tc2tohE3~p}4BW_?xY~#$!U!A5j($=}S;lTO6KHGl+!;b>3C<ns6v255>*7 z8K60?4z2L|p4jBW2{ALr4ElNffc(^MuQMelM~%bhp7^fU2acDuCs9<mG77Y+ER|QW zd)2n$Yz}l0*d(5)k5J=1Tf(!YH_`yj%R?s{g%G`%#*g;5=k2(WnkYG@*?T|FBE*qA z%6i%-mAJTz+-a6sj?m=m!{?$Hti!w8f~l<Z!WOigonGgj0UUh(1NQhcm7Ho|EqIAq z8%(R<tZf7Pu5}{9bL^L3^Dj^Ml~)t=`xXbD*TC++(p5EI8!g)7@G6gc>kesq;6A;2 z&`XrF@N)hLag{>jN7@$oLy3HXC(GpA%i<q=J)+IC8eY8+TI6~Iy7NStDJFa8SR~=m zSMHTT_SZ9(ExF^=h>P*M9h!))`8lO-Y&H5#;&&`};=Vh@w1uxdKmE#Hv!#ZKDUk&F zL=?>5CMTE+HQIGnXyZ#|pN+bp1IGY!+Lspf)_bhOM}9O#y;+QJv(7~jcQUC*CP1Tg zO6e<S0}nw`AUf{sN0uVj=XI0NVNw`*r-yt&pQe#tH$BRv7MmM$vkM#vB#~bzQ3$OM z6Lx)H*Gspj_hQFZ0}Ww<2|sJt+p0kihe#@d=-z6DBuV%^2_}k<QuC{`NZ|x|Q=(zd zXfc%xoOCvuR$s|7@EU9u@w1q*;*A|b1q7z|KXiTdV5#P==?<)fzC|^vV(ha=x;dFu zS;9<{{S(BJ1$*LCa$jKAc5(Vd_5<dI+LS-ktReHtKB3Tn1req*cQ;{@&zJPbbnerc zng$h_M}41MQ6fQqqHSS<OxsPy)uE%{HJ+c0kj^tZ8WP<&xx|91i)4)$=bb6!{rtN~ zI!^9jmCok$G|4O1`QW-H3HTV|lCwLO_e!Nc43wY``)saQC(HR+dKwos2#>Dzxw3ZV zO0{W6qW5)+oUCvxh7sFkt%Of}VUP+PaQeplYwqoA?F4vbCvyW1ZXTe&7zF4Jvw)k$ z{QNZi`+r0jaP0t&*bI2+oQvEWVPX<)RQ>jyqfoY7Wh$RnR~H%>M>O~~;P}^bZ*cSs z$-VJ^<lYzIhvLtfo?uC0c8DnPMJWk5<h&eGCHGG~0t1Nd{64@at&54H%J-Bg6qUp% zl%&LfF9m4&=Kukl2m2r4#<sf^CX)7zvvTUwTglrUrpx5)*viE+rgzAhk++PmEwj$d z)FD%B&wqF|l$x0DN$MZGjHx<J_Cmc~VU?K+jdl3hqH5nK550<p$GtSLUWtlgrWpEi zYS_}dYrJLw^Q-Ufn%$#P$eF*MfU&Kn;7t4eL07LKD>m^%>R=iryEZO$s3(uUe{RlI zm!|THEzSr|!fj0Ro?lnU8-2OW`<|!L|E^(`bmCT*+1Ll+!w+Lvy5gT&9Bw^Oe+27W z<_CT9rI(|jGMw%)T_=<CNZwf7T!-<O-T|cy)kb&xaA{bEl2d89EZn+*J#9iY8!L}o zrVKg??5ZIl(RY-fYtJ_lehlsN2fitvzl0lqdbb*@jE%g4M^8OADyPun%R6IS>kfYL zZm@Im+^TQyHJI*Zz9%N`h$|O*tMU(UCFFX)D(YQrZgagv0Rc4A5@Zg@U0?Q^K?hyt zZ4dzS5{LpPZXnSgXTbz<UBZ9{;2hQIm(jCqmkZ{6U4ob8Z7~23bOzl5Ruq6H0*$aB zpb<8WGl>22GLF`q|I{_CK|<hbP{0BDmjLD9Tx9yIHP9D!4FMk9AqIT~{k&`%gZc3q z>~H1>0Udlf26RzoZ8g!5OBcr;^|gkd1ln&;=~SQ|Gr5QYBSTL1+1+dG?-GTm*ZVf@ zTam8&45HMlCu@vEzWZwZbtvAZ#=&1}&;~^lX~=8t)$Iw!thrP%TD^vdgudC5#XP$g zkH0zBkP}lBmdU+7G}F;Z5?udoacp2cHo5<m=XD`$u<P($R+pd;XA>$901XAVd107p z@BKnA&mbPV+T)4m4ue7SPM{O7!fi&4?pu#;V&W4i?)O~Bd61#yXjbpAttM&OSqmd$ z!lnCUh*6LtSs~%xs$%M~6($qfGau5m&`ln^+mAOGjapnpHs@Z!HXsWggLXDc@0~s2 z!Eh4Z&w}_p3?LY^08b`^;0>IRb`Bc3ImMroO<@3a9~eMR3pyJHLokZHkNjwe_<CaP zka!DL^VP2v9G2?+>SC^d48UE$Ws?h#ffvLLb}}f~tmoJQCxyI=A%J@TgcJ)K14obF zXevKo1_(mH18JB2p|S%ICqV#Qa6X9dzx@IJF2U;2)=1qW4u!_4#F&Q@o&KO!YAGQa z@dy>=E$8GU=HN#db#j_x#yoNOf-P8b_lK#^>k^>~s2_|K1!fpYbUD)XAKZKG;xNp= zBX?`pWga>5bvT7xJo@J%YCU@fo~)jr)v`p2KBeryRiWkwiQjHWaL%~mZlh;77~eBt z^)r{qg@jSR{Yk({JcgrUK0FQ~2cp<+rxkL)4>~2`n<cXuy?o-8-ZiHbs)=}8Cs>21 zPVbizqPF5GVK2*Koefyf@+F3|o-vLky2ROvD1DVk&?n7fy7xsl7iq!;G(K#iFJv|* zrQ%{C5_KqrB56To;UC-F)6Ewo<H_tqC}nZq%G;y`{mgzKI1;kZa4+Pf&i}yYkhU3^ zLP$gRb(rGk#>xt8tc<|MigmHE>O;rX+{xXjtV|rc%XS=jdiC>xH`d>kcz^D!=Qq4q zaX)(iesZe73@GqW3jlAsGB}bC#B;tj*)Dnj_yB?xcueN`l>p}co&QS<z)w}F^Edoh z%@;c~nDl>6UE~A27|<{P{sB`L0f{(ZO<&HE{7qW;fBgsg6SQ95LdSeMJ)t%0?nRvH zX6n}`+~{4hpF@|(m1)lIz{hF0wC`Z*QI>C#nf+umLZ3zCR)2vNM=Nz7v)Js?{Fy=W zd#7@$7|h!QdatU<)vS@>)v3C9?g@Bjza0!J4bByZ!FG0VLcXN|^O+dO>ejrSUcHrn zMvB&|OcNQj<MdtUwVMwgJ|Ksyq)l3=)GU$|QmGw(NvlW?%`R#>F?pluh;d?zQd&Fd z$aDRn3b#+JRoL_AbbZenHi|@BU$lSr9n?9{oEdNq$`Q6kQR;1aHb98rxPq$9XVC>W z)@VJTb#!c=JVS#k6`a1F|2aN+VSkjJ-T>3uEH;ckp|4%y2LE|>^DnBM7h4xZ>nCq7 zeLoRKc4jhyJ+9Vh`EBV#HZda6i5Qb2q-P<o`42Fb^RJsK>A26G+=yye6<3&ljmL$& zV=1n%!E`MY*0W<%1esY8FOBJT9ZjT&eLg3RjRX<>O}fE?4u)IA^EdCca&l>j1-Do+ znUvD+lpl5!m=1WUeyr*4Gi&QfCL*YP)gcZ0N&mY1n>(HRZXU<gxC?yKU2ODes3LB( z&XY7)Q|wbjWHSt6QB;B!xeYLT)!KBhAqNN>NlT9YAJUQ9)}aXB36I!Y)jQ-AsFxfx ztXo&_Jnm0w_|CtgYVZy@_m%cNeJ^-7TF;h=Yl_T<$M!~({Ec=b?H)6(45b5|%*JrK z!92F?BceoxTs$J&&?QAiX%OFnXKdo)>||ta;%s7VVr6G@?p?sNE>fqhOwk|C1vV3K zEH8lV?C}MzLVNWq1#e&uS2nO;=5mW)+<`**{1)H=n?JR%lv%(pE14KwG6I15uZiQ8 z37r4%_Dh!lVSw?2n}GO%q1-^R>>Tt44#EBaIQ*Y@q(517Axb9q!V?CZGMvCtL5wAS zJ8m7BlGzP|uo&qBJL60uebcObQL0CiBiYOD&##+97uU&Z3k<xg&ATN!KbTqXuVML& zxQHZi3XzG1?u!Mr<fnyAX3wNUY?vV*F7NhKK`4#F!zt854nd|O`Khsvxq#^2Jk$h^ z>xfdST9&6%i|Xpo(t3_!g189K;X1_ywa+Wxq;BS}S+Xc{O$+R3yC_Ue@3VjT=n&8G zN*Pxi^-Ge<cJVv`Vp?WUsPsoA_z1##qjTyWNyC;Tw+cH)a|g}QW0w{U;$028qrAt2 zq25QyKVD2hUMY?nCVegNps#TXmTNRz3;NLVS`A*ct<1xp7X34TXYcSJu0K>7$6pBX zWWl#au3$>xynr*{F8KxUzXj|Fzb!wAMMoQJ6!ROeGHhah)9iSHt=0{9W7pZORsVz8 z>3T>`KufH@x9v!W&`zqaZ39DPyl2@><xPHkNgtwclrwU64R*Nl0sMXDE<+xb_f!)h zDwXk41;!_1Bs>%1?wXp^0%~!Go*=oB7nb+#GKHtXeh^;B9~t%<uE=}uC|I2O-B)8N zNuu)T=F2zygz+598<Yl-OYD^4TxG{>+%ka}Q>&r8l+7AO3wwdV>`EibIDz&a2doHg zbS`Y<wV_|Wb=FVtECp<>n$)xyY3|=C^^4{m5qmmDJw`ToXih9{l%ZLl%dL^VY!9Dw zomwp+8ri0v--tfw**?LeiPN`(@T$gY5R1mSDk)`WXbH$yTyz?<z90T!&p;C64`&M4 z^!<xq;ficO%R+@7@o(QR$S>xKeFM1Ze@sy7VyrbRHqNhtQgV=wc2W2O`v9O%nd7Gq zVCMtSSzs*V|JLXJlcN|Y@Ds_*G;l9qhf;~bOr=97Cz%&W@;3*y${3J-V!M9Q>~Wk; zy`!QK`{>Q|hdNtf_6cMPv#x{5mgr4MIANFp#tfaua7ag>6oSyW@&b}GvEg){zEh#7 z`qfE$?vtg}$d07Uq<4acSP5=rHAoBQD<rl1(MG|Rz!W*xp5_CpC9}FhB3-w(z-zN; z)-4|qy4)<qQghMAPd`TE*PI15XBEC8VV@nZe!H~0GmjThuK0XBeIz9P8f(iUG}bLL zqQ!|Au4!Wr`tS9unC;7JTF<0TB~jX~r;0fO#P+k7#q7VDMB1F3D7^a86w5>i$NbJF zcV_pYU4Y4Z%fiP&F6WNIuM`AKwY|ck{96(JscmCtoMarq!r6rUCM|l|CxSf_f15%7 ztqA}50)wz}z}yW$N{R|ZahcG=!v6Rd;)O<vKQA)uUrO&Ik}H<+in~vL9jKd%iH$E% zG4`#}6rH8a?rhuFW4_ldscEsXw#&_ZFhsN8os;!grir-B39)IUqqmy7K_keG{Y|bf zP6_tTS((%qD;gRWg=%ISiMIIeP*ok_kGJm&ThWCN3ET}t(R;UTnd{Q`R`W3%zYDge z<4YL77tOoqkCZ8Z1aV|h_BC3<ZD=&C*r)C(E%F&<;sut2_@0Ay=p&zRsOar-;Yphc z%irlSa^Pb(tTn9LS1PuyV#>fOAe2Lz(p`Q2IvfY_+b+nLAT20Rw)?^O6WDLIqsJ)# z>z6r=dO0~tkvw`HKia9IqOHvVo&w6f30sjgPxuWK`FSN0^Rjwlf1bvir^|F-hQIvq zNwB_vKk^1*4C4!*L{L;^`PHHtSHQ@+bn4{QFZ3sH$f17eg#ZnazbWOggV?}n2`o1K zk5bM*ku0AJCjQJcc!1_&p36+*zwgd}@(azixL)5!ydRhq2N-*G-%?_kKYD~nVK4@* zVVNwBS-Ru;HO6Pa0My_apa;_gZQA=0H_R>_l-!gam>MmxuNn-+J~;8wG8SfX8}{j` zi_PjrtqLAIUgE)mZdq`vaiBJ?Y;adi{esJSF}zSpSBTU?1ARB_BIvoXu41c(Jr%cF zaOkHP<bd%;b|+}A?VURg3sx|B+>TapNu~>ZBp!MbL~!P0k}xYN`tNz-pyvm;pUpR$ zb=kOS+>A&Wi^Pp?yv2pl#{Z>^PS|HG)TOh$H1=J_T+&i}^Ml28zv61Uv+?Uw3tTVJ zh}>2`Aja>gpCmu3;VEsOFB(3;K(Ke<{ux00L&4+Mf(62rrb6aXd9gU$C%X|m23j(w zR+9-moX>vS;2;5nru{?a*%~gn!ytux+UC2p1)m(yW(>O0Hn_+<-O%B<*XSawBU_^I zZrl-;xj(>!H;ST2dPZ)R0VBaKH?V&Ko9mIHWH~uyB=FgH{9VFg_G0shibFiNK=bpB zlHyzCk#-Abl(O7LoFUR<N%woZR_`N09Zz-bBp4>RRmV{2hNcxB)Vjy_@)0KVIHtP4 zxm#39nC67Va@H<Z?-w<Nr^#OPrP9F{ODe(9NmE0q%}9}RJGW<;AIAP<q3o6^LqU?l zHb|KYM{lx_v~4MR_wyms@kX!vov~V=M-7dM2nSl&clTCW%r#w`H~n|BB*F@@)+**S zm(#r0(5Xl@*EP;l0-#69*}}#S5Tdj*HUR@%7Pe-P_TTM#@uu~k=2`%lD=_^B28e}V zpkV-kC@8335-qTanq4tbX$f{L5C+&3k+G3(UEYKpXdgXC4Ulhp7@9ajYOw5VKr<D@ zW@&$%Nb&R66t{sVgOG`VNBc#w1Rx7@frX^O^;m8YH=qu1kqi9C9^_93-0hG^fEDgJ z{Uz~CtaM`U04cm!<eM3<;8YK-d|8=r-`agAsJ-%;{mwh5NIL|v1Gx*yk8~)md!`le zJUOASc4w{FT9e#|+l{2I+$ddEs)aw6)L{zxl$-VXCU^BPnxfeF!84b|3}kuL$IWpl zUYvm#b@T)uIX9#*$F-s)U8zPs4(hDt-6u(jjhanvaz@H?G$?pUDey^%8CDf(xNWAR zs!N%-aD_Ib{EmZDFJ|z^##Q6vAxt7CQO#~?X7rk!$cN^>aC|7l=r>0W(<<7-7r82Z z6KqmlN1ic=mc<P7W|?6<Trg}X;qFY}@fWXMaVOw3aCol8686G9#((odV@?yK4#Ech z!oaSI3PS#|m%?5#+HNr}ZCqTqWzoI2g^6}Io_RjLrTG`70N8&fGf;Fch`CGkv`Z*9 z>zmFATUF!cF3P$pAL&~gwDd;vC%c`#**Cbp?!^*d2Bq^H@~$e2jvAA9=-J=0V&U&f zRfHc{wR9W~a}<%34=C&kqv?71Ay)}6CdX1~gCHfsJ>SiZ=u2gsq((3ueO2!w>$vds z476G*ao7)Ujb4fgq#tIn9J`XiDJQsdh>kOP%hu;4zx1%Z*8Ftq<2av%RvW6S`HOFx zZx_3RzwEtv*c@0XZU!YUd_W6pyy5m>O;?zNSF(F-BWs^WFs_~75k8ubremB}484u~ zap>2A=JhgTwWaB2>4S^XYd6WGur)g(CTY~AeI?Of!<H0%XsKx}V1yX<uYmPAL5@al zCh^-3lfDXAi&&8PCGRH6>^pt0lge0{{mozg+kiFu|1@CzPd~ul0oKceEjF2|1}q6u z4o7Blbzz$|sX@NTQP)rSXiDz{`!74?r6t|aK_l-su|<73r22^9aUwzzM!M5{r8>Wr zZQBv<XkMO30Tx0Sd(p#}T;ma3X2D2ra4_HBmr%7JcZczvnvslRXyEBF((YUsXL;<E zUc>Ry3sld@#$NC-(`;%QvJL+BCxLXk<1+9Ix@Asj)4+P`pL|405TwJf??y#hsdzky z{GK3|+pxbSiOwTLujdug!9W%1JY&=HbWpN6%`(WlIt2Hd+1uhp`65AY!@CjnkH)cZ ziOG9)(AyNF88H*4yarKuut&LPFbFj^qT8TaTp}h<zPiFq8#Y8*!cN}dp8V{s1zBjg zKX(wYM~9GhE;bO2&W#_d4b}_TK-_>0MDOPYQuo_u`h{-xuWTUTSRJx~5dP%`0tS&F z93DW{3P6wexBv~&%RK{95&`2!SLtT|)%X6>HjxR}Kvftoq_#%um{{d8!tj1^EylO( z<p-^BCWb`g`E;G_mq_q7)AXzZh8c$6Dubu6Hu*LwQ(DECpcTD>-QJNzbk)}dS6L#h zI;~-f=DzLkH4I}}jzGzgAI_8Spx-zwq<I{g7)z3GRx5%!di+HZo2{LA)ZTtKq7|zb zp)YZ9vX|4-ZS3<_-6wPLTT<A=t?gMQy87R$bKuV^XRm3%jA#(V8y#jFEkvR|&?!go z+z;H?9Dyy-eI%^+9e3NJ@e4nXqsyS1qU?T8By*k6au2nV2>Fe8O6_Y23{9^EwpML} z1gzqmjX0ak3D|et!(3a=fT5s_LAkP#Gjv23&@WiX@+VNVoT35pmsIaBIzd$C3Gx!C zf|K3-cXxz9RGsi8I|cJw@M*IRa&$D0V4IGOzp{*jK4f9wZ%#2V0P-)cM}*kawHU}> z)U!qm?3>^WEU`lIN0FO48$sS<>!>tgL85Y7{h2;|uX!=$wr9=R!|x4OKs$eIcG0~i zMfA}AJD&EVR*%41_^%I}O)xXjTVX0cEAsNgjpnm^611c-9$+OLXG-{g5Y#<PNv-Nm z^=9qPO1+PWbJympy^R%-QIqisdCkD?-V4?S;+j4AV5ev8??2#$C33(Nh7-)LV_<&t z;Vz6U6$V9n4si<QnxG$^g{K-0N{TZ>>oky7aSTfi^RW(n^PAzYB&+%;IC{3~M@ran z<JN`|e?G)eF`b+ZfI*KY*2a(;CI=)bgN|%N`0&F>0d)_5ICQ{BkI#)1==8b54+MvJ z=2t>IAPb`bQG*Q+8Jh&?j6c6PfczSn+uB*%nOT@PT~w7WM4wQw8GfF2UeV<EyAmc) z{o&yNCNXmIvx5bIIj<i62cN_r`WHb<U}_wYKcGPYrCvlBe?afBhNJu2x<d|JU@<DD z@%(`7PB$#UW0Ca2Q^A}UyB+CMBNMhvN|C2GvV<S)rmpF2Ez^k~(&vbH%`GtQc9$x# zrS`%@KPQVYCE?GNJ<+Uof}=6rbbGj}@meN<21j|5wrl?(;V8&HqV(k*#_z?O4BO)` z3g8}Rj(iEp=F*$K9p%q6X)0J&Tj&2ZSwI-0`{oXUiK%B2A%W0$2L(Y8t6sB^n^U<C zf^`SAY9do0?K6^Gn2IG4v{FP5|5_fQjpTRS6^$0Xhy5vQUyZ}?eK~D)WpomH$R1aw z5VellVslgL&L`;!?Tj6}wr>bGxTBHWGP8o4_&hdc_he5z4Z08p8a5Lw)6jm!dRz2r z-VV%?2OVgs6wQodv|rB;UIqC*0|$YC@LVX!@3Ak=U!9X~odqy1{!@$0A6VeO%FX<` z+#z`)e2PeL%G(|ymGmNu{e6w8B<ROPa%%bM9!QMS$86<f{aw1269JFY<94LEh20Ru z)D2t0)oYQ>M7AnsDNV_HlusP{h3<(?_?5b)26#4PbRBZxhfiXP9-J{V%HlrEHPm6H zc?X3;K}2f)1;6&7>B%;|#;h#f6a0Yga+59=&+LLmr68MGwXELH6k;gmy9cMv&8j+{ z9*18@13$3DG#@%d-tG@0PlQ5#%&@LPr4B{C@d4{LgO()X>{BsI6NJ2F$^x;<7|NKs z2XDCwvB!!VXWk3(ziAS7u}>$^fbF5Gj7T2UWgO409znMGTqBBkCz0Iax?u}?+|~jc zIes+6d5{<x*g(d_+87v_8vy#?j!ppQ1$fEme1ZYV>Ws<LpMInb@FPvYhJP{X=pX&a z!z+Jc2^Dra5Y4$CArrezar?)uC;&FqZRtA{VnEYB7bgcF?`5e71^ZIU7~DT``9whW z3YIcv{}~S4zIax!{KxH!=lz*Na)S7QzC9jxPA-Tt4uC6P90JNX|Kkt%N3X-9vYf3$ z09u#|QI0z6?o#~BCO^4T1_<p*J|Nbrcj-J!55952w%v;;!>{~G!Lw>ge}hlZue|S5 z!(<e-h!nKFOFlefF}cHjkFpRcf~BZ%1!~|&ZDNmh!&kLD;oLgVsMK(h+yzPc_tQ*; z`e>1pMbi&-;#(XFv!Toxw*x%UGjOU#s49G43ZiN%Sg@!QL~JLdekyq%vvMSvH-?J- zQeAzz!<08QDN31>cQ~5FQmUtCFMBE*mHL?adNPNKu0!%8c!flkuPgT%xisf`MS0Co zl_^!+rjSwl<4SyIqIqNvga>%A$&{9g?hC+gO_w+(^F0~jzZrro?DowC>~;L1#Q`rY z`WImVD(G)pGk;q#Y?sI2is)~xnIEDL%VgK5(;2kXp2)f)xGuiU2>pjF6!U^=_4yV+ z8H0m`fw~5v2LjsT03Xqh<m%-`FApwO>-mXT|HO%q39}UE6J{?OSN$HdBEv$1gn>`{ zQ{@|U$r=M1SAV-18_>-9>xVUWwz2+glZSXcRI#{rqM%kP?-!?$`$TVH%XYB8Q0l=Y zPxWMn(OJhnj%pT*gm!$sO7=kSDCD(Ht|*dFk+g)w3~Lz3yd0_iw1cg`9%Wv{&Fjts z0jwM0u@Qps$acfg^rSYZt*pURqZ5Oq*j>9)<KytTgI$uTHwC%6edR`Q8qUz<k54ML zZt3OE+H@bd40^RW(w0G!XfuEHyk80339nYSDp&wN8N7b&j@ZDCm|uzdd_YD?@3<TJ zDwJS~UHB3Q5~-{^mphkWbQ0~hoWpBE&n5~gDa~(pAHdeEsyDypxbIA6KAUH*RU!P* z@WG_-8nTOL&BscUM9Rp8f}!|EzA7idC!c2^UXREbTqy_o&CZ)?AoX&vobNgRi`)?P z%3K84F2LV)0I^fyMeOv8tSN+o<A25J0af#hHc@0$DrFWW4`85`4R{s;P!I=Db3iWh z2jxc6#!%`<5girp=gH?C47bmV=og_FEGo&*D*I1{;YD-W1+50a%zzp?2R}C?tO8~% zT%pzcZ+OT*<x5R2&vy-}>~54Sc)AunXqvn+T3d7WX7|>@rhBleZc?H$sVr*f(YrzW z1I4O|=WrkH1UZPwFzqrjtH6#)bu94nZSQFdiikHp7cwZk{|2pjmx50Hy7)slqQ}|e zu{b=DL(*R9E~i9RPGz45@{ySLltw#n#A}1HkDf5`Pi1l{Po6ju9aG_w1V>ptG+pkn z^nH0_e?CYe_$%Q<m&fGfWyHu%H?-<Z7MPX0_1~G|i!Amlb2>%A2;@BUa^=q;kFDk_ zsp@|2OqyC(xvZbUruueaQ&;OAmOZMqI7K1m!~x;aaIzxr>PdAw`%Re<oP^>oqC*|M zlWVo!Xyju7WEKAwE?xzD?0VC{-x8~UKxq?}GP>p4K<`z{2bL(r@>PX)qDPyioXXXk zOCpQo>EgaYm%UVks+C<LrgSFuY5k~c!AMi8Jw`e;?9sCy$FLCecn(ej{gcLsap2vA zQW`k2o;&$*bN=PT_Aio;N*&l|z2LK%-_`X>9`)`Wtrpiwi8SKXwAmbNAeC<ISFOSW zedwV|3S-ax`kkL2)lKElz&m?r`iKhq-=)O_*)EERbxA^Tj~>1|Ru=XXnv%9mtk}U2 zTG_OF+f60e*FOl&{%n%q164B;8IiDN`H~f?vgd=__iID4y~Z<yVuSkkXt`J{pQR)c z4T0Y4+=qLq_k_a7txYJ#|LvW`n}Y7OcIiWC#u@Hp4ELXRWGUmEqZ(Mh@;%MCFG^U4 z3nxFLoN*w^c?Vd1!@0#{5KO&IrG2p0AVaDCrr+wO%++rfoILsUUU2|G_Vj<{eg0(3 zs9q34F9<W2ZK(nvK5)E*g3bP8yxirPf27|5X*T%1u-Jl^Z@F|1|0Gxk=I3!k@DyOo z7{Drp{DAYbU#e#RUwzm=Ii%7Xh=>fH+^PDg1*>;&-k<Sq6qF!oU|RUb0P{r+G1E8@ zm+tUWaW{L24%HfCLC&p;h|hH@HDxt-E51eeTvOZHxjk)ah-)yYkCrtt_j#ei5K%}O zdsDhsLphLknJI$!#pYppR6D2i#BC!>#k<21YxWAVZ$m7+y6lfCX0V*6y>#xXzKd<a zbxVJFkU_IoO7hH%VEF(6ZYQ#C32JFppo;K2O#Ol2$Au@Gyic|c#*6ljc7;l3U7|P% zNl8TeoNo|PKA*(-R>Y{-6)_4Yy%c6787ycK(DzNUiOEN<Gp6Kv%E;T>t!7Ria1ec# zMP4}7av~4vh;TiQ4gILJMuU4%z%K^@HT*x8>TE7!6=+mA1CU<2PMQ`-1EdC0!9xOA z&1NQSW)`L(N)S1iv(9uK7KR88Ct~>>QBYA>xK+oXujPmo0kan&D~JY<`XbT+zy>?k zON)hcQM)=pUISn0C#3Z7ok?!{>{i1r2x<Q|{|QVfCp+hFHVW~8&u_?p^b7|lh~n9V zHf9o7n%s`EJ*fD$Ugf5_V-*`-m#{bPT#YkjiAVC$D;?{nH`#+OKqQi!`|`#6nI@tI z1=^&rjjbS>?ZgT~lqf;n=eF(nX|aNZSc;xE#<+ZbJ<%UC9x<R`+l5b~&eFh4XFVYl z9~Se3w~$en)9>~1w?u&{puy*_ntr(Y$b>N_v?*v#*AFj%1*3oNYo0%&4Lvy;%B$s7 zB3i=5157)Ns+hCYTkssy11So+^wp_>@3eNZA4rHghSyxTx{h$l$t~qjn?m>Gm5Cl& zkZZEI=TVIIkq!qUXO?m`frz>G-YuCxKIH(tw`<IMMVMoG+eVgu8~dE&M&yPlWA}b| z!v7~?pK}p8U=AHP_5tdK5FPRVZLtp^LHCETRRwxe#CmH^QOi@>2N^4p%lqak`tYPM zSrthd`(&Y|T*YT-?UPc3A1xw!D9$Jgt`Tm()GjjV(%Xjd_VQ*S9;>hOZ71-@dvs#@ z67jV%wcpa4I%$z3Ia^*SdOq~d=2dh1ul#Yc!(H)F@&&KNE2tmvORg&#j$u95tznP7 z1%K+AOO|=qezxw}X`SyNx6$X`s9)MOcQD!4?8BLD8y&FAbwXLV5$>2Kk~Ig?+6j`i zjM2I+o`-=;vJ9=(8UJYofj+8$qO(ScR^fIz3TBM@Vk^4qWNVnW-@c=Ls@*rD@JT)H z*X4Fx-px{S?=|_yCsN!~Ujzxm>JmN?&lv6cw_=|b4GJD8kF+!@tEZ!T2E(<?eg41f z&X=(dJ8Xsl3c2%|BhPD_FS4m8RC$Yjs)KJDUThRb5%QH5c;m|MS7(N0AA}!?=jX0b z#uN)f8R7-+!qlG`P_J+%fjq5v484lss2{1Dyq{(YU8PatHB{1ToPsuF$jG5{SP`J| zX|p4Zv8Rx^#x=k39oKice%y0H%f%bslR?r)G>;wI?TzToN(D(zR?H8Qm~$znLr+GP zO-}+;HoV&zLWtMxDhA%eKk8u<b`LbP?a^y<H*!{Ql_Ee*;NQ&ZC#v$$48u*Hz(G6m zyr$Mg6#&m7m_$P>L{O1`+q=8F&^Y3HW=k@03TS$2h>*2F@Y5-$uj|sAVnR81x^V1t z+jfZM<Db`XAZf*w_G=4>vd+`HK|jrY5eR-}ft087JOH{*ngIn31+!J7@9Q2`{X1(D z<Z&hX`GqvBeEU4SInQJ$Ao<QklK=`f@o&Gq+L+Bw3-o3|Vj0rEIg3L2JXis70z%@z zzyJ=gVg?6L2?98T9OwNo|AUYACwtFwqmC6XjXYq_#W<jSoV?FBiLN_0D7MC4{MtF{ zMyxv-Qd&}CjEu~op*KukZ_%kHoGbsF-ls1WE&H(QD#HaeAK<9oevY1^LWBx?=S{2A z@8+?}?9QJ@>vTOshsGjMPUU*y&g(kyMKz&$a%HMzJCg#=M*{l;p3N$8C1F_TIGpe0 z?K`9&V>c?yjmKkY?g#{MK0|PM^2{5{+{@k)y(+2NO-o86WobvVc)u-mWL)BYuPPU1 zqcFafog1nY^lgThvm&v!D=`JAtrXQ?g?Z?bKWGo$_nRSXh>Co$wGszM_Pn1;dOR+u z8XH;gHnp42?##-Y8{{_wlDGr{xIUcQJGklj>e$+6SuV_3sm*@kn;vJOoiW*)7%onK ziadg@gaUv0{=Wc!>4z7BMpr(2?Z(YeS>24mQANiDWhcrBycAeK=rcLoejP{mjb=}6 zMK|WDu(3X_=0i3#=*}|zuM*sYyX7qilRKKt6^4|R<AvPbO2RpGpVC>Th^SNgXSW1d zQt7yK(A#-D8hd06S+=bvABf%dt}f`^HYnru$3-Fv#RE-j^^8e6y5GgPgA=ZIy>zRK ztq^0p`jhQeP<i_r+B2t_j01Fm76WRGkYp)QTYIRAclEsD>X@D|mchHcT)TwpMI$Co zM;1?wqXj$y8D8Qsq56v;BzJwqU`j=2u1@`c+cL>RQcpvqC`7bHg-WuJl_9jd#y{xS z>b0#yZr3@4G9C|c2)`#o5cmV?G{BFF{D&`qBLk8lBETQOz+gfp`5;JV3LDmqevFiI zVAxUnEy((BON7|@`S~d>vzq@*A_PHH`1!$6#eX;v`XBkQfAUs+^~s87?&L&dcEr3+ zO`m(LqOm}7yF8MILs7_w_}$qCZFr)xr=bRs%dQk{m<SIFnQe0pF~!19Sc(}9G_uTS z?+vXrDr(tNz^T9W?8&ld48S)ohJVsHq&^V#^l)?cmNZIA9Gw}5?PAGuToU_63RyOS zxo5#^)`4o6MC(2uXfc&DBw|$pdO;y;GZUHHjJ_fdJxtVuaVbm@*<zlz6iBk=-HF@9 zdjG8*nMq;Ab*1J`&3m+*{=ANR8Y&?xYf9QA8!5Yncqq9&dZ@c|?XCl*$Ci61VmTR{ zI6cdrM(<J$fzh=lsn=JOZa5R`l42=obuq67NZ-UQ2{o@%i-UNp-<CThr@+LCZ7Y0+ zcr3!!Q~qs9^M&!;G^Jcn0+%a~+UyW6TW9e@TykDRC*hG*y#ajKY3>uI=@NY;Ju<xr z+XfV&4NYt^RDHXu)+%Z$)@vwz`ObZk4Ww=3*;f5*!?(Ul&*p{<D%DRxY0|g&&wsAR zCY2BJ{~8X8V7T*=Oo)4m&k&D5rg)`V!FsOLa1(ln?8Z0G2rMEj^V(C>1RNX*?UL0J z3w%E&P2L_|#)H@I)3ue8a+IM4cR#gt#e;}$^59Kp+HQO;E^nXOfsw=xZT(ciUMxql zD3@G{j+%1pjy7??t?D~fV}l=&Lgr_@_^nf-zSyb`+4H{K-A5nqetIyA32`I@;BIJp zYZs^UE?WDm^k7Q=5gDo<?gTaga3z3TJj{dh&;k>xMSHq>kHofBcGDB)CeND3Z(s5+ zGXU=>vSUJa1E4aE2ySEq-;@19y$BW?`=Xmx{zvEGxyB2mzX+Hr1h!-#L;#OD0t(O< z{f1X(82&rg|C8ku@_ygcPZD#tIFwd@IY;hbk;C+%ME-St<MVZj=A~EI{;E5>w>gk{ zlU!gUyyX@b<Xlrxij6&S1QJtP*zizHNb)}>H+~>8>5~iGc&6%NI;JAJbJ{<~CsIhV zb1RH6<ftYls6Cf-{g~ks<D`kl8Pj2SFOi#1>RQnk(-w)-HS83<YNzD~Ug4)$&N}1> zx`D(wx&-1-^^Nar-zr{5DBk>7RoT|ixXFhuMHSU$H(cv@v;JXgm~~B~q!T4$;P;|2 z`V7L+I7@-LA{&XV71@sIJe^J*|M(&q&4LvsL{tptM#CckX*kmf1rpkv36~eiEhYL2 zLfVZPa$X^3Z<NmWdA~3aP#r#p5PtLnAzy6@xJva6T3qyVXtBilguDm6)O{*CVD1|N z5KPb8-hb3$pdnxx&{z*}!$B-*Olb^3bQiz@q<VO<J|MUOAkE2kzBuI}b)dfp31|uy zsYKhed<APVbP~eIJ#TUInc`#4H<g~@V#X74uE5`Vq?~tm^JU63?-ZV*D5kS{%X&{a z#-kciaVQTul0$U_d;$*cYEYcf>l}XK?vHoy4Ley^kuwuRK}JpmIN7qud5+I_r7<xg zy$K%VQNX`y_vEf8(L`Qgb?*)?8&red5_*q-&DEMWbK>g@{}JA`DTS#!Mc&S;Q&j%Z zR~^!o$YhLnS+DEpiRP+4Bik1Y%*hME`c6*-cS<2F!8*<24e*RDCvCV*mB&_@<ihDt zmmEJY*9}!L)|(o9DkP>g_a$?k(OVLO{D?!)$9{c2eUufgj7Xxg5o?<sf1L~lV##=5 zOLnn=WC|w6w&!Yj5R4R<4%$Qe(~euf_$Xk<ndf#43n%{j+!m0}mAn9$4ti0&MaCus zLVd_|(5s9R3ME!C*2{V^3N{(ox?ODkZ!D6_i@{<OUYrQ2nE(UHE|63}paYT|0I&d% z8~`)LIC;Uz0nlU!3`#ja{2zb5KY5N1rw=k6>)UsGa2_98LEm4r6}?t(L#OlbSc|1X zvr9p*FpDF{;BmDrdeATkChqgNg<3iRzmBD`$7^VfB0+W;KJQ_;;k)!}6nZzWW%SEB zP4Ab;b*YYO=EjDc>=&AkPzPzy4I<Gs7TG!mkboTL7c$m|7oA-Qn;28QaFyYR$8Yl& ztI&78Cu%roT`J*|=InP3e8CTN#i#CJJyrPZy~OhHut;wc??oBQ+xq^fTW<GgdLsGk zrg!^K!^z?_gh%!7ufWr9OM777t(Tf+`{MYHzxNyY1efDsrRX3#bjQ{lCJVj}d9D0g zUBX<8xoe#Cz49?%a+Uj(gXAUhzet~Zj=yXi{)zn|y1wbV_Wj0D=bP<@$j0}Nc<;Cz z|3ew~FRVQ$ub658S|}&;yWx;j$`f73m+s;pW=KkrzEVq_G%>!aQ-Q0($PA;KL-98n z`Z$Nm>mjB^RsJ$jOgqPZVPwdykNO?dg0(8!q6He-WI+q1pZp|3cHZ|G-l2kT?<)=y zSR@{WF5f~LcZOj*4w*<;Z=@TM468@GL*h1wlSNXO#r`Up-WitbJ0~G+_Bxt#jd0v+ z*EPD>Ow-xLl07l4-gwmjC;O!!qG5KidbVa3Y)x0Y`)l|8u8U~FQl()vo2p~V^ufNW zWMpKC#b4l8Zj^fGN|%zzf{@d*#Xnp){UQ;C4u+edOf+Wo%UZHZFyWoC8m>d10sh2E zzE29ra_6c)zb60?3=l{F+>3{PS~>za_y;WA3I^lB<hN^sd1N&h9%iSxAzZJ2->d!F zu9*Da6+#3-0_SxO&WkPkUno&<u>V>m0pex8e?B?*Qwav_HGtV<+`u5L%lZcgSYqR+ zKEeM7pYiWV(fzt_F?F;ph6>-+S>8(^*N6v&;{{UOv5^!R38Z+mXjAbyYa8_wKKjis zxnF3;+Xf#Q?RgswW=QV6*5V8|7KJl!^Q|)`k#Ospusw`n5R_lz8h0nptGBrw6%!$$ zrt8yr+M5Npxe>>!46<v0mgL}kGozMdY+>*@iIgNnPTTA+BW*y%LqYaUvvyxRVKQzx zG`~BmEV`M!eZp%D&FCy8S!ElhQZyaWC&ur_KhCKdJk!g0MT%j-^NyKLaE$?}4%67V zzsl(aiBx{00rbcB_&KN_L=kUZU)>aUVodyG@odKdr-Q%9AvX%iZpi_mqFzId)&uJ3 zGg<~Gh<>C%JuM~0BI+w-dqf6{orCED?&q3V+I!PK3<cf}P%X3qj78}(wDrdrd^s%o zK||bVp~1-i$uFc!Fmd2FMXC$wDP(L4X)s#=*n9!5fRT%%g|i2R;>9p~3Q0#h7kl;# zQ4CmYRB0te$#czVb$0ODW#<L~8bM$roD&R(ab7+AufO4+lnsm5Za5v_@a`w2GO5v% zJZ_$;ndggqYAd*+mgau!(w_0{(9-q@N{)Vd&OFFk{CRbm(N`QSs}}O%4fZ5TpSPTX z^-_nk9`hBo-?2VXCf;oe4RWxMF*UW0@Da3cDQ2KT*k5X0@hy3OH=-uNCmQy}JIOfj z1Sx8zHNFx#WV-;?x6*1)eVwbP*oOGRykPAqiCy+Uf+rCrvr|Ten|N~V;h1*;Rim}< zRc@>Y<z6xi_poSC?ZaRh(iW9&Y++A+By7Q`ka;Q+l4+nYSM>N=^nsDX7VCREt$4r1 z5N$3GYuBBdk%k^C(^-jZw4Fm3i`VBSF~adqYmW1dyOv?D#YgZU#;m^QjYZ>eNj<&p zSVo%E2>V4Ee!_1SzLIfFY`qBDH3k`dVt%v<i=3N{9^ZO6zAX>Q*v(dww|<~VL)Sdz zq2pLcCxRG*u!is~?ct3c%v{aPd!pob(i5t31r%(9Zl*qP%*BFt*Vq<TaK}Y~jR+fJ zgD)5Mk|DY41dnz0dSgKz+xzx&=ZaqE)o^lX#39g#mIF`awfZ&?NL#AL|7Lv71O3p9 zOa}k{`lbLl;*0=TvGg(cPsHujyLsM0H}B+0F$T}LCc3teTV@LpMr`u!8_#t!p&`?M zKc0S%duxPhh)!qG;~T-MeQ@#pmB}XpuV?8LY`-@eA9CK7`?-bx-q-gJ)x@7$x<{qP zidXgW610;qVsJN+`q6rl?bV$I0_p?8g(~Fg`Hkgy@<XU)6GRpibPR|^1}@s6wx9i% zE!aknRPWZ+I$>zMqm1)ez2|URKCEBNpNF!6PpKOCN&dRV=D>o+dVLS>PEbn3Bj2N? z^{B`h{3JtSiCxo}VQ;(kjhj2<gMDKqbf5BHc9(p8;FEYl1-JQq^5I4l6IB`h^@zPt zE-m$mGw2@Wx?0-)&|uDxdn}Ix{pUZ%s=?PYHyppJ>AHW@znQ(8%E{^3+jie9etry2 zYX5tJFM`Td;z^qsf}T<(rM|bisV3lWFFS+O71D=%P1br%C%k88ps=f<is`<@n9LAu z|FUB*qGfi>2i)}ItnD6Vz3kKPMf5PN&EsAT9~`_Q@!nn2y`$vKd+pZKcdufTM-!?T z7h;HfrAqGcUmNI`%u<YDs;@mQ9_CbfuuLjzGn!u3b<1u=l#W|FlfLF!*lHMO<SO-x zQ~6{M>pP>BxD~OsK1ryt0=0@PB4b*Mr-<#3zTL>n44EpjTqIyD%e!r$^^SbzW|-?9 z%UYPrJU*wjkkYAFpP1hFnT#O=zQx$uBAq9^<1V9|tqGVVDPnDoE{~dF#BS-C-H?iY zn?%=qO{A_?&d*t4(X(bdh5CK-!YDl)wjeuf>a3@A#OrGWuOH4yhKtar!XXT1D|5Lu zZG|MQ<KLdwn%4UkPNtUeMl{98kZNj<fDYo3ub)%6z#Wc`=kzUV`ZDT{A6^;O2=K^y zK=>kg?v+vCfVV+GQ>rT=X8g9OK=&XT-4Ol-{yD`8tl4#`=nv2%6ge*&9g(q-f1Yvq zBJ9-{A?XL8Cd&@4OaecU^yA9mfAQV^luY!~xJG&)xKrUBwgyx`>ZMQp3h#>9Ssd(m zb_eEmS9xd(oZgK-*1L=P{&yA?3sL<f?X72x-)<f<XQKNHp)!@kjaTCYVR$s$#P)T2 zinu5}Y-z|wu6qIuHVL7N;d_BFF5J^ctAXY;_p*DP_Id#B>m98p!*Ke&(mC`;7B`Rj zy6K~qQ$h{Yc#E8IW}FuUK030oCZ7&9v>XaSEh2EP`7@O$<p|(8J)IT1P9e}*nVY^| zE*Htlp}(%yR|ogZ+<cjjR^O%kh1>TioShO1>9b-{T&cG(fUv!8ZQM?=Ta9s|XNz7N z_D+)FDVp_yvISl~?3C?#z;g%J*A{{P`2UtCirBsTFppK@Mv1KaiBaN{x%acgjlV4# z2ncvrbh=f(;9EE9&T*`=gmgnJ6p~m`1$Iyn{WZ>Bs}<+EdMK8XEaZ2GpFW|7wm6x| z1aygexi6I3THC=ggmdysbc8R}saY4CVa0AKy=GauVO<w(bULGCZl)?6P&>#?+0kSE zZD6Whsh~eHbbVLn&eND#Pjz}CHqyB_P`qLh+u}CkO7w9)`(|)txZ|O*mG9>6(PiBu zc5-q(z)xr=_q_gr1+f^Jg!#K*p~`jiC?B594mIiKMOGGX{U;q_3fR;s1IHXz(a?Db ztIV9_0yk-fgG2{zG6%W$7_i~gf1Fman}75X9!a)|e!_9!ouRx5+2*sj0QSj>s$NNT z5j}_{VgQ;YfXcpsk)5NxlbI0&G(bLNjAZ;_i*SZOEkPHs$2;e?h;go0LRpFVj?o+; zzu4mHcMBm_J^wYI_>bw8{2aat=#>D5FD|Amb{qIy6iSk}AsGT#mmio}$IZ(DnO=N; z2>hQD=s5HHU-{I3auD+$)iE-dY*k)`x3JzpT3tXyXJzuljwWt8s`d>xfqxD~)>!%; zJ)95?OLD8IIP-+n{_~vesp>7<R95XB>N(0fcvm_?bh)vP<jUq~LZiJLOyo@^spRH8 zhMRb6L}~YOdJYIQ%v<gEl%QI5<^8i&?RdV(EQklC$=)B6w3U|WGaJu&1z#6Vc5wFn z%_`4AGQ4#;Cl&5c<w8GxYkBLzHx3a7#u%@Oz1;ig%HHW{z7<HYZQr$LbrXdfOBy9Z zElV7F$;%jP^=`qVY~2C9bwuf1SG76ZnRjnCs4vehfxFk3S7d=3*R-=)`Lu=m^GL^A z`s>;PFYF08DcoLVl%6{Xze12--c?xgZ?#I4INnwaK0I0Yl%^AS|JiV=1Zkz*xl$)N zM5&V_4V1<j#C*xy24)8VH2(8eN(d?m7Q?w*TENPJAd`$hVhl7?g9lz+P`_cJuZWYt z{y;(Dejy?Q<^pj=blh=Jp-<?WUIPUzhO_s_qwyo64f?$;h4{=!JP+kh#AZrj1(2zQ zLo|9auWb|a7N2=HD@be32_P#Y;z_h8ls$g))O^7LcKy};`0|@i@hYyTp~lN6J<qpC z>SoT2n1@+fa1i)ZN$r?c06jk+FN`Cf#!lNrzpe?Qb@}3@PZGBOMxNFNjxKS26iq^s z!HRjsbuypf0mp0)k6=>?_b1F$(uPP8EXn)f<38wyPNa&od?W<YUqQ}^ua>FUCR)R` zqdf0HML0gxnVKbjB4M>UYY~^%sd^6`_2`9X6z@@-|H7<;#dlW`eObZ5<Ag7-)ed@8 z_}%N7J$iD2nGO)og93osZD-?T1R-`CfQ8Vg86v4Ee>kGwn^u4AV*#gTSBGxP$Y1S; zlejG>d%@bgBzNDIV`aXlEPfTf{E@hUyHfzNh0*!=5k-h7>^WnJAH)r)%>%;ooc!mp z!Oz40?%VYyO@E0!r%)OTw5ztT}G5x8yQd$(&ZwsD##ZY;<6X`b%x2V|1t`8c7w zB}Y12lvQGdZ|ZzpUo?La=HW`a*>=Q^DdGHFNX@tNOGrZRa-ro&)s$EyM%&oft&sMX z13s*nd&=;~JWCP*UN|OWGpMp}=X_8LZ@$897EsO6v~#sk%=fJ8-n2~AQ5<4Hw&KP^ z!gw@f*(-nm#Vfhwqb4WvWYerRxS+FHNu@mM)q}d1frJR|tkVWWCxM4DQR%CAqv09+ z^U<~T<n$s>&O~*M0t5pXi4v>^=QJ#Dp4s7zlYf=L*u3wLCs0I(s`RON^u|joSot;< zLA+UUE;=HY)1Se@&#VMFFyGAtKHgi@?=yNFGv6oVEy2Nm02==xtGR+aUUHG{31o^F z)k&0fJ@@HGLB2I_yg~9&!y2(ZM9;EUCMMN0;#%jFgrmR1b%Ei2yWGlj>V~5mFZ%Gm zJ<S<tAD-?HJ99XLWoWb3`9IXX1yogywl++6cT0C{LP|oAZX~6<q`SL8N{|pFBn1Jb zk(O>GltvJwOIpx>Z7|T+bNu4|=YH2Q7{kS0d#$xMb3U`5$*FHrZF(!hj=<IZa3)9U z2BC1w!;QT&{OtjSB^WHViRBNopM_w(7fJOx3mTFYE%*=DSds2jmucu2S$Nl6JdF&_ zDluweLJZ^DwSs*0m_c3O3k1&)mGz#&vubAvEbI7fuJO&Z_>W>uaqN!c(ojcG%Lg|$ zyeA*26@A@|JWZASdQ%JP8BAZKc9;W0d}D5<Cu(Ebp#~KMJO#e64BrT>G;%>TPe7h- z^fOMq0DA8NAG!^Q(g!@38j5S~Y-;>tuKdb}2YU<<TlIv)8$T2k3h)-7w1D2Z*HBQ9 zdDq<o@D>x7U%dkY5FR+Gh=h$UsVWYPg*n>WIbN#WwX(wHD?b=Y$W`pDU7P_P)b9hW zVAQ?rJ0kk+#4Bh2$A}q_A>;*mOo360tBT^~;dhpj|E9<KcS*e@^sMS#rSw(LuJD0b zd^Fbb#9?AVw4=n9$iyzV?zrUcS`#8qUuyxC_dN7Y27WJ-Rp2vKPHi+3-;_PD2{-p& z*?O5Y<jCHeN8(to1NG5F^y6s}^8`O?$pg`6)R25D>B5j98mO9K;wPga&mLORhS*E_ z3uEDSc~stjWxHjRdZ|#q{rSL52R0kTh--S2%G2hQhPjLaQf^CG-uZJ*IXKWEf}e}g zKpjDNoB`MfPrSGk=5Kd9zpe9`IdE0;d2Fmou(rGYN$166lqgwUOOitU+4!ROp@m^{ z%qDEIzIOTBry*SJ)CH*MNe_4W65l<!k)ab})Ag)W@djnpK+^O2g8tKDWKX|8SPO7s zk1%(xo$H4XLW5maKnS5kuiVyOtp(UmRk|jKfVKE3h$=s=1uKxxyC#VL)<9fl@<5kk zj36!!5Z9%FxPJKm!yW%-6Dlgc_>J1U*unGG$V0JljbxK;Hu)^K9l867!Ta#*HsiwD zTD`UjWm=jYGe51RGHfdC%s7daLuZ-~S;nllb!W7>xs1?>LpdQ`5h6-{QnPF{%9&cq zt#_-G*|HA29wo^MmK71c>l7AnDL9Y9-WYN>*wCpz(b#TjQNQ3A%AJg9qk8+G@Y6e* zlH?Eeya(0%l^M5^Y41GEZjip`C`SbfgVa1yXd<ytH!B+u(e18~XH=6YzA;6%cw2CK zz^5+3Kb>b5<&jCo4CS#&)V$#wZsJ|sET6kQvV{~qoiDcfUMCrhpzjvjpUn5k`)*F0 z6;C$$sqW{kd7Mp7xKh(QUD*U-kl?j$vn(g+REwDqZPTU4^lTcLjhqeeQrDeFxPP{; zT{8&ZT{er`MTM_EDC&Atz*gZ`7+`O7Cg?7Vj9Pv9-1OL{xeM0j9(g;-Zp~D%CY14+ z6yA<v9`dnF%DynLR7CQ=@gRca#$93e^fLL<lX1nNv=l}R5x%?avy+d}b{;~OzGUsS z5TzEiF0bGh8d#f>YRBzcJB3G2P?C<EWlz@cS>t(j>z-+HB1ca}rVzi8W`{J;2=9=` z@r<oA!u8H=Y;1GE990^OzCHf^$+Kx`^;h{{3Pf(cUI;hr3GbTc#-L2Ow_YyuSsl;G zwnYAzGF$OEsV9p#-7=_EZ+{BAk498ENfJ8RnxfxXbW7zcXH+b@1|%NaQ2ut0Jta=# zMUyo$^p!!l)|`4-sOK^^w7hCfjS2b5j}2W9=wdaXi%+g}5e>El0%%PY8HPiWA9TUE z4l!WGbiJmSe{D_uR-i`4Cj71G^r}Y11z!5_eHss&<X@gcF8#AFm6M$dC_sa!kbmt< z{qK6NzbSdufL!|XQsr0PQXQxap`JL;CzS*d9m!E~s*O9pXg*n>(EAiiNjRerPd;E5 z&X7~lTEgg9AEjD*TYvxA$(_(PkWPPru3smD^anIPwitqm_*p7E5C3UvDbj}4d3p@v zk$|Pyc{UH19AfwVM938kBagl;AE*|tK(DTr=cICPtsc2*H`4}7U4$J4BRxxiPn8ld zY)}Z%>`G?22$0F{e2jG{sx)FE6k!oaX+L{-wnQ(=roi#3;wg8e)r65w$r+?g<$@z? zl11g-LzK?Qz&E5S>)s2(qBU4rwF6UmaOQp4Za#UBb`!|V(MUxlR!+A*ORD&3z)0MX z(C;c;i2dpK{lk;{HGzG-=k&(<D<K+UxW>F$BUs-~Ij!bZ^gF)^;$>*2nalK8?)XD) zLT<Wg3ZW6@xg*CKjBb0oJ&TsaoSbANO<m6H_BvLX)Po%+^XXgtTq%sl2$EkZ%e?ju zHWqoII0;<niJ!QdmV`q)?(<5LMjvJ(g{xrTyz*a0snC6ZzfDF+68Zqg+&wy>kBmb4 z*l(1eIo;z#7r~?InU#D3w{?TZ2AZHp<h!G%>h`*G(~2H%Jl`bggwmNdWsSlI+*X^# z=v$Bt4{V9^;r-bB=zVg1TCphlXy&^oxSW`M$AKP)RV^aw3Ge6Cpr1<(jqbC)=weZq zGjV2QADnS1QkBdt5OqZS_#P@>@+HiGDE50plm&NwO7a{M1JTg1<GhtiJ;(n(&hw)K z{VGTUtS$}R&Q0teRu{}O08<BOd-k_v(QTr36N(CK3TU)fAFzlzNUwjz;E*k#@tU&# zyW;cTO2EI>mjRNK|Bd?cH~M^NY_{+Hs^mXA+ri=AziMf@%oqP#V*LN%pYLzj(`Cq` z_X3h@+UPCr<FA@p(Nt6u1~Kt(<5Ge=S2PKEqdSh4O+qSj96oO~)=dq_LsWLNIOTO& zIwalT6L={GpT3HACNI-YG0$Ka%Ry-v*b#QaHriVsk6c-7#9mQjeTihL-(y?z9a>w3 z_`??Fk7@W!UJyK<BAo8;ITt@+5c!2MHys@wi!LrVhZ#laL&(l|%zkhY;}GE|bFj7S zLw1os80me(lr%i_x$gFTlV}b3b8JkH;4MAXBd$yY$WItFaQHG)d!(Lb_fr4@@X4Jw ztbu#GJBaIIJ-Akj(6*eTC7EgvT}KF3iFNuj3!Hnw2B+F|n3d;v`>)ik{AnIsVNbyS z<Fj_vZfBNKl9?)4<8ABk9Io&q$?$}~Y2qc=$()>&L$5HKdwocBGw!#QJM}?Bo$0Q- zS!b_kd`5j{9TY8@am)Bq+Nmo?Qv3_IhLW_V7XZ_CXF!s=7TSxpu^0LGO7@KVYUN1p z#mVf%;nCmFD#iF5pu~$}-M=UJ`p|f(Vu_-Mns4m_*G%Go7;{+O>8X#zso++jzR}p8 z@X3O+1`|O>KxI4qRAO?T{YD9C6Flbb`1I^@^zJxEdC-c+Vr+9$_OoU|(yB4u^|$3Z z{EAk>u`OoS#?RI!bMX!WMv`#Qd<K%ZCf~%`I|X>9`!=Q+z7r2iiR;)11$EwR-u?Po zEj&ne2Q~rDVZS!zVa?`1py3|xiehpKqt=6~$l@xny(~^$&DY^jq6tm>z&Pk80N((Q z1}f(Y<GvNA&_iigP_KWfU{~hv#VL;Ob*TTv;uJT)nRfGP&KK;U0DW;k4*!eq_BYkf zAEHKUVzr}B6&GzU7NSsnj6CWWY=4GT(bpWN-{}`R`Vyowaq)c5Yi9Yx;1Oa1#^JEa z+-EOer|^=y;a)QNK$S_aupn9sv%xcPqbYi=qT~?`e6ma`BRpFrnOk!tdKHv6@uS*~ zI)3Jc39Pz}dp?W9aH0Bo(pFV`df{A~4elriDZ$o-1G1G_J}4gYyR|HR6uslt+CJ~I z7=p7;M-!#{sEy*u8)lKmC;Ly=>5!P5;yW{lOS=137qSl6;-cg~mva*z5qgF!*z6l( zhwEf6JVa7Xj?@|~D;__7hWN~&ab{9~-m%C4TMq)VN9Ig8cO4#@0xBl37rO27H@71o z9TbrI_mtAll+@!zcnxzBvKA}2xqFpqEb}vjp{$qNTY#Qepd%Ipbi`)Sh0<J0KmU|R za5%~aHoYv49G7|L>r*&?yzn0)m(&22FcOR8(D=;-nOZUA;(!u5#fjEhk~{7dC~4>G z%mTKC#PYHXhncXXw5_#kK@djb)kO#o>xwvK3DVk5!on4%XC1hRT2-ecgcn8`i)~aX z5BZG-$nEMGBHqr%Z;$Ha2xV)F9L_JB++kT8=PQ1bGhY)m+~QA2BHqFhy?Vlu>#Q!_ z0b8YrJ7+8A&KFkb`|6ViLHw%&yNuS|=$p~Hke^@M)a{7bcu27OB7G?eZ2h`ZY)js* z)T5sv{}?|SWf`(3OT@}a<t$IB(v}AOvmC*}#ofsm%NMJd=yT!kK9foxKbuP$B6n{y zz?!DH9c^{)E6RJ@1nc-o!25@+R~`+xW%ft&JIAlR@1rGVKehc4pzR5OwtHS_J0?U( zqwJ@5Q%jadiEs5^=ZR7MuJeM|JeoiErvEHdT?Hu||DyFBoM#4<{MXj^|I5q&O{-^= z9t~ri+<b%J?pb};{=#m1s1CDF*X{l0nlH?QiGDk$I~oQhoJeAu(E23))bY!O@#<KC z#|umc)1`*25f~5dTh~`WHI8$4NbyiD?rQPe<;2HY95Ik@ViUn!I>M(xiHdI_PW4Jv zM=jfa(;%s_<RR_F6+uTGJojRAO;h2E!n{_K$nz3}4g$2DH!9oK!x>nR*bip>jgFIw z#KL796b#g!Oj8khsKcWO8zbwKFE;t&o+ol@itswOzmJWYr!Bcr6?LoT&b|BP)cH1X zQSFZFx|}IBeRFzVJBfS5LcKi{tsN;)&vK5m-5wwMK2qZ%F}G~l6J3%lIj1KvQ~PGn zqd@@?|I3~4OHM5FeQ5M3bF&q>y&knOuU0|-?0koW1Mz^XL^ohSAXX4_7GoBDDD7W6 z->=mC4_aKHIutHO*f&4s2QjbCX;gKr3>mlaT6iQ}Y>irX=Oa!dc}<!C#21^)>A0D< z2SyW7_PQUJVWf&IynFUUKUw>AczTm6hu6PB5~9<cV^LNZ#Wu10z`8X0@iAg*{zB5@ zL87;QO#*{=D==|e(eVeMU!~LF*5|lJoWt!A3_p}b^A4=ZJ2=w+vUNK@BiNa*ZiXxb zZ;F99lnSEfRfMmte>fQ%P9-#TA%`7wnj|x*Nxic`6w01>{r0<hSZI6r+(%z8q&Sh@ z&*TNfJ(i#K`S|hWfKInn(n;RYgLYkageEVz3F#q1ZY3&Kgq0_-@{$DOcxx{vsxii2 zB{%29RH|NTG0yj$e^(IsBPa<7P}BWMfCgOwsBjse!pYx)5`<d|>T#kHFS1>%dhW${ z{W5$Ew%Y%hy_aB``)^}vU@Zq)+<zYaCm!K%NU(V8J*MMaVeaTtjb}<ZvB++5Jvn*X zSc8wWArZ;@As-effNE5Z@3dP&Xk;utpqveZyA2V5I5<cg)I2|M%Ryps!mJCn!j%p$ z*6RsblFxRH)Ki41i84<VJ~&f98QmKV_$S3p+w^ap{XE@M?}b>{>QHgWHY>EOYS}E= zH@jgppF<vnOcsh^XmS*}5R8xHG)XSfSskQto=77YM2+cJ@&`9(Ka-L35gJm|w|3Rb zlI4kiGDEpyGl)YJW7YR%paRDPze}6p2}kq(_Sq=1=vZ-$2*(u4*v?77_^St+!d1kp z()2m@Q|vIa$1m~r<&YHM3%6th^{V`y#=S11yFvo+tn2Stgny(Nep>fGZoIs1rT=)s zAN0E~o#&YpHWt#^tXR6@-SUI^QkX*z4}_=G1n06$!7VIx<6U14T5o9f)!L+cI)6-I zD8{T>vd_vMkPA<J7#(lFSd326^swlw@%RULgVCqW8QO?@<1tGr2QkKH!UfZnX7fg7 z6C<`F5B6EA*4<<>Gc*^O?zP;e+G3#(6c_SPO`uI#@Rus&+1Z`&Fu<EDSw$PLEfK@# zWs{zIFD}Gb$E`BNuLO6@y4tQGZEZ+FFb?zFU4WV2|9-(n87|J+yNK30UhBnp>&UMr zb#62opcZ24r|)Oh<|VzWDyb1*L7Oa%$j#!-N_9n_Hc}w5o_B|Lrf}&$KoaO&8&68I znY+|)l%KB8WoHV(rmb?rPt)uH=(P)=*Sfzr;<&O}uM>Ya${N><vZy#aAqfAf>VzR_ zZ3l2BU$%_dy0SPKvSVESxdApG_^ZHQg#D+vzIO7r7ccutc!3?E-~p9y4P)TGbKY-< zp#R@){5SQTLR(3FF!*#yG1B+*UQ`gx{dK7udyM6ENtiH=yT&7n=4L}AvqQvEOxq74 zV$#YO{7sA3x>&IKib>?`;j;yiKm)iB6i;TyqLpw-c9gc;S&z@x?(WC?EZB_S1jXpx zaoQJI8@F0|8Nsj4$7=^C5N@f>DBn?_T5BEA|M*m(cljdX5KADz{n5mXv+YAM!;uGF z5-(lQLRSeR$8D^~-SLug*1C~+H}<Kq6`fQcVu$b(H;{2vMZrebxkbI0zCj*ejHqH8 zH|WLVTxTyCPpNE-=TZ8iRD>3xn~-Tl;+fQh3FF%!uCL6Dt=5EhWZ*+Sj(Q(aSnRCt z-_7)U7&r7YEBLGW{vo~pQ+*A*%!tHMlY1kS*nD6HxC+0XU&#I@N|%B1gwscFMc3g6 z&71W(O<W!H997=u*6GYljfhWFn(ym9!<4FCMtEA$D`+S`DuGxb^g3(FSdDnUe&;#g z`#W{KPgmF?X>aXhDXE`!B3<wfv?JRqCnl%B%)i!89LMd!5lL^?buqz3{i+7q42}JY zy2D&&EOGSge7?c*f)z{3ByAySH-CpA7V-sd6$)wI7fWVKYIm}V0ul$K?cVO>5`5jr zwiC%vTgG;E_M~C+h!Cbz>wH~_43uYqA5xWP?Q5ph1r0w~z1NvI`XV?d(hpy1e79Le z<$!6e>!SKNP(S322*Gqf1q?~Yja+{_T=JedlyD@{2{X0DbEzH%TFZq??Zp1WcFfC+ z;PIB=4<&`61~P)=fTALNGrn93;~M1STbt4cY=b=0Og6uLy`X@iYpM!l1pn(-Npk<M z?#BF<bA-mm`}1zh%j_T6it~U~|I%0gjdtsQ&}aD@o|I(me)hjNmfn>+l#zYU2@yja z1(n&>V$WJz%0l`c&p9$DVVj#@KL$$@7s<+oJYoUKo7$daZm61wF=~CdmVU9s#0OAD zb{kr=m=EaFbb{kBfYt+NGd3&Uti^Fvu?<rAO!#`c?X?R9WQIeb;4H|!^x_i|--z7R z>~{{Ps85x>wj1718lcu`XUx~1D{CW{rMz5YU4vOQ3Y%l<eyh+bXF@hR6sB1(qu6T! zPfC&@(>cx--|y|<NYc?_zQJ+Plc1A071Hv!S;dD5@gO=Q{zkIZ-M%?Q?p(KbUSUdN z<3hF!mY?~gX~_`t{Jn0oY^>6S^n5YA@LlmvCLPcCi6{Rs|GxvwPdxF`79T1b?DM=} zPav|Y{v@%XA*J-2z+d8t2WE?GMSS)7?wa`+s;zjF+UmnMgV4fTQ#9qI8hvE^u32)M zO0KIWjwrcBd$my$6Jf!xIF>~)Tihlq3^F!|$46|%#ESAEH`R<t-D-7Wq@=ymZ)sqb zJa^)WVRP4svyhxLFjzT<7o;S|Z$HLcYk%i>+U?{$kH>~vBy?d#SDn3~RiAQWd`aE} zDFeIPu>O#bB&@!+(TmdW=u63MkL3~!JHc3D57(%6o(c+r;AL)z4P)}uy0tHyFt0?q zTcJ+HjLDw_42q6U2s68m8mHfzjm>|Lmc=S^%$g)Q)NsN1=?K}-*EgOiK(dVvv|WIq z%M+`^$MgYa*Xx0Lw8bT!V0>Rxb!GK0J4=pS>w~Uw+-L$oq6%1ifh#b9hT>BH?dt@I z{t6#>Ae<{pkNRT;m9(uf>vf}UYIiw@N`7VCzYn2u0G(c7YN{)}=D2?NUviJX>DyF4 zfidXf0H2CT-B){Fz?%1iLydd<SVQ(Zxs$>>)zEA56z~Y)Q<`jMd<>1S?ok=MtFSdz zz7Dx7?FRYfJN_Rc=+U3hOl$>xdY&KOmC_?ha1$rvd5S~=t77k7*qv6qBn=j&od_0x zPmSmM+xqw4Ks>0!Il;lbIoTrd)XT9uzPU$@X<#^6D4o`%e||8C(4kjhWo+E5h;Tq{ zu6y&19<R!>j$$;+7bPn0bF-Dcm|Q+Wh?*oQzIbG`FTAWHq_Am6@<Mj#@T6tTWU&T( zi)Y*_*nDGpv`o{2g*c5I8wAkwcVQfsi#Y|~^S*-T4mL{nSjPh$=(jMfI^6$odZlkF zAmx9S<A3T`i)V_(gNV<?uqG&&KF@qiYkT_@exauM;|YIow{I>nSS_>Zs>U!VC1$1) z;e3d7XEaL8p)-FnJVc}?xz_qJcW73G2v*^-?6!=Z+T9B3Y#yWy6IVu7=1&*5T;iI~ z9Nu*a^1P{nO){#>pNkOW_TqJuN-oJKk7dp8L1}xLDh|;#h^b6TxsbPBjVpy{vaYA- zd<-kp6?qqB8n?31=J9gp3ssAvCCj+#v^@0MI$?63QkkmS^be%f#Vd(<tzALSrw{4E z&|s{`zs_dqZiU^gVZwzf<;%BnUYlzF*dWhER-_}(sh@zz7H+2NmfS_^id{6myoZN~ zd2_sEn%cphIYk|L62Ed}NtsE{Wp#XbMv-f)4c5#*yKe>9X$=7df#zgqYwBotS;@c3 zd?SfgJx%#x%b@{V4h`6HsBg9$@|SWRICAE@rhF38?C5}UUN(2Zsa#(9yWb6sjdAsh zE3!*q@4(gIH(1{Q-bxNWuFJ`b>xch0m;Rfo#o^1`%;?=kebgm(hR1U*)!69g&vNtD zd%HsOqGo6k`Di;1$#D^jTx^)un<#0)cg}T4zeZH7;u8$S>wk_|T5nd+^(Lkrb@A9* z30~4ze$LQ-z)$}%&nuYQvf@I|wecxS>S&w-6}=CE@t*1}+6-6iWYL#jOLrAEXZey8 zg5dl<O5g78fPAT{WkxD^e!3=r^dz9xeit(81C^?Gcj-wS8N?&UG1VbMs)qH?8Bj?h z)pZX1mI%V=mG4En!ViU03JdB<791RQG&KU0Jaz6nOP~cor@W3SwB2{*u%!!XbNVzx zuv+<W-9_v^i~+fWMp(wDrmQ$B!AR=&Qxwy$uT+f_AkF!QX#+0^BSnKjf<chUdZrmX zswePktIQu%Noz3d6weV?LzZ;%@y8rm(B?z)`3aUcTxG|+d4t7xb;WGnH~UJ4(JSSc z&i!}pN5|`PyB<$h5EHH+yu`dPbP#K%uiz(buDG+B**wFJ;833NV1i4MBd*hw`Z!C* z8^$S?&kjG@v8qwF+w;UL=rz4UI^w#y@Jn+T;@3D+Cm*G$<A+JD&J6i>?ti3kfrEdC zRY^f^FX|95C6LD5l&_6yWu0~--s|*qN3>o+;YmNrgT$Fh@pQdSQ6=Nj1Ksu)STnu1 z3RyF7v|wFoHs2aA*59m#L5N?S%1A#lt0E{t%2%c3;(SBgI_5{jAA|gi!*=>yktTDJ zqwA5DeaXDsr7EF*ub4YK8D562#Ep>RgFiG0Di6@2Y~Tm!%8>oqod#}`42Zg>N?Ib{ z-CzW46b(~=o!ZeBVCJ_sWyiUsTZe(iMiz5%G%~bxwY0W2y{31nms{Z3zpZjb#>Tn& z#jo}3?|jyPqx<b;RZAP-E`~Pt;4N?8_*i%V`S?kzbh-Tf=X~}5Q&0QvnkpxlG~Erw zLsizfyp+?o%2!wk(7r6_7t)PZ_AGecQ@}%WQZ;DxJIZ8T;}4<66_}QUF@F7|J&{Oj zUe5E=<Q-B03{MZ5>9{Yu${#@!A`lmu^z$A~iLWxMah9k;-WG{0$mM#JGZ97YpWKQR z5-)K`fT)ZUN%^e5bymX~c@oZZrE9?Ey?^T3HC+NE0NiP5KE2qs5+-;%D3s@>&yB&f z*C=M>h4s&1B0}2^F%VFj`*L6-hvm724&LrqcItg7PqdS%`#7f^UhOr#M7QkvdiQ2) zUlrYBPLG+me26D*XXgWSiK2Mvqa+ra%{sHoMP3+49L}oP>`@`m!SOYkkRTl1GWy>0 z7fOVLh$RuyqyMl9SF6jAL@PIhe#r7atOE7#F4_N?Rbc<cDgd^CkNvVI>(VNGJN!Si z3YVAun^mZaxWS}oj^y#RgY3jlU~9y8s(iqPjk|=ab9&MQAHf*JNf{}(9rFquRaC7f zgEepGxFGs<ab0p>%#JXwd10WVu?o6Kv=2rSb+%R>+*yJ~##tWZzRTK;26fuI3hsoa znrhIREjXpo-fH^x+HO>E+{vG)tI{NrKFp&c!-_AD?2`t*>cn37^33zX5|sGqjd;lU zK8H5P+^V(ijlNt;=W_oT-Na)!2-%`BJ=U8_h@bqE4^Z$+`QGUdaJG{4Mzm2Li(_r+ zVLi++E)Ha^+Yl8I>ysgZ2t<8y8l@p5*M+~u9OcNV@94>^KE5(p3QI)lBL1Q;kA?(G zgZqN=o2355Do8G(L>;Mw-~Fpqh$4E~qib0CzK*F*W#nZ@hFc8YHm2ZooAIP}vgv0m z^LLCo)y2ztuWRtwx>t)yBQJ`HyvOy8hi1xW-RcTg-ca&}!Q)JRZBnngfJYNh>&5FY z$amxUJgsv>;T~MrQ|LQ~c*QlrjS4%N>^!>?d$+4cQ1VPpjP)p{)f5!jUDGiPW2#m7 zpJFzZ*?5yRma;6OSayY|SmYSicL-H_sJcHv>Vj%A8o>;dHD!y}YAXzTp>C1raY}RC zI$lat`${mjD3TZV*lAeHV8p+CcV=8^Kw&#U%5v)^6&a|%JF&a^@K&gwa6W71kq~oL z!Xu%1=7*7A1ESH<?@<tHG^(Xtsgi?>ovWb<z()Yoa4*dQMaQ0g?+;ai9Rt`1hJl1h z?Uh-8;jdPT`dyo@FGCTP|L#&DVPhz}*r|grPA+F@W9e*a^1bg78JpxPTM3jrEzQ19 zwTQSlTiAhV3fO^a6xd6H#-{mkg@1ScW!8fo7>Wfi{s#VCwjltAJl_s~+1B#k@_>KS z>}JENB$axN^Rs<(WPYM~On;N4%8`Zv&!HoRN37JUx2buLi9%*H<@$2zM3aXzgCbvl zfP>bC$Wtb>hjCtP9pf*4`}`I>0c^}gP|3R4BmuES<e>&pO8w!MtDyJfT%y%2S^U=V z*hW)c{-j|+HExA@4-IxkvUm4Pr8UV@e2evcGuI~MH-nsux~$)AGsuK6!r`2%u8dBZ z!bchNV7(pQeC<UpBKCBvFAM*@gXtit8T+v-Bw@D?v}SdZG-*B-?P@2A>%x**-@0x- z?e=oNexrE-Bpq5#uWH8&&m>X@G8u+Q=ou^V)?7k8JMMwkIpsB9ba)r<Hk^pvS&4gf zWrG5t?g9>o0x<gaZDbADmU2nT_5BzG8A<^zP&)CmvDq0r*|UC^UOO{0CqQ;g!Q*iM zG-H8~L|~_p93~JF6Bq(P1%43W5Sid0VIZ3{As|5kpFsg*-|qnh1q$dQ3TVG;YHev~ zYivqxXA5NKOv(S1B$|>Nd5|00dXU>2IsyzE!1@mtz*8YNG&VN1cfPuS+2sX*i`bGI z+S^+L@@`~pN)C84z@V$62|3_90joWL19D?KTNBI6K@#vrB4EgmnH<~|@KZ(Xfmq1d z(iprs4SfDD&jn_%x;oR8T*(f&iw7%+^2euw#KXH*+Wr2$u^QQ2>qC!{wb>eFsDmTi z<l`&aO%Ar|+nEOil!CuIU@KQXDB!6-&Y#Z74hYT-2>5T;vcM~F`aSn`&4~d5!pr1V z<QPuXmxHu~0>ZIeUq^!2Nel10)U)Pxe4g#k^aK|*%jNA;f(=)Rmn;d;20u$GWhs2! zrM}Vla`2Gue3MP(nUfc^ptJ1?-jj_y*7jy~IwdBf`X*Tt0W}>FQtGBaa!K8BF<(zS zi+LY;WqWrGQcki9sMK_n0VG((u2(U+E@v_}FZ^Q=)$7uU48G{LzV)2JbRVA3ZLJx9 z&XEeuAK9-;!^a-rg-xkkFJYbi>d6_5wKT1B>>H<zeo)TJ`aR09ljK9Ri}n75T)g(X z1nU%oFZNb~1D5NHLh1MKXz5~Ql#oppE+bhL_+^DL4DCnAk8O4=u6Pb}Q$@-+bDv&9 zKZdIzAS8g$T#K%OeSc-fKfoVq15n40z>g9X<nL3WpnzBG-$<C@v5D1zOM&H&9Q+?( zdK;L9`c9#CeT~Jpv%anUy9we1qdYP;^N+Xx=svlW-|JWVX&eCR|10A_a801Uf0oO6 z*h~HeM8;65&|_3cL`XbLOItI$+t*LIERunzt$|ga?0h%DT<<_n%g@9A;h*l`g&TwX z4!|sB_q_zQx5e+A(N4D~kJKdZnM$I;s?BVqa0}?D=#GMhcsCnGBDQEm5vlJZ=~Z~o z-er+n8JqCYx>sa6CXLNPEl;9kSJfJ#dh3hBhfy8TQ~!l{A|!1-Zu3vVYTm@cmHH-5 zTuYT$&0!`dQ&?Yl=vpi8yxQ@yWwkuMg!<n+2ykR^%TLM9PAM@}+K89;hU`gRw@^V~ zz!6i|YRBLzKSp350Yr>^W1*&Bwg*JjtF;GZB9rJ`+Y|wWSsc>z2kkNH<99hPl*WBi zt)V~k$es6D7n@bcP(&|Rp>POcyzIBmo=HoQgVO#qSob8)5lyB>SYQRu;-qQIS*}5Q z+~~%g*-M>32JDBOiJhV0RfvpqNZn!dLmhxw>_8ZRfghUaTZsG*o$$IAAxnyW&*&nc zU`aZf8Uip+E)N(4i_2)4{aaNR9tB>-(Avz-(S)4{L;x0SBos_w+81~VAle}R?l^rH zdK3Z?5n$=vHK_l-2kO!Z0`EJ&77+tAUx38?8$;=T>%;xc0cyIPabWv?-8GCvUR*4u zNuoOlE~Az43&D+;4^RNhpsrFR9y@Xx+;E3I<$yGcs&Rj{t%U@#%6gw1bxVVz!ulR= z>49n*7Se0amz)NRQxR&PC^bLL%?#}Xh2}&jDrQ>jr^HDF({;HvFZJJKj?#lSF%4{y zDld#bHOzD+S1OF}GOOBfH-c8*jU>WeXMakTm3qN@bVSFYX$OCJzxFc@Q(4Wk{t07! zr|2oz)I#3EK74m><&w202k!h2hR`QP7gJD**)q`}=XNqvrT19oOPuA2Q>r98mKjD) z;|RKp(wl<1XuX6YX}VfwGgfX|V323TzMFgVIyfCwZ<Vd*$^i;!0mcum8RRTXV8s5> z9{lEF8N*Isp5HJixAM2%k3STTy}$<h28=Vv5yYFtoy8T(@eL@A0p@@!0XH_h1WG`b zu8GojNxJOg1m2g$5&C0S+>du&Hhlh@_x-`zBB-B3?LJ=pntL|k)hXsbsMy|d1fkiV zU)_KsZ2{xDy0Wdi359Mj@j!_{kyZh6X{9`GySc$xRiydi9ILiVQR^VW0M^f-23F?N z(Oz3~d!2J=HH**v{x_c_X4yIytX{w7f@b!4G^^EyR)Cb+3L907!uCmrf5@6g4KZv^ z<+iov&UtmQsV&SA@r=NN7H;R0$-R40APQ4x>&-O^r_IOE*$X_+vv3Jw&+4HD3z&;A zu$jk}5on7klMPPd^qj|X(o`Dvi!2s$Y}?*izj%uNq<O>Qqxyd7{t^=}KVm@D{gAg! zEL*}vH7|`94~>`u$E+Ykl=k?7GLzQ0AEnq{A`7;miOJ<`nu7~q1%W-gCYR9`(jf!t z{7;0T1Q3P{Kp41xg)rvV5JpA(d$J7)8(GA}<f>*QB6=;i_T#szs!Bf$^3UnyA1^C^ ze<(2KfJ3cIGy(QugM)1@uA7(1@9T%4|JZ~44LLrLrG1$})C$YZlx)J(FAD}HKLkA7 zYt}$jn<ylV?RZ}oHXSx14>4`G6j9^fU=grL<3hIOQet;untY|iN~?>}VM7>lu&OYJ zytk(-@u}QB?+8uQbIFgme|Wcs{(^D+Nkw@b%(IK5uF4m+j9H&G_XxA>>}h<3EM@%A zDc|ipN5D*DNPYiIOgs%sPbkCY?)k?oK?}BBS$l76-scUtG<y?+#W^kP6Kt6aUvci8 z2S1z)^OghFH)W2nV4e{0^Uu*t9*^GM%7w#fzx6)8RsH5J&WtHHqHS?5eAms9HfT<6 zZ5LV_(LJpDckE;x63@6ux3Fz{{rytdtm{nQt$jm|F;KwBHRRw+iZY7Q=^68{*F;Yi z#znZ(pHlE^M&uuf^?-OVZUByc1SlZXALmb3$iAOz`5*hs2mZt7y!71(i(S@FqD&2w zu<I>hc0zlxv$~!snh*;U92K%KtHr|BfYwE=NLy%>Sqhp_Dz<hI{Hz5eh}H@2%)9oV znuVq_TO6+8pRiXDv`<L+P{~=e`o4n1vFn($oqGi%YISm?<Fh<<7Pf(U^RD^ulVn%e zhr&r+kSmsIynYylsXa^j`MpAc#!}A~5u}8k?Y|5$%C9V#Y~)F|sA5s~DX$UEdI3MN zrZ_Vv?f~NOBW6WBZN8hm-R3U@r^BjtyOsFRUc7up_w2|~%k7Qvz>sDHgs8Ew2j8$* zd7!Nb;p*%{Yq-`3nZv^y)F9_&vcfq5Iv&5E(kE_1yPy|eWm8u>voFyE{l2M(ttk)+ zUd!9GhEK)(KoaOR07aGo*L~m$Nw6>}8tAOmB+E1vcE$!L7+&UtT=&7igKu)zpatj> z#{ywodL!6~vf}p?#P6s|tFWV9iV)zj!`xL=RQ>L-Kx1S6IE5Vi0stbH_yMLS0UT`b zKX6J0z>gn?|HXIv8%T6sRN#kXKc^*5vb;$lm>YgJH*LUu8{e`G$M|#YWScWC4{Q1` z`GDnvV2+#+Ih@MJ`!p4*j6uRIP3WI)nT&kRQrdA-yruA77}+EwtzOgj&1<7k6Plc{ zm&pQdy2gy03FiZWsE<{X!Var8q6f4`dO>VG;SyB?sF;-mvD+irLb|xC^h5Kn;~rc0 zkD!RVRq$^_#*wa-nOH@56$##PKKo!!nf-Z2zWvasr<bO($KQanXx1wWs`(KOl3tHK zgI6VfK$J}Y;qYXT4s5K5C6VPF|IEU&g|+DTC_1JbT7v=f{oJQeK`{gYZTOLQa8GSM zkz(X(rHdI-QFy-lJaXN=zyhl|HYDWN9|Y<!|L`d^u3QKukOD|9OD0PyRN|Wpac#Vs z<<gz_;fVr$;dVA`vft&B?T1L{gGECBj>x53@v~6AQ$v+JTo~_{Ka@|=!j;+YCh~sx zmqPg;Pq^k@d?!L7Vz*2cZCkz_l9QS6+ITFMg0GN};*00`Yx&!sm{w&=wB_zS?40pM zF7wt;3c26dWmn(YbkfOhF8i<()>4R?WtTX<Q%HDIl;EK?G<BryDY-e5w@oou4<jWf z>RX@K?Kj*eqTM&sYzYnf9+>Z16bw_tuDr&t7ccd`Q|0dtEl=(QdwvHa<EEvkOCn7m zQ~s?ug1OeBvQI2Y%}E7A1j+C3E#{OF;TfVHV>_rk<hc+igCMnz!YPw@6kUDSyPrj2 z;Qg8`(stSx&y<f0^~6&o^)vSeV9;o97i~BRd{HXIq*H60j*;C_B-q0J+8CN*ww*@f zz-6tp_fomfEJL2*5)hCK?X0g-xL}$hg3b61#~)Y#TL|QEa{)Yv{#Raw@io;48r;5Z zLO{aC76Ddx1L-PqMO$l2TT_5g7U)v}cwxc70FBM^+pGUBMN57~Rs`-@0Y+QDAp$3` zQXAk>=K>FpX@UMD5Aipq*?tjm(ltSOjHBomB0URweW*3fl1`($YVxz4C}%IsV66t+ zD`%jl6#_oJE%0_|a52u(U4loE+N5cRCO`O!b_?t4;|K3M$B8R#D3@ML`%##bg*IqV zGEPVaXov->t2Bn<Kq8;}Ip=DX?$u*fJ=WCnujFw@<n-o{gw|=#3z9m}P`3@>rXx_? zd`#aqR{7Q&MF@pyz8B_gXUw{$LSb$m0g1JE%2SaMmN#8C4+!_3d(;F7H^K$dv0!Mz zR=LC0u}!1gkBjrgxySn|ks5n>Bm-xDG*Dh**Prh$2l`U*OV2y|dUN{1q_ayeiL<g9 zsi19HA#uZW@?BiIk`0^YLTARLrW+ZXWz?oteUv^|`s3FoHbV-oPt|)bXqw~KX)c6^ zN|;+`U`T3m4BzzjV2sPr!oZ}u`JAo)gN$}TH{E{FoZc%vw~woNw#IF!x`xBiZ>+T_ z(0b{g4l=GKbx939vLj8P>F(@oZAF1Cp>2QT^5#9Gd5fTSUfRZx7g1pbj`%WqR+{M? z8-3%TU7}f#6vMl9)9A8?lO~yJ8nn%JeLU=`PYqs?JdfbwFsi*n0q2O4tz#q6amFwN znv0lm(4MX45t>&ztc9ncU2drQA^=rUbJBFDH4HQH36(W|WNjoJimK#pQALY?bQawP zDd7@)jGKKg(}9ocg8LP1^iyz){XhJppU@>Q-fF@7%BjdQoBZR}A!Rld&f6!yK-V8n z_%$yXdfoh9<|P3tTJ!sGb^7AB7-cytR*3K4Q=sgxtI4J5DQMqSeS~cC>4m1Ep7Qz2 zWG_0?w&mWBs3<gEMoVXzm0>mF5@kVo$x_jIjeB@Zk6oEPZyH!*`X~1nCEQ(MTCv<J zI^kwvc56128Zkz$)4sb!P<}_0GXI5J>6~T9Ko?2&i#!sH&jd|G_Oq=CvP}$H8NxT4 zmVJ~@)D~!5sKUr}X6iG_ODZg<@q>Df=TI6DX5ya|4!_0aamu?{d+ysIb{p>X#tEgr zj^rTJ5@x2@*NZfcejgKMv<(efSN<h3N`ba~?peZ}f^)1-v@Q48L*&xm4bA8F_cJ{F znrP#ygN=~9zm<n9KfBsvfo3)efyRlY-H^1*5m#8zX&v<3Z9B@>_eD|h==;6umKW>c zEgwhY*60%wy)3+v8IjCcLZEmtK0q6eP0?_7A!xE>7bus3kfaauEyLhh#3Wo}7?;y- zy(P#wPv^zx@4WS<3ZLKZqLilb(D9zh3ui`NeFC}pAqN;O?y+XJ)b!QK`WHznP_h)+ z+T*Q?v89$aD$|e;t8~Z+W=*tu3Fw84VK6U99zdYi^30n@W|$R0S;c?F?q$;rY6yF1 zJwvUG2Sa0aRx#OD&(M@6#T%G<(0ogVo$$0dhJq8P7qEn%2S3L;_+97`W}(Z**S4!R zz?F-~(#Ge+d?~u}?TlS)j7+UroPj(Mh@AyYB;@NjBcJ>e&(#4u2P!2n{NH>#n6}>d zfcIsGEmYGloz`tlpVwa(F0gOM@hiapY(bPWb*2Na6*qSDuy_7`5;Qi{-OI&QK#w6% zRs%4bgB`pI9603qc6d_@M9xkIBDt~zxW7CytEsbvC$L%`D6>#re-Oya>^nLH@OvaE zz`KX&t3-df0ITkY%3ejf#wZ>6^z1IDEyjj&U1cF!I8?hwgG+)){YoKu^5hteXD1<i z{k^BJZ-k|~Gt<;D@)Mbu({+bv2ot5EGNfPNk9~eH@;1TKkH0Pc*0f97E5GH8#j1e1 zY+SK3iRg`CXksfiEnF8%+T}^b%;Skyns+@1I9;j*t72XvV9(1O4;YiMb(<z+ljd3B zH*oph9UB|tgZS9ZtSl5jF3&!8+!@(s@+9r)i+#_WvYYb~wQHFjHnkVKpXVMvdm7^a z`%r4ndx-vH6=Ww-0RvT|-gE6ybsmCH<sqDH@nS;sCdD12@I3OyITMj*j|QuFmQthq zr1riw@CHIT0)D#fuRa)T)>SY^0|WkB{bX?b{y!)X$`3aV3IuU2@_R%x^a$OWlN)Ht zlUWD}@v3Sn^Z5mwa9AtwYc$pSN|g|AuiPlhh{9>>1gU+$2T*d821)*8jRZ<=xZiv~ zM^08dR%=s0R#@#E&41RGKv1FIYfHc>mOoEn1Brqk5)<YYh%fNZG7<<>znq*|9l!C? zvl!a}-9kWIV`uwAisZo8Acq0=QiBlS;LHP1AfX_E!A0cD`d#2W;K@RQ=s~pKKL8XY z9?|!Fm%S74FwRckM+U_E@~HzMVZPB|PIy4UK*0nY!UXI?>_WIgh;;Y9n5UGG!RXB9 zM-&ayQ(%uGhThna?XuX7GkOGf1lB{cG{s;D2pDJxNsu@cxvZ^Z{}zmZ-*L0f3xc<k z4EXM~#_$VC&)dY!;QS&G(V-|H+K3&}h&kk?XzVw*qf&9tNItdduh}qAR$+)Je%MDV z2ktA8r?%m87EcbU%89T%_~e7hEaKdBAzd3%ynk;0#YXbmee<r}S3=bJ&2;<%{~g`E z(|oj2mly7R%~o{@??$#DjJeG31NTh`*F^pbvznDk>Kh$oTgZHP5(v-Do_0<bU?D&- zDzbE4FTXp|MkuzGzI*X;Upnn%@Uf8zxyshp+Xt7Glae0^GOUq|Po4Ran5L`d`F_s7 zVI211ofvj$q8A)KF(iD5g_MA3iND{>DOc_%Of=Z?4ji)ObK$_pC1)9hAfq6%mke?1 z?Zyn*CkFsgR;Z+|@q;7dviSMVujKe57C7<1+~|$8Vv=54r}H;GD%3uvw3;Y%<1CL` z{MJJCU+lL%Yto_F)GZv=`jm>;OSDJ)4t1-$RKYX)-EA6v97TI`;@tjoVP`TnWa42? zToD+-hC|Y24U5xhPtE6_#q#0$pd|@UVatR4Sjt!2Q%_}u!i?$RaFF5EyWAM6^23e` zdCi8En2j#c7wdbT&eR>;(`IP>Elo$~tnveZVfX>?1&RUCWdF*cw)+mHaM)1)GEMhw zJ1H_Y>5n{|__v#qU(eTlBa{M`6#etOKc(w<FIP5z!|luL9rzIRAAg{~VSmjr5$DQ2 z1Plw`f`azejRtG<fvPjA>cP3kn4HPE401jXGaF?Z9&SMsEyWHk+bC&GBr_yx`Ik$3 zPO~Om)b=*>@UoBz#fv<*SMS<Y6kg?c;@sOEr@GdukM5q4c3S|g#PFFOPVAGgY%8Ui zw`mGxuod|ZiRlg%N(M+>*crU=p-_cug_g7gam8}wid4n?iox&Z2Q%MW+P!)!`u4uq zhpy+_HX{0tS`G+26&|L!_p%asjv?4k+Y%h7hIt*QaSFxTbs2qXDks{vO9rsTYI>Mv z??BL;8P-`^X;NX<6mZ6>yWBe*V0bH0gT!Q7Jt}I4`?A*S^Uj*C$~c$Sw^`1B8BoCF zHSm7knBvJ*Nqc<OPOG{D-MB#Ar%Lp<v|TC~AAz)8JSZT>ALmb3$aczg_>W7#zewMe zKVAr-X`7&0M1KUAkRg(iJ{jy0FiED315d?m8e9I(?Ny10wWL9ia``ET;K%bLTI?== zyu4<u^ROXzj|hsiMLBq+(3=hWbIR>+9@WhFDs0<dknnAwKq=#}#5Ce9w9ZSoe58K9 zc_3OD^3Wc`ygmc&rVPO-lV`uOXtt;E$jYni4yHElCT!G|Mq^(OuL4BW+r?J1v5~Kj zj-rV~VU@?k4>JplC@gTv?+B!R^lqenR}_!$6fUez%+5<t>42U#(2e#ahL!kzbV^X) z4fZ`TxlR}-X;%aEu9HT5|NE?K{c>npX&&h0NUY;ejA_Z#5)$79;%j*gH+01+gu+~b z%=cd0tJ1sq_l>E3Pcwdk3@HFIgaF7uLSY!%_en?Vr-(CrEYF`*()PTL-ry$pfZl6( z^IynW^<T6@6kwBZF#>uGev(T3$Qpqg1%8zF0fuzR|M3e`|Mx!Z-(a!~3AJsUdD^^= zWjT><Hm_-+Tt2qKP+efc`}M(qP-tIH_~QF_xt1MOi_NY1l1h3Kd{N_%>Z|N<nlT3H zu%Ez6K4$mCes^PX6pAP6IkV($OaNQ~DhOrcSOA@zbjDF)I}fT``*n}HrCbL=YrGfo zI5x!NhMm_^LJ|h#A&ld3)dNvk{T#D37q``3Dv_v{_CIiw?;@8kV0YcINQjIhLkLiR z`P}m9-Qhlxb}GResbAz)@r+|S5n_(mkKUXuyUtdTBs`TK7=RqG7$~x=f4V`6nx0FZ z-<s7iA|Z!w^QOd1_)+vi@EG@3%6lEBm<EOVFh2W4M>L{_=<PDKLJ^mV%iqNPvJAjQ zi!0FbK>m(2Y2zA2!dtWSnz@eJ;Saj{u9Pjbr@{REr_oiPHx2ey2Vu&)XA7WXL7!6Q zb60ZN=SNA9C1xDSg-f?#1#&rsk@-sO-JN7pndU)ls^x{Z)Uv<e(GQ3=I@|hB(}@)f zis_CK$EBc>i6*{)V1^lXehLLkX>2?YRQ0*l#^}DK%Z0AJNZnzx_k2?;hZ7}5lxBbz zZoFsxl8IEg-)C-`sifgOY8?Do0{{CGRD7z3F-C|mq=|9)k5_0GMa7@h#yxLBh%G`E zB}g1{<a__(&I0{V%||V3?EBIcUzZ5HBceEUOE}*aoKEqp^=M+8KHJf%9+H)vXS~Fb zpIJX}l!zZ5JW})nKcIoEA2g8lgZl5x`du;5{+{&%=2Q8AP!b?M{*Pq+*#8=c7P778 zTEam~zFuQY`AV2$pVq1L(l>A3LY~+gy*k;#hb2EMdCerW=jl#XXtRN7x~yt=n^cDk zUo+0qJ+)=RO6TrMSUw%Ryu~Eg1+3D0Q8}Cznk4ySxHa!G-_AG``=&KNj^RY7ytu*o z5uSU;h_7R|ubu{nY7V7SP+%|+VZ}^nO8FKZ|5I4MteLR!^mE6eEFbp|HSB6+rmw~f z%P9=DFgP4L5@^Uy;$#TiCFgxXJVHvu(<Gz!(?V6?%XdoP+)sj2zfe4o^RGq;JTkNQ zAR1MCI<z+=Q7(%vG#hSI8(oA*f6KEg`90b4L1s%!DRowN_9Xg*7j2*=hhV`~dEhTu zFNo)pPmer~Y@LhzI0Xan-^vYf&ixWt{_%vrWxaqjfOq7`4FaCPh1&9`Tk1*OMuzFI zIRkA*w1xv1cyIeFO}U0KBcB%*!J6$jf3nffNG&^x`n+-XC2UHL9b<=TBTb`zX?N(l z1aoUeW9yo<Jpo=a0(La{0x>JUWFOfF2vCytf%wxFqH;)u;>H##TVr8=nGX1^nMJ#< zR-?To#|fBjXLIDU@ZxO9Zo6HavNx#%$`5_FSb4h|2PKpQ9hW?4G9HIBVUW+})pBG$ zSYVi^a1ITeW(x#$cHIoEIDMoqF^wXA@k!~mUFU15=Mwqv=_HXz(H>U=!^g(^3qC|m z=L_?1y9%t!PfP0sE}SbdS2a=n8%7KL`BS%C`X#*n=n{P2q3AN9{!^vl0hNXZRN5L? zqF%>l&>x<e?J0p+t8H%`S@s)9g8q+}DE{vlu>Yw`6#pOkjQ_4zuOJ+f!kPIa5%g}# z`(y!h3WUA%>EyMv^EMbb>?ZxY-Th?DSnABRke1B-sW+aNKPvTr*~jK<^-8HnU|wwt z#%6wIxrTVqRRonQ+D4@)^KKU{=QF!?&x&0t9sJ?Sft>pjn+=K3v%1h8)%}<4Wn&T~ zT0OX+uc+3CENC`^er|uXzCf>@BkQT($ezRJ_9sUjddiWvQ)(?v9+L#UTg+(ux|O|R zw$6rl(ED~hk16Sh+8|V3j5R2)oh56u)ZNm~amu<BVb?f;XXRBp2>-cTzx2&#L+@fo znra9hNjh1nQgWHFRO3Cqr(LOhkG}#L=KyQoJnP^&hl$<`2}inUEUyl+%F;`X!Tvs+ z{evpa92gn}=wHw29{x}n7+~cn^cO&7R<1&I4BQgiM8cOIvLZ)xMXw3aZ(LU!aHcdM z<yTkwXR7qqX>DNnHxPFLrEn0vF#}ND0?1u|IRWrxCF~r@4X<VzJb{(MKsz_kOK$CP zt$_C99ZHUtHinKK*Bbl&>=*-;GA__1t;=Oeos$P3b@|cY_y6#t|IN*vS=2MqB<0lL z<KR5o=nIQ37?YWW3tu;hVNc29jU!7LVl`&km1q!q8Ij#Wk0NbPk(6oDlK&73%9J*= zGcRKI>}_zCeVHOrvM`+3c+Z9-hR+9f`p+bWEA;SUP6?Ej1<>Kv8OGgrr&8!XBFNbb zRrX-Dc9;k0a(;rw+_V~2Ssbb7Hc0e;1xy-i<NMCvP9!TvZKI&K5C1wrYi(@+L!+SP z>$B6GC^c6@I&1#`RzE!N@qXL(`p9h&8zWv)b+`^_No8`vb1w{JG^0{iwPt;{CLw7^ z6~Po5Xjf`2(#q+Gb&uuhid(|<a`Ym8a3xkTt;0vKq&_R6p-Xw=l2-=!k2{KgHK5nm zo40%P#$+o%lakEbpJvxi6cPscvHT{^m##8P2lkM<zn7<bV`eFH>c^d_`9wWL%Yu)# z7SWB4O_D`u$yl{AdnTiN^E6yztpf@HyXY|O)D>KhI`f}_<}D1J-k!#UMC_pHCDF?; z(#2xLuzH8KLp_;7aWh2|Lru82sKDbs!$c*GMuU&AVo*PJJeb8zce`n(QH-tfE~fQ% z$6IVXEyu1JOUQQ57eSB~J`Y5)6A4;rbk29b1VM#)qoNM6BIwB6Mitr&FkGRY?p;7* zfqyBaKJ(yEBm`dSF$!{@w6M=+%>__@k02`EdPVjW0s#S^F;ItHS0a)HJ@m2jr1<Bt z+b=wyS+In@Or?C^%G8y9@=3oi5Nm@FljRaEFrC~iot(fFs^)gqCgxYe<iw43sk}e1 z0v4cAg#{DCf1^=Fgm`tE<j$d<V)^xN6&!DiU&DwyQr{<Gk+4xzz&E+1ZW58aHpBY! z*OI`^f%X`1q<d8n=LU$~0rpf*5a&&x!oqp|@W1Ldf2(<yec1MmqDI5AEmC5^6T6j= zpwnBc8=N4D&Ddb75qMijgL*(IiiWYq?tCX_xa9^EwG8&7SSsuldQFI@l3j2G!BkAI z8XqzFsr5&-YTQ6GGDV*iRF8C;D)qIg4<PXsjV8Z2c}G6@EO`1Z^CvVqH{|=xm~4*j znXK=GRtR{s7#&ZijN%fKdT*q!RR}QkeS*Yp)*5Q9LNaKatx7dfsm*#+VYf)@79YJ} zgaMVwg`PW}z^Odf^q@Z2(?Gy#I+JO0ZVpn|R(@G2w6C&kOYC+>uU7Qb8z%3<?WX)? zq-SV(^RRbo)Ve5jIjoYCjj^YDraid5LilAm?nazaf6Q<z3jC@@lILK_Gy+AvUqL%| ze+ouzxfQ9)2E-G`_~8i-ryd@@T8DO3A6G=eUIuM!HvCxUOLwJd6cl7{<Y<w%b!)TH z;m1$qUvl)n!=D<c88pinyU_dEm@LHL^3k`zNVANFD^H|LumM%67aAHJLF-16le<xK znIn!RTHZ1=ntKc_z347HvJp9kIiJK?5p+Kcucz4#c~DifjCxEw#CeQP;9Pjt>qQG& zp9ebvv!(~SCCWS0{-w{<lkHBQ`%D=Mr??5^#aEL=(@vS@AlkGpsxH;_%E|f1x_KF- zk<C}{OOc_~E2!F}EWFPl%5hT~YBx^UlqAg9Sh+vgdIdfKB>>UUuSF<;AoAZ-!L@0; z9_5-U`_}S(YH>HyTjl?_yZuW%@W&G*uBtiU1sJ!09b_TSkoSOk4kVa>@>&Il{CmmC z)ZWg?(%H_@gY}30UiKONrjgKrK=quieksv=ue4<je`WdI_@Qcf(7~$#Jy<WrOc%2< zfmL<ib4Pbx=t(9cVu-qvHG_fvLFLFUC3f5QGQI?CmiMX!O#+yff`V5l!(x0EwxLoD zYsn63nZmK~g4@_1@;+kEue+rp{F?fqy0&G)W=HEQUWlbl{G!^KE^o-7Ob*HVyOdm{ z9G-~k1>Q8=MS`+ZErE7OuduqqWa%(Z$ymA`3O||Fr@eo7k~MM<r&H_!Zc$Bh<6J(` zb}7qeDL4EtuQtmF4jGkq`GS*^tZj*3GqpP#c+iw1(aq26z2O@Y_YswyuV5zY=+y01 z<IhUBOpBe`d08%y8D@>eWNMFlmz{`u$c~*#=|;3-EY)jg5n~dyLY!Hl1!bk7Jz|hL zT0(hX$h)9EN|OebTAFdyoLac`=LxygS*@W}GT2s<L#)W^NveH=Y13Af`7ftM5JKtP zj;*ppt&w>L-?}JqB(%*lfheVh$3=K)baU5qGdmMqhQ%*H$#-JoijlfPoeX3wS?2QG z-@;8<J&_f1<0r?agdA?Rcw%gD|E4^$O?|dt%fkgfstUE|jx-7qr*H6f%1v4!pRDy} zS*4&2y))Qnldk<B`kwbD-a)sm;&FibYW>qDs<P4xJLm<dTOijnVjGbm$QNt1J!S{f zw4eBMo%f}wwR_5kHCoSvJl`kxT;e>csqJNt8jxS$y)4}@=%0Sr{DJW>tUy+k5x{t? zD}NA%*Ld#aH(>$=R9<VW7QedQ<=&m!AfZdA4~NIi&5iZjoi01#?<lG0gKtT0X$xLl z$qF6{bTl<%C8xIrkG?vQ1H*(ytPKBOd0zomRoA9X$Dz9$38_O#gOs#%w}eP{NOwp{ zcSyH@Akru;NJ*D;OQ?h>{2MUP*O_<XoB8LP(Mxf;&vn+>`>b`ZC+_Edt`)#un2ne5 z)oT;{DE9yoHy0B@W8J)d^(R;VSL=}OVrKfQnkH5@prIreC(wERB4H0$slbqfm6MeX zXejy5d0T&HJC@1G6k!HcZRU`}<KP<KWRMwZL6Vk>-0^YFyZ_wvcB_L(w^{47GQ+H1 zopTar>?6W-4=i3(GVSN211r?nq?Nu!5uSB@7BbNLP{=bSdAF${ydC4R(-G*aLy$fN zyQHi3FTe5{H#aT`#14wrPGnQC5$LWrMPB;SR43Ku94bZdwY9J*H0M4`XJ(@vfk7S9 z24hdOv#ERBVukCNiLx&LSX$KpJ@g4nu0qvY$v3cUs$pNNjAc=mli;1Ez2{#bs2T)< z=}+7xa~}jPaSD+J={|gj)3gf_i9@M^2N6vZ+lVS<_PFI(VkA9YqzzSW-iBu26+Xp1 zQ&HQo(N_3{pSI)grsBT>-m1&KLl{2I6QM5<a#&BYsS$Bs*#5Q+E^SA?)F`!7@S1Y6 z$3wRQxx{gT_~=tOvR-zNJ4R6nrqrKr6H(CiuG%{s$e*z$f9*z=HB;{N@xw~`Tw6A! zE3p5@`Va>r&JX#$P<#bO3EDWz92s<!IwNUMLkgi-{1(1^K3Tt~Iyy@#45C&*jr9Zx z@4{HdkfocR8!>jr(x7ZCp9%lYyZ~^F#}mG)A$ZlKr`>Q)wQEN38Z(ww2b#$SJV;tg zSURV5G*nzjn}6o!+wPXku3nG%wCJ6PWo)n7+?iDX62c>|h|TdNip~#f{BA6IX+yF& z5ewUtTzx5`NQpB((Gk`6Q*9&>aMT7`_8C0%Qk*w5qdPqOIWbHWuWZNf<+9%xmY05} zudg;i(+^yMH3n=)0{~YfuW$uhOr3*T+cz|o^WaS#1D|#Q&7Kq8^#^?6Yf4@-BmecX z^q)+d-^!4M$=SZ;OfEb@Kzg5>lZTxR*!n=fub;zz;7osKOlFtgsDi|wQ4bNivvpFj zxJ6~Rm@;H&N}*p|L94i8O@#ZF$y4E}vP+XIufd`*RH{c%>KI{U**O`G_h>vR=Id4L z0GPJ<Th+LkVM{&JNgQt`*zxG@d@1PJ8-6w_hiET#auB>!H07D?X;H;{qsU50tn|3q z`gA7W;c>KKJ~TG@!CG)mNLg7{_<26k4W%1vxR9f->o|RpbNKca7QSfdzVWfMI+iLC z<g2e6_kldk+tRM?&@;HnnpMHIPR^TI$i|4=he$G#5vkiKoAkbe(9C^XIe!D2GiScv zClgunl=$O*i*()R(QrHIF0!&S;go8B-GczN-8^;CH}qxUC8{m$r`nLSR21175RtD2 z&9Qc{mM|H7X6~=XSM`%pTHibtetXc14IdGvirM+#Q(cf5i?ZI+;bMxmq*d_Jebug1 z>r#S3)qHWdK`P$qEfd|F7#Mqe^1W6cIoj=(&mpu9b;_v>0v-03(JOD1kH$1$wIRRb znR>>fUQ@zZY)`@G&$-4r|B%AEjt#++gzYho^ga85C70~RQ4Aty$omNIgppot;aDH% z5==fRsaT{{Qe%J$W5lLDX%T^Hq3Q07dS}h;sm!#plT;mVWafRs`Efp^!+<lU)#CxN zVLa~O)*MoWAPl;=iG~7qh2()|E$#t7N;FibEi+^pKhF41H2Mqr{0>h)36(o*HqKft z2HR5Fop~+|_PBPb?E=4TmP-ro@w|_aD596$%cHI8kf;U4szw2)6FS}Q#^h9Y-Qtzr z1<=uY)kx;-eO9k}$l@+@VZP|M2s%{;=FxlIZ=mm;JlZ+6zBvOY$4`$IiW{aOD~Yxq zV7SR|pYO6PQXY~cs^R8U-kYb4QY2v8L{4CsYsvjZlx?9+;{14fAA^!DA?@X%_Jag> za%55A6zxMzf{;1Y5H3X|R~-;(j>y-p^boYx16L?&mDq~V;E*0^ACk>MYe7TiTMeA3 zv<Y8LIrt3i9rkf`B;Zt}ARcO9J_YRteyyxycQTJ9##}Yfvmx>BA)|U7V3<kjCw8J= zc2AW$MJZ`VaV^^`k$07a3}Z^!hcPgtgcE(5Qs2BoFH!k`4GIyQqp^nqIcnco>G8n* z)u&tHeTLS0vT+@H<?E<=k6MoU-|b|h60yHm!9PQ5-t`Kw5M8oOn$~ryLeYc|#G&FD z+n+C@K^v3os?MkU#LlG^FOlh9kB?(>K89`VFEtFhPce<gX=FeL5Srut`vdc5S<u$* zD_J+N1bTduc3A5WY;B^zgcbVo99jxWyZgrKq6+sXx8QIR<*K`Z?r_{)j6e$)`-mGW zE=nJvi6!$D^h3zO)(3u~B?5^7Ys#k-ZSrW8DM59bHxDHQ2tt_F0~a#30};$CEjfBf zwj~+(Tz5>{Bi$bO&v}PmqA~g}JwG`wj69&-r=qp%4>10{yBic_?e*1k;lbNpgI*wE z{<GEMf4Jx8Pl*1l=jSCYp7YW=yXfx;m}5W_g^Pk1pz|j%{NC>KzyA~conh68X)P4y z@h}l`o3w#P3+kh**b_;jNOvivhjs1})fI86HVp}%8O%*|>WJeUnp;9als@m(zl6g! z*k&g3z)a-?>lCi^R<yFGjB@G7lrH-W=2ID*ezj+gOYeH~5{7Np)j)TrEErAPgp@x8 zl+vtAlDxfkFx2@FZ?Y^^CBeJh!=NRw7>ASO_7q0rwh9Fu6IFKM-T+ho>=!RIy#*6^ zwb$^^hSk>fSOHzi_Ml;=z=7D9600*ap3^yprl8~HI}bNAkzao#I5TP-VssB-zje60 zkcO=6Yd}23T#`_P8-k^fT-BsHj|28vUr9Q(^|Gvi|MKO|^T8di1TVHTiYqA70&83< zn*CZb1N#?G`9i)MpeX`n-2gQcbRj-)Yy^0=&|rd#3#c%dFzC)8DGF}c%(>%ssV+Oa z$LYT<%1eVwnD;Hd_Eg;*1@S^8;>x}m$N5~sNBB<#{2xlCD^owmd`{h2WuqvTcJ7#w z=U$l~4O$-UcJ@pfuk4SKt9eXi`6z5_(_<GquDx@QOqz+!&WOS2F%1-Atq;l0Vqcy2 zbg)tP!k{HhCGc2H(TV!wRq)vjx3T1>u#S=|1P2Eq^X;Ehzk*Haq4kXE^HPeaF0r-B z2+fq+B6ND0R6GiWJB}RIa$|XmsWE9ogPXwP1=rd1VlsjQTvwvMxhFa#3)>4kSZR}0 zmN(6M%K3g9DaxP#M<)N??l@d${WwFqy}$yVhVe&}g;iK2Du^7^p5(rsre05?9d*z< zo3=}cUS4i-JR?J(@Wk|iy_KPnnIXW2w!aA6UAl9`YeV`^e(ZF3Ij|qR6kvL>UYT8p z5Iy}P8>607Z+?5WVBgYfJ6>FsRTM0I;bFmJ@yZz*+dnWSr*kkdAvbcew+Gxha)1N~ zP*MR=7Dw_6Pw(f)xePvhyGsAPMh+GWQJ9;Ji-Vnwn~U|EHaiFlQ&<#G#QT09<jTy# zKRSCuW08KBcKvyKmvy&5VDKWBa9KVFpv8p^2Q+`YKnr$mFc;8~;cEELb~}G(HMY*H zjV$w~I*UKUnm%u<C3wUoj32Kgv4xjT9}>xF3CG4Paqoi^OpB-3txCJTCM`sV(aAuu z^T+Bp=Jjqx+79X1iIPlC?dlAl5;gJGye`Y>6DvR|r@#?<@lZR)X(AVsJCq>oxzF$- zn~hr9<FOEQq-saw7)OH-hXeTX231spU3_m0Ws;*_A`jlKN}53_yqog^RBn(}Caz>u zZ`x$`?xdNp(6@n9*wtyI?F>ToX|T#VZ8Rr|EPGkvmqg~IfELD{oR*;^4D21F<KCnY z4ZP$Xap*)Z{vgtj@aBWZ0Z}F#6A-eV&sp)b=pTacslhp1H4lp*J!!^HP$M<>zY?+6 z(DUK(3D;80zHJrA%giJbRp@DGw0xMD^u9lw>@-cW{E=-FZKhqTMX6`B>H4@XFUr%= zml31g>FI4&gM%%K%S*?vxNnt@6*#R{1c>U!#vq%+&+(BYQI3_iaZcxC-8i?eaVD9w z+F&$gR0<drk9kA9vcgU>1Fx)-Q|!l=!o@N(n`OMQI@?tK#W;|Jzn}+hF5ui^-GY$6 z<4Lv1=_5ozeFUYhd+l#w?ONK6myfgk*99?C3rXMJl4G$ujG#O8FTxr&Y<t`w*~$?m z94;d}{Q&b^Auf&FU(;d7Bl}?g>+F%#h^R)Eno+NSzzV0D<_2mnc^`vJEIry4)cQf1 z15^#uKfo>WHIC#9#NIU0=@Cm_i}D?neeGB{PG&u@@4^Mj0xZZ$u<w`;_Mcvp?OT=W zTk%h}bNsF$+VA$Wz}1NZ)Z>BK;9!8m2LgN(Om{7cO8hN~YI~&y^(%_~29THbwNHq* z?OY7qBy8NB^Jw*=eU^Db6pPOusKip#ZnP73if!mMl|pPWH)jPtr7Ek~EEqf~M0~Nm zrRmYhxj%!yv44N1qF($R;#{v7+DklCm&f7{+4c1k7|kBFNkk>33bby&{xs?r6Tmst ze2ZJno>g0dsTeQUNO21US?0a%l<_*7Y~LHR^2M^T_x&-dn;+|Vbd%O83Kp6KL<k*I zY%9zx6?CNr&QDQwR~aS7eR(w@Y8)(#$PZb?5qMBP+Iro#)e;)C5GisLpkslua<Y#{ zjF2?y?4(kUiPht5i#P!tF{a-mJ}mQ?&1WU8t?cp&r1_j{UNdC`9@>rNsxoEqggsh& zE|V0;**eKf-<Dpbz)m7vq?O+Ty}R>qt<XB`nR>uhuF&B7;^JU!qxINDi^8{c_O2F0 zJ3Py}uTzVIN9FHAoK2c%^0T7RK|y*Ztrt9fVw~Z2EO~%a)VJC#wk716eBf>;$iJUd z(1DLBwAw(&F0vsG@~}Dxa%1W6Bk)8F^{7&D4k@2&`_Q*wJ<U26Tb`V?d&ArzDO8)6 z87qXer8OpwgJ_BN`6E&rk@K|;u2cmQrY9#*?_X<Z@Y*$+Efu#_5Yv%8nV~Wf^4%;? z9+?0SV4=w4^aL~(NHQIRsaz)R$hcV@hVSrt8(_G8+(<1SRcUqf8A1}tY`Z*sQGO}r z0W#{I>RAwhKaN~jb>O&F2BN5ZS4S=;bZq?+u@hRhoPv%CTY@RQf711(^`EIex@bSd z3RE8fKQDrrKtuzej9m-?-q?S>`Y5x$brcs*BT3sl%QAddw7aa=*|*rde;Lk#JmiqE zOeq&4VB9Tx^*+%@QYGdC)as}&d9UQgRN7wEbl57oJn*_f+x^CV6RE<gkk5IZ0k#G` zUV0$TU87p!t%<k63@kz#1auvP{Ylx_Kp9MgXf}1}YYtr)oSW>erXGDtDrp-6x91&2 zF!-rsbn(8(Y3Kz&v9Je-J@g-1n!_vp(z8;)8d}Ueq=}YWDTpR?@=hK`Hn@Iv9B64? z7|LKff6J6e@MA$p)QZJhD1Y4C{&6z=e($ln{u)lBgtPOR3JQ1hC{)(xhv)p?+_ca8 zDjd}=w{3*bLL+Kqn&WLdGyJX~_8aCxIRNYkn_tb@|9JHg_T$z>5W<Uk;~-RBz9lX? zSB?t&Uy?%q*Q<|Uf2}?`gz^0Vu@B+$Z>c`=n4&A+xvT<`1m6K_e2#-koThEqdq&8g zu}jB3d7#yN!xqLF-F2#u%5Fq0Z3uWt6_bP?p0sRSP>+t8bZkg{70M&j+l-J>82D+# z_d&0vf$}4Ix8}VJ9v+H4HHS>2JeQSbb<Z>d(D8|!E{)C&-7cWq3G!lMKp*RS*^_&i z6k!MDb90v`sr6{>sOIVt>dzzcIkX<UN{1qexP1o98|&PErwncGqolN+-3dIuwXCH9 z+>;mQhMF%&mSHwF?0-XuOV5WMQ~1l8BQ@;nt)yn{DP@i_Lk7JjLedYdho&Q=D<vIn zMRDCbyCr#1eZo5g&R^l0c{nnLKe8K=YIUc5dAXzH!Xf1;8UIRHdL_hI`1XjFVAd2v zaSZEZUCjziAn56XL{CAV#s)pIS4_R55BJ7iG}d8sPdwBTc&lN-Zkg=DS8G#Iv_~Nj zcN9gWLDvHv`sE#Mxft_JQJK|Rp6!LDu|`CHzn98)%6h|+?j|y#I&4C~+|@r`q>a{T z?}(JNq-TJ}TG+Tp7%5h}wHmOezsu?$F+y?lHq&P^M^isaM(~wG5(r8G{*!vI8)IJV zZ1DEUc}Au`T4af0=~L<cP@_xm#r}CnfA@U8xjlou#6K_?9>8CCc>ssGzPmj+QzBlu zmE}{{AM9miK>7a!w}&1~d*N(BW08w~^LH-vEdiA?z&ipIHZLP2e|3D=crJB^zB@jb zLqLx5pX`SI&h@E)cx}tY;G-qYYv~&2nd41JcE~x}H2oSy%wCYDDq5-Dh>uRgCa>Bm zF8{-<F|z96;o1QurH|giz0O+t1z*d9mK9GnbCoPM0?jkBN8<tpL4njZOBmHIg5(LD z6c*J8leWypM*%U)W2jG~!@`z=Bj84wqEQ!<vx$OGr&2%-NQMe<O8Xh!&fBli21!u{ zlEDJR?c(SfrDG%O<13pTknk>JimTAxVUl@rW==0Q8Z+(^*nMJ?NwYE_KsxP9cbaLT z>5qza<#BV+yMfxPv*m&b|Jqns!alY{;nfzRvoXgo&vR!CL=<Q7_M&nD^NJcz6P7p) z^lcrF3a`al{K>)8yINB7MW#r7{GF~I1!*KpZz7eOVdo6cELI4og_ag5dg$Bsx8T#1 zh#<uj`Q2}fx34Iv=-z<u#U-yRTNZx*5aBG@#y|ft)Kkk_s^)8+pAuGkea8~_<NP;v zo>p35J|HbU)h+5s+IXg|@vvFoi5Rbu=3As2b42n@E07ue!}Oz>cmyDu7Ubv=ME%L7 zFwQ<VEja?NnCI<nWfdRYs8gySkt!>65<d8_o$3fA?Pm!|&ox)XF;A+d;8`1_8(G#F z^_2VS;B&r<ZfNG0=c0V!wKb68LXj`P?RzRY#VWwC6#8kfrpfD_LOW(?HB|~aYv6Rb z%`P`PzB9&m*T)iYea!yG^*Ny~MXRbgc5D4?5JJ>GDF>B-M*#L+`sVsfgMBA_u>bU$ zY~N?OzLo!Udk1iSe&E`Fz4H@|SwYG9GKXi6d2XX-!_`BwS;$j7MsH)PlHdz2f95l7 z(+u;qS1)u!*3rrasL<wa@apx+=e5-^l~NCDz|TDyco1N~zK)K9RYWxyxDx4}pCMq6 zWzYVp*t64!4B_J$q&M{d1EUJ!+#-WjOec>#?k2z2!#i)q&F>U$Ir*s-lw^6BVX+^k zgZFG`d8nywMt_Z_=RAm==g8|kI^GROyC>~YKJrQBIHER1Eg092m%T)b65+_Nev|o~ zM9Q-o@f=vb$r)zx+kBfd-s^l@L)$bHoVnl*-ct39YUez1_Y+cS*n5!qbWR3|F(}r8 za$KS)F*s@Xl>LgyS@eYb`eAJB+TgBG7KtRZ9O%x&{nB~1y-8of<+P?lAMCv$#utH~ zCUPpf^C(t`u@c{-HqFx)?Q$q<k1U&G1;Ev^LA5KDQx4BmQHT&u-QJ_`*#;r&EDqN9 zNse%V`Y=IZZchcEy&uSY<RJH~=GcssG5#d@wVLWa4hl@&9#b2lB7c=7&R!nXxWD7_ z3Ukj{60JyQNoU5>L2d55RE0S&{G=LjzC*WX>qms{aQ>%*kER;Bn(#{yZ1{aFZVM3* z)SHB@HjnCz+#27#twe3WeIJH(JL-d9=iCd`4}7eTwPtD%aLSx-fKc3-gBOwW;Tmbs zt+>*+XI;ZRd^+|fT_guD&tGI9`e*Ot;OO9RS@;WakmDCT`s3V%nF0Ks3E+?L)wv79 zB|R+qmm~MpwG#@+EqrT;0ciAH<8rV9CGi(WA`%wcAE+e%AQlNPnEUG3WxX~txv~im z<un0)*aKCF{}SW)icA7HTbux0`KtL1Adq`GWWN}Keg9Y7rSC5>_zQsw-$wukJQxZf zx%bogbEpu7en6|>ddzxW!D`S`xL$>Bwv)LQdutzL+#vA@22Y4eLau|Bz?TMD#U3Su zX_71jGqbVUZp4Q`NW#=ToRe<&1!$gnDs4=`&G(_!2-nd|=?VH68snkmBuie1uumMR zCdWHV=;vSSq%>x-=KOdpd@FGY3}2|!u8IP=gB(A|ao|`O0b>AExgbf%pkon0p8*CM z3IeDEfxJvCkO89R=)eFO>^qm`JDue_k?T7O_8tCTum-=&%|T<qh$_jlf`KmdSvP{H zz6G`ZvTc-PS%7Brtd}xl3>QZtI?(Bn(g*E=WOZ#J`=SAHgzNwDYkl?g&bWJc_pnq2 zs?R|X7N-gUi63_E4H8}pME>#el`IDgEEpP4SOaoDmon6cp76pDFvwsK5sVrKGZ-2Q zCi*wjxKKcjo&iIBHg<ej0Lt^Ah~U60Je5E_zu^&q1v*_$s@V-c?m$O5ifP_|H98t^ z4%5K+hUS(@H*4qGd!Z$Dr+|kTyLaUAKaM0d6b7@^+aK~T3S^FxOujM@4c9=WOklZ} z!$?+N2D@9r<{F%(;y_TN1AC$*XvHLsbOegs+<`l(x&%P9`!>cve#7k-QSerY&Yu_v z1K=N^;R3aOg@L~|3cBz)eiQQgCS44|!dC%g^d)S_#V+2TT*BVQ$@ZHPI3V(W1%`A# zE`L`7{}(uKmkAP}H5VWs#s&O+nIO47{O|b?evstXzsD<q8<Y!y8-z=No4NGyO?7;! zZ0)UaeaWEB=GpV*-TTBJP0Xs*?XvV-8g^2pHf((a)bNcEY^DzS28Fz#R47%@C#rnk zwmJ#Ocz3zH5_ByggsvgCU@>Q?><IB{Zy<fzHX%-HQ_Q7t6ihQd!E{)J_ngfB*4=zO zA(Nz->6_NNPtHQ#A<cQOMBprJz2+TV#C(FqG!a>$k13Fa0E<wolV`#WBc4o}V_@Le zA)IG_kLX?pnT<Z7NHdh8Nntq^zWEnd=ps39pI4ttw7z8D&g~_@J*(>8)pJ03@6wcV z=$6!234i|y4$5qnMyHrNNbnw=e!Vcfvc>?07q?@_@p;XI=%@h4%|xP#3kdsN(|EZ3 z>G0#XvKV&NhOY&(&t?nF-!6fDBQ7>95WWut`}+A{|LHZ^_j67DTfS94U`7ABi?4|e z0_*!SSivUqp{iH#@fXa_Z20g<mn?QTY@KLQ{3C>X0T97Sun&gygXIJ~@Hxk0BYW=m zeZ-JCByn`PtcMTVRmKljST&%Z^u4(^9VhNk(<0tOT{G$jRYv9ZAfm2T?#+N~FFVyb zaY%9cBVlXY9`cpYjDEf;+as@J8gguv8zt5bfvc$$=^#r#)WYMJ$e+<kEfaQwQQFZA zAC<lLXNW(Jj0v#k*&^Tc-|_EHv_@#$x=T~*z_2`WD0@a@w`hprD1EL@7>wp5$vmL= z051y)(=dK?=ynyl?ECgobkY304A5x&y%dyz5WfyK<Yk6T@l}*ey0pp{H?`EuxX>y{ zyr-KoFR=pi7a0TAA2J4ByrMth0+2I?Aq0qVP(aP%BW)+O0F^)_h=B@j$v2g`*Ei2) zwBmoZjsffcB^`r*-_8CVmt;2J?Tcq81rr}&T+`+RW-PIACm+sIE1I@;(P*NS!Xdnj z8)7Hh^XDY9ChDFmw#K=uLc7~;MYxT$gt{k|r`~m2gEU8i%x>G@&?>GQpJ(Sx1Yd1_ zSyl?&^)93{rxE6@S<^;Hm|HojW}{DTA(oa<(5S$b3H4&XEA1_VBZ*%;PTzlLaQ@QU zi9xn+>MS^!Vzd5CP-T2r({-BPdLRo6g0PM@d%5|3LT^?_b=qu?Q^poJML(y1vfPzG zh-yP;n!c$_wVOyK+~{yUf3u4VQzwU>6l!vsjPKbvnwo?!4vch#KkZP5Mo8Q2VR1nY z{*+m<6^7zMi-|>Mg7c8TrI-KPa=!$U64QwB>iVvf+Evv-*!@h_2(9AD;yW~Gb~|}x z%4+u@C2opsoC!H1VWqzKC`VK^q+eA#9HLX5+5h@&!K6Wa0Pk@d7l~o-+S87e$5Sf# zrL4Z?iF5r3rFE@|KHk>$xoZ!w;!VifWBI?jMZvrkl;1qcc+-F1L*4}H{BfX)L)ZDO zqadd3K|T3%j7)pDu{y$iSri(RMKK@JuFR#`b<osy9=Xp0vut^<1&aZA;m`h&joh<O znK3FYszmxy8c!rC-J}W7s)z;29Vg9SH6PHqVyU^wTPbW3J*`o%<TBNu`Y?kw4+?JI z4T2rz#x_XKk(q-_uwy)!t|iOe6?%UOB&ZH1fOxEl^A*4LLd$?4cP1m{2Z%uX0s!I( z*c>MRlFeao&EAz(_)fD2VG%2fi^|K9UrD1Yy8(R)fmS=B^305~Dq_s67wOVVCye6K zDFRwgT?QqctiQLU5?8wnPKpX&2^j#U2Jo8=AYoikYytVwpF{9}{U`XlJ=W;Gt)5E# z?kufd#H}bK?6c3iPw@1jn~@-nTM@*c3u<^=&l8=FSeA<|U;@N?^B2t`zp5(SL(8>8 zeFM+UBoe4l#-CvGX!Hr{z?@X5z?d;J_X??Hje1zdt|V&z!w0y*Vl~mraOvgQFo_y& zyX4Y-7U7gF+hk}P0d_n4sLOTuSbb`@bca$%6)kwI4V*(bkUmroJx%X5Tr?(Wy8~Zm zG)u~EQXPq?sw7a;bPm5&W~hqKSo9!Cy7+bnJGO}<#L45i3TVlW+bT0?0nujU9We<r z%qvjh#jW}($5xwC1G<(n6}u@f)pR;J)kMs}`Y%fk7X^f>doZF{Wydq6t|Dm{MU+38 zrJT~A<SK;5{kTg@>`d^S!qZh_SAWfQ{i(?54+nl>@W%G>?fbf~+DyA{%OrjY#){Tz z-_7dPfAqZI`Tkgq@$<0iI-<U*(^AtA;Wz7FmZwQW@^@$zh@imKcihfkf^8FTI}Ek9 zsS~6;$fHdzNxv6xsMyBXLxnRz_q^l=R?VG-AgFVi@b-`x616je`v<DaJ~<X?B`yn! zb|~c2=qb}p&TjB7$#i8YdQ+A1VvL-Tc?n%#{r5CF-NuqU3M0;f1mSUG7TniJw%MJ% zM3|)mPacPw1wi}erKU75adoJasPW-53Fjgoi%chHy|cGz&|SclR|XlM-2K>cSEb3- zGGwzQ4U77v?Sm)YXx;o}2t7}eZs*)w3-RA^iE_N$r^tZb_<jA0U8;YXmGDY&h^hLq zOJQw*jD!WSQ<blFDF%ce`oPoS+e?~aM(-Mo`~c7T+Jn7F49j2JwLqlgTbclb1qcma zh_9JAUIi;I_NCG{g}^Jn;d{v?G#0XyvXaDA20`O;ld^IGyOIOQ5p!J1ps`;c{^KY7 zyXbz|I<><`Y_1Qf84T)l#KFxo&*!<L!>##O)w5iWoL)XT`($o?2q8~5J!ckVDHdB> zY4jBv)1rlJc#}1i!fS|~zh3gwtlNBb-8tqyMT$&YSdiTVX;V|nC@+57mNI%uxDU&% zt3Kt6GEvWyz2cxVM<fzGk|n8>*SX8(K{o!(LsIJDK903hEQ8z;?$EXrL{0}_{?Ae6 zvr|STTe$KsBQa#W29VazYh0K=R=G>Rlf}G&Y#RYhpS7S&y^S^bo}dN2S~^@PG{;bJ zt~3}v?xT_2HuIv5c9QQxs1AplrSmRd^gXxL>D&|+nvOyA1=P7o^hn&(=SPJ{T`N%V zNl~{D;@1|r5>ReAWt^hgSCXVQLZ3*%PWaBkKD#+4yip4291lX9m>+GzB;#bE!?PSt zYAZxEcCnV=s((|esb`k%Z9f*;0Vhl^s3|y0^NG3#qd+T1_BPp_?BtpPUPbF5z6?+M z0!&y}%^g8SR~#hhsE9!p*eXGHX<``%Sj;b-o9`5`JVaw1t9u>SBFP{T2ElK&?QT7T zuWti`btIqr@g?PZ8iYN`q4(>nZ}NvBdg2c)oIM7+PxP{Ouh1ii?@poQ&5#-A6z3K) z^E?59s4eaf#&g{aC?LA?qv=H)k++nCw7Ls!XZUNjA!T=0Cm->4&eAGcpEnwRVi%SF ziAlc)u>V4j{|Q=d&oo!vYgd*b9efZ%x(PK7H&U&C+d7wY9aS=oqQ<I1g+b)X3Bm{D zwDbt2hE6(R*2jJ;4_HPI)ns1OIiPEfP$YV-$=aP(4I7m46e4ZnQK$v(E1+s_y?Lj( zQQw2J8<ZXu;B&aV@i=-0FZCXg_?~I}u!qgdO}<^Sf!AZ@wEIO*yUV|NdZm1(gxNZu z^xk~TKv{{08g&rHp{+6T1+quwMIB9FSO|NlEK>l#-~9Uob=Z2whNJf9U3dBXnpwLk z9UNkYUi#$n@Sw9(`N{HU234shku=i>g;S<xEL!lX^ZMD!%^-G#z6Qa|S+46w_UyhX z>1wE9xGO#;JxJ5HV&98ko)^D_lYNxC)5EBrcY0n*2gTex?%uFu=N^qa0<U*R*@FvS zBz&YjA#F6d=H|P2LLbR;SswT|eG<7!@eK8Kr)9(J%APAEa#o|+m0cn>tG8)6b#myQ z!$+(|ut%>^Wu7Xexmn&BeTGw=VC|KPoWNVB#3VGPy>N=~GT@B5Feh}X)O-Q|W@VwM zq4o&b3}1xv0n>Vf(>xx#rGWCO`)gtS^O+}uhTIDYb)~wGxW=7E*;|t_%F~70?41Id zp@c>B?^8?04W-gH!wbErllOI0TzL3=C!K1s`Q0cT3>H5tbjIvM%cxFx{7&yViAW*3 z3>dh9JQWU?rtQ$w4Ls3#?P>k9NK*AD{kPM-?om$7;nV)aWTp#DW^!c%EGJ)IoxI0C zFd2#ru$qW~fJF8cCZh`vrw`e0zAx};W3=30304Aw;1B?^@*4pdKw0J=jK`N1?f{*Y z2VkgO{sN39;9o$<1_&x&aNz&(6FLK3E8s8h2MQ7nmcbVWf)e^31WbSGXr_-pXd6-b z1Fp27&VWnl+<jOS68PE~+*7Sb*wc%42JQ9Y@fe|zn{e|-H*tw`UvzY^y@P&7>W9z$ zXk2^(WNy6*;c^P4=t(&NvQE)<ncw>?yv;M?)N2NhOtzVGVRigFcDRQ~LiwDGB;V(l z<BaeDt4BrlT=Cbx31~A2un82{-R<rjg@Bi0!FPznZO=85=RSVT9ahaJXL20lXcW#- z(1)Z|d)7?r1XqE{?35Jo1&S5o(I*$nx7{Yi?~oYZW2e({<(??#DK69dj~_>~YKvro zKAn|An5~6Nq1D=GYvUZOU9KUtZ<H@vdmCf$56S64vLDL`_5e8A-vgff*wr$^gi)_9 z(?#u@aw%(Z#vLgrxYhj|K>a5rr#aYIFT3)6lbpU7vj36vb@h>dhz0+hjr^9Tm*YJ0 z{StQDkf4{i9TK=VwRGG1*q)s<K#WzBN-CZff2xP<p3uH|#z7>dfkv8l&&x78-VXa3 zAvNY{Dz|<%fl}8@>@OZ`##y`1ZEh6U5TmZ#QB7ZIZZokhCe3ki9x1wOBu#RzI?xwj z!6i?TsJ2adLuRV6!jT?st^F-wu-3HQQRw5iXQy9zq7*ikPGBg%;xmZz-qH=R-i<QW z+NEj7mFN~}sY9Q)@o2zh?HDuGb}ENWBB^(OO_T}!Ea2fs3+ds8eXnD26#l^Z(q7TE zrY_hp!uj(RJZhU|c8pMB1j%^a(OCJWC5p81Gq1D&i3g`^qmP01oD$C8ghu?JQ2{dz z^y`ZKkCVQv$|~XU>((`-@!m#t>2%)_en=Dh|BdwJJ980A#DMX==!o<~b^6z3;z#ta z2u}ME|KXy;_Z8+x`2Ff%rK<hNE|L=8um3^I+V8TO;14hO`SzsO-{P-RfdA2I*nj4u zIYZ3n>6MuI$&*=@y|2^1E2y>E{{%DFTrZLjvz1&-=cWU2(s+>?A?5z0h262!1ns1K z@|o1(2px&f<sXn09ZL6b778A%^0W45kp^gCeT2|?F!#TJ(aM=(6|3vdRCaiH(zGLL zvhYnZO4|^20Uq4HfsS@DZ`?H=T$1`gnVh{)IsFLMGS$<XV=}+s#*h$FZ|?i-wF+2Y zy?}|wZp3OkE$+y)y@HboKsdx0)<Ai^ncI5b!8EquV8Q_ZH}JZQ%wQkq#MxPgY+CcO z^S=_Do_OWk%v}J}7_fK;9v(!?-?cROM(XvvL#wa#Fwvu)cG?eS&iB3&IcsJLg@Z)B zzsAQrcizV*WRD}1={YQ(X(c=}cZjxN)h2~t=~)Ui_2?A_eMYk-Asp$kcxu_TjfaG~ z5|M2nUB*0`s*~O4?cTE33i{m4rctQa0oD6RQVZJF6T?)l$#!q6w2roilO;eMi-M+# z{q57)19((R^__<HH9dND*{pq`wn*{r(Rla3WJMkagVVIYx$TCr>PH_`MGil#MvEw- z_oh1_CG<L4WHuGl(p$Nb(HnpXB5oa`)ltL8%b?o!QK~)>uKS{Nc{2PS;{7g5=P(fQ z<8Xk6y9n<Bc7_EMx@^~Gagw0jNG$rX0B`8ynClPrGQ!*TtILN6#<_^VfUr>2fKD?P z$~oUsLi}LftI!PlRVL`)6OR06Ri*nMbdUd<DqZnleKRgoo&Ve3VYEhP*50@YlGt!H zsK!YfLK~%9)=p|5)scD8U<wSAFt4a4ia855A))||c-VAd&aIfOgxO+EAxLGbWci(y z#hY5uZ7<sMaR$1@xAJu((**a7sh#usO9*XhC)^bct@FKuyBD9YaLfpYY$D!nc8C$M zSabSgEEUL~7RkRt>AK&{_<FLip9v7&!O7sW-}2hhVL}WZv#>JoSSjy_rb5<{9;~R; z{m@klntq29i!uw{*yS8nGb{fp70am(vURmb+aj+nbfz?S)_&)1_K|!e+{k9Pv7`IT zc;Pe?2aWyc6n^u{q@MQR#sP6F@kMJ&p|eIbR-N^O$uoOMO_$GBbIrqtXnl7lIpB=~ GrT!mNl@~Jr diff --git a/deep_sequencing_unit/createsamplesheet/dist/log/.gitignore b/deep_sequencing_unit/createsamplesheet/dist/log/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py b/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py deleted file mode 100755 index 52530a1fef8..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-alignment.py +++ /dev/null @@ -1,137 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-alignment/' -SAMTOOLS='/usr/local/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("ALIGNMENT") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bam -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for BAMS: -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BAM_PATTERN): - matches.append(os.path.join(root, filename)) - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def programParameters (programList): - ''' - Extracts the aligner datils from the bam header - ''' - elements = {} - for program in range(0, len(programList)): - line = programList[program].split('\t') - - for element in range (1, len(line)): - key, value = line[element].split(":") - elements[key] = value - - return elements - - -# Extract values from a samtools view and set the results as DataSet properties -# Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - -arguments = SAMTOOLS + ' view -H ' + matches[0] -print('Arguments: '+ arguments) -cmdResult=os.popen(arguments).read() - -properties=cmdResult.split("\n") -for s in range (0, len(searchStrings)): - programList = listSearch (properties, searchStrings[s]) -print(programList) - -e = programParameters (programList) - -dataSet.setPropertyValue("ALIGNMENT_SOFTWARE", e['ID']) -dataSet.setPropertyValue("VERSION", e['VN']) -dataSet.setPropertyValue("ISSUED_COMMAND", e['CL']) - - -arguments = SAMTOOLS + ' flagstat ' + matches[0] - -cmdResult=os.popen(arguments).read() -totalReads=cmdResult.split('\n')[0].split(' ')[0] -mappedReads=cmdResult.split('\n')[2].split(' ')[0] - -dataSet.setPropertyValue("SAMTOOLS_FLAGSTAT", cmdResult) -dataSet.setPropertyValue("TOTAL_READS", totalReads) -dataSet.setPropertyValue("MAPPED_READS", mappedReads) - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py b/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py deleted file mode 100755 index b8f9fb4a97d..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-basecall-stats.py +++ /dev/null @@ -1,53 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -# no walk in Jython 2.2 -#for root, dirs, files in os.walk(folders): -# folders.append(root) -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() -# expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BASECALL_STATS") -dataSet.setMeasuredData(False) - -#dataSet.setPropertyValue("MISMATCH_IN_INDEX", r) - -# Get the search service -search_service = transaction.getSearchService() - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py b/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py deleted file mode 100755 index f9d6e2ae98b..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-bigwig.py +++ /dev/null @@ -1,124 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BIGWIGGLE") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for BWs: -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(properties)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -# Extract values from a samtools view and set the results as DataSet properties -# Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - -arguments = BIGWIGINFO + matches[0] -#print('Arguments: '+ arguments) -cmdResult=os.popen(arguments).read() - -properties=cmdResult.split("\n") -dictProp = convertListToDict(properties) -#print(dictProp) - -dataSet.setPropertyValue("VERSION", dictProp['version']) -dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) -dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) -dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) -dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) -dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) -dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) -dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) -dataSet.setPropertyValue("MEAN", dictProp['mean']) -dataSet.setPropertyValue("MIN", dictProp['min']) -dataSet.setPropertyValue("MAX", dictProp['max']) -dataSet.setPropertyValue("STD", dictProp['std']) - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-cell.py b/deep_sequencing_unit/dist/etc/data-set-handler-cell.py deleted file mode 100755 index c2ceb47928b..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-cell.py +++ /dev/null @@ -1,111 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -XML_ELEMENTS = {'FLOWCELL': 'Flowcell', 'RTAVERSION': 'RTAVersion', - 'CONTROLLANE': 'ControlLane', 'SBS': 'Sbs', 'INDEX': 'Index'} - -RUNINFO_FOLDER='/links/shared/dsu-dss/dss/incoming-jython-runinfostatistics/' -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING='.MARKER_is_finished_' - - -def parseXml(xmlFile): - ''' - Parses an XML file and returns the root leaf - ''' - tree = etree.parse(xmlFile) - root = tree.getroot() - return root - - -def getXmlElement (elementName): - ''' - Returns the text value of a given XML element - ''' - for e in root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - print(element.text) - return element.text - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - IS_HISEQ_RUN=True -if (len(split) == 2): - dataSet = transaction.createNewDataSet("ILLUMINA_GA_OUTPUT") - -#move RunInfo into a different drop box -runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) -runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) -runInfoList = runInfoSample + runInfoReport -os.makedirs(RUNINFO_FOLDER + name + '/Data/') -for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, RUNINFO_FOLDER + name + '/Data/' + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, RUNINFO_FOLDER + name + '/Data/') - except (IOError, os.error), why: - print (runInfo, RUNINFO_FOLDER + name, str(why)) - -touch_markerfile(RUNINFO_FOLDER+MARKER_STRING+name) - -# Create a data set and set type -dataSet.setMeasuredData(False) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - if IS_HISEQ_RUN: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - root = parseXml(incomingPath + '/' + RUNPARAMETERS) -# sa.setPropertyValue("ILLUMINA_PIPELINE_VERSION", getXmlElement(XML_ELEMENTS['RTAVERSION'])) -# sa.setPropertyValue("FLOWCELLTYPE", getXmlElement(XML_ELEMENTS['FLOWCELL'])) -# sa.setPropertyValue("CONTROL_LANE", getXmlElement(XML_ELEMENTS['CONTROLLANE'])) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py b/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py deleted file mode 100755 index e1017031690..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-create-flow-cell.py +++ /dev/null @@ -1,165 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -INSTRUMENT = {'SN792':'RUA', 'BS-DSU-ELLAC':'ELLAC'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -print(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True -if (len(split) == 2): - pass - -# Search for the sample and check if there is already sample with this name -search_service = transaction.getSearchService() -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) -if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - -# Parse the RunInfo.xml file -runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) -print(runInfo) - -# Create a new Flow Cell and set the experiment -newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") -exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) -if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) -newFlowCell.setExperiment(exp) - -if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - -sequencer = runInfo.getAllchildren('Instrument') -newFlowCell.setPropertyValue("SEQUENCER", INSTRUMENT[sequencer[0].text]) - -newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) -if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] -else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -[registerFlowLane(lane) for lane in range(1,int(maxLanes)+1)] - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py b/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py deleted file mode 100755 index 0781051f88e..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-demultiplex-stats.py +++ /dev/null @@ -1,428 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- -# ----------------------------------------------------------------------------- - -FASTQ_DATA_SET_TYPE='FASTQ_GZ' -DEMUX_FILE='Flowcell_demux_summary.xml' -NO_INDEX='NOINDEX' -UNDETERMINED='UNDETERMINED' - -print('\n'+time.ctime()) -incomingPath = incoming.getAbsolutePath() -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() -# Get the incoming name -incomingName = incoming.getName() -# Get the search service -search_service = transaction.getSearchService() - -FileGenerator= locate(DEMUX_FILE, incomingPath) -DEMULTIPLEX_XML = FileGenerator.next() - -sampleList = xml2Memory(DEMULTIPLEX_XML) - -sa = sample() -sampleDict = {} - -# key = sample name, value = sample() -for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - -stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - -# calculate the relative amount of reads per index -laneDict = rawReadSumPerSamples(stat) -sumRawReadsDict = createSumRawReadsPerLane(laneDict) -relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - -# set the values in the object -for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - -#for m in stat: -# print m - -def sampleSearch(Code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, Code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -def searchDataSetsofSample(sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - if index1 not in (NO_INDEX): - if index1 in (UNDETERMINED): - index1 = NO_INDEX - else: - # Ugly workaround, the Index vocabulary has 7 nucleotides of which the last one is always an 'A' - index1 = index1 + "A" - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1)) - if index2 not in (NO_INDEX): - if index2 in (UNDETERMINED): - index2 = NO_INDEX - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - - return foundDataSets - -flowcell, lanes, numberOfLanes = sampleSearch(incomingName) - -for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - break - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-lane.py b/deep_sequencing_unit/dist/etc/data-set-handler-lane.py deleted file mode 100755 index 5e4b0b85810..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-lane.py +++ /dev/null @@ -1,269 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu-dss/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu-dss/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -incomingPath = incoming.getAbsolutePath() -# useful for debugging: -print(datetime.now()) - -def getFileNames(path=incomingPath): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliationName, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() -# expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 -split=name.split("_") -if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane -# expected Project_120112_63537AAXX_1 -if (len(split) ==4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ flowCellId + ':' + flowLane - - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ------------------------------------------------------------------------------- - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the incoming_sample which is a Flow Lane -sc = SearchCriteria() -print('Processing sample: '+ str(incoming_sample)) -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -# there should be only one sample because it is unique within one Flow Cell -if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) -elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) -else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - -# ------------------------------------------------------------------------------- - -# search for the parents -sc = SearchCriteria() -# set the Search Criteria to an OR condition, default is AND -sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) -# Get the codes for all parents -for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); -# all parents of the flow lane -foundParents = search_service.searchForSamples(sc) - -# ------------------------------------------------------------------------------- - -# loop over each Sample folder within a lane -for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - # BSSE--1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - nameOfFile = parentCode + "_" + flowCellId + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - - if (parentCode == folders[f].split('_')[1]): - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - #print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - extraCopy (affiliation_name, file) - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py b/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py deleted file mode 100755 index 1772673509e..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-pdf.py +++ /dev/null @@ -1,67 +0,0 @@ -''' - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu-dss/dss/incoming-jython-pdf/' -PDF_PATTERN='*.pdf' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -# Create a data set and set type -dataSet = transaction.createNewDataSet("QUALITY_PDFS") -dataSet.setMeasuredData(False) - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -# expected: -# Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.pdf -name = incoming.getName() -split=name.split('_') -if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] -if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - -# Looking for PDFS -for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, PDF_PATTERN): - matches.append(os.path.join(root, filename)) - - -# Add the incoming file into the data set -transaction.moveFile(incomingPath, dataSet) - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py b/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py deleted file mode 100755 index c47815e82b4..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler-unaligned.py +++ /dev/null @@ -1,113 +0,0 @@ -''' -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import glob -import shutil -import time -#from java.lang import RuntimeException -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu-dss/dss/incoming-jython-lanes/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name and set the Data Set Type based on this -name = incoming.getName() -split=name.split("_") -if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] -if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - # fix Illumina Script error: the GA FC Name does not contain a suffix A or B so noes not need to be removed - # but Illumina removes it anyway, so we just revert this - #os.rename(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + name.split("_")[-1][1:], incomingPath + '/' + UNALIGNED_FOLDER +'/' + BASECALL_STATS_FOLDER + flowcell) - -#move Lanes into a different drop box -laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) -laneList.sort() - -undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) -undeterminedList.sort() - -# add the Flow Cell Name to the Undetermined FASTQ files -[renameFiles(dir, flowcell) for dir in undeterminedList] - -# Multiplexing: -# First move the Undetermined reads to the other ones -[shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - -[shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] -markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - -# Create a data set and set type -dataSet = transaction.createNewDataSet("BASECALL_STATS") -dataSet.setMeasuredData(False) - -# Build up a list of file which are part of the data set -fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) -[fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - -# Add the incoming file into the data set -transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) -# move all files is data set -[transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] -# move base call stat dir into data set -print("flowcell: "+flowcell) -transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py b/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py deleted file mode 100644 index 49972b6b03c..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_fastqc.py +++ /dev/null @@ -1,56 +0,0 @@ -''' -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -name = incoming.getName() -fcAndLane = name.split("_",1)[-1] -flowCell, flowLane = fcAndLane.rsplit("_",1) -print flowLane - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py b/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py deleted file mode 100755 index da183924e46..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_runinfostatistics.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -expected incoming Name for HiSeq2000 runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() -folders=[] -folders=os.listdir(incomingPath) - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True -if (len(split) == 2): - IS_HISEQ_RUN=False - -# Get the search service -search_service = transaction.getSearchService() - -# Search for the sample -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py b/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py deleted file mode 100644 index 33fd7e39592..00000000000 --- a/deep_sequencing_unit/dist/etc/data-set-handler_takeRTA_timestamp.py +++ /dev/null @@ -1,48 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -# Create a "transaction" -- a way of grouping operations together so they all -# happen or none of them do. -transaction = service.transaction() - -incomingPath = incoming.getAbsolutePath() - -# Get the incoming name -name = incoming.getName() - -split=name.split("_") -if (len(split) == 4): - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete -if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - -# Search for the sample and check if there is already sample with this name -search_service = transaction.getSearchService() -sc = SearchCriteria() -sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); -foundSamples = search_service.searchForSamples(sc) - -if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - -shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/dist/etc/log.xml b/deep_sequencing_unit/dist/etc/log.xml deleted file mode 100644 index 5512436db76..00000000000 --- a/deep_sequencing_unit/dist/etc/log.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="DEFAULT" class="org.apache.log4j.DailyRollingFileAppender"> - - <param name="File" value="log/datastore_server_log.txt"/> - <param name="DatePattern" value="'.'yyyy-MM-dd"/> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - </appender> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender"> - - <param name="BufferSize" value="512" /> - <param name="SMTPHost" value="localhost" /> - <param name="From" value="dsu@localhost" /> - <param name="To" value="root@localhost" /> - <param name="Subject" value="ATTENTION: DSU Data Set Server" /> - <param name="EvaluatorClass" value="ch.systemsx.cisd.common.logging.AlwaysTrueTriggeringEventEvaluator" /> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - <!--filter class="org.apache.log4j.varia.LevelRangeFilter"> - <param name="LevelMin" value="ERROR"/> - <param name="LevelMax" value="FATAL"/> - </filter--> - - </appender> - - <category name="NOTIFY"> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - <appender-ref ref="EMAIL" /> - </category> - - <root> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/dist/etc/passwd b/deep_sequencing_unit/dist/etc/passwd deleted file mode 100644 index 9a706e68a26..00000000000 --- a/deep_sequencing_unit/dist/etc/passwd +++ /dev/null @@ -1,4 +0,0 @@ -a:a@admins.com:A:The Admin:J3fII6Pex7jnCBwF+uXz2mFuB1QVhPUi -u:u@users.com:U:The User:dmbGKaGRmbX8YKfslMxUHObmYfjywkuT -o:o@observers.com:O:The Observer:t53ADCnFnEFhBvHB7FPoHhbHeW2O1KJc -etlserver::::SHGHSPawL/B3NKXD5nsu4fSrj5LwR2MX diff --git a/deep_sequencing_unit/dist/etc/service.properties b/deep_sequencing_unit/dist/etc/service.properties deleted file mode 100644 index 6d3c1edd927..00000000000 --- a/deep_sequencing_unit/dist/etc/service.properties +++ /dev/null @@ -1,228 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -# The root directory of the data store -storeroot-dir = data/store - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8444 - -# Session timeout in minutes -session-timeout = 720 - -# Path to the keystore -keystore.path = etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 60 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 180 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = https://localhost:8443/openbis/openbis - -# The username to use when contacting the openBIS server -username = etlserver - -# The password to use when contacting the openBIS server -password = etlserver - -# The base URL for Web client access. -download-url = https://localhost:8444 - -# SMTP properties (must start with 'mail' to be considered). -# mail.smtp.host = localhost -# mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# Globally used separator character which separates entities in a data set file name -data-set-file-name-entity-separator = _ - -# Specifies what should happen if an error occurs during dataset processing. -# By default this flag is set to false and user has to modify the 'faulty paths file' -# each time the faulty dataset should be processed again. -# Set this flag to true if the processing should be repeated after some time without manual intervention. -# Note that this can increase the server load. -# reprocess-faulty-datasets = false - -# --------------------------------------------------------------------------- -# reporting and processing plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of reporting plugins. Each plugin should have configuration properties prefixed with its name. -# If name has 'default-' prefix it will be used by default in data set Data View. -reporting-plugins = illumina-summary - -# Label of the plugin which will be shown for the users. -illumina-summary.label = Illumina Summary -# Comma separated list of dataset type codes which can be handled by this plugin. -illumina-summary.dataset-types = SHORT_READS_SEQUENCING, ILLUMINA_GA_OUTPUT -# Plugin class specification (together with the list of packages this class belongs to). -illumina-summary.class = ch.ethz.bsse.cisd.dsu.dss.plugins.IlluminaSummaryReportingPlugin -# The property file. Its content will be passed as a parameter to the plugin. -illumina-summary.properties-file = - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = flow-cell, fl1, fl2, fl3, fl4, fl5, fl6, fl7, fl8 - -# --------------------------------------------------------------------------- -# 'flow-cell' thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -flow-cell.incoming-dir = data/incoming - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -flow-cell.incoming-data-completeness-condition = auto-detection - -# The space the samples extracted by this thread belong to. If commented out or empty, then samples -# are considered associated to a database instance (not group private). -# flow-cell.space-code = <change this> - -# ---------------- Plugin properties -# The extractor class to use for code extraction -flow-cell.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -flow-cell.data-set-info-extractor.strip-file-extension = true -flow-cell.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.data-set-info-extractor.space-code = TEST -# Location of file containing data set properties -#flow-cell.data-set-info-extractor.data-set-properties-file-name = data-set.properties - -# The extractor class to use for type extraction -flow-cell.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -flow-cell.type-extractor.file-format-type = PROPRIETARY -flow-cell.type-extractor.locator-type = RELATIVE_LOCATION -flow-cell.type-extractor.data-set-type = FLOW_CELL -flow-cell.type-extractor.is-measured = true - -# The storage processor (IStorageProcessor implementation) -flow-cell.storage-processor = ch.ethz.bsse.cisd.dsu.dss.StorageProcessor -flow-cell.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -# Template of flow-lane drop boxes. {0} is the place holder for flow lane number -flow-cell.storage-processor.flow-lane-drop-box-template = data/drop-box-{0} -flow-cell.storage-processor.transfer.BSSE = data/drop-box-bsse -flow-cell.storage-processor.meta-data-file-prefix = PREFIX_FOR_TSV - -# -------- Flow Lane 1 -------------------------------------- -fl1.incoming-dir = data/drop-box-1 -fl1.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl1.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl1.data-set-info-extractor.index-of-space-code = 0 -fl1.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl1.type-extractor.file-format-type = PROPRIETARY -fl1.type-extractor.data-set-type = FLOW_LANE -fl1.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 2 -------------------------------------- -fl2.incoming-dir = data/drop-box-2 -fl2.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl2.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl2.data-set-info-extractor.index-of-space-code = 0 -fl2.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl2.type-extractor.file-format-type = PROPRIETARY -fl2.type-extractor.data-set-type = FLOW_LANE -fl2.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 3 -------------------------------------- -fl3.incoming-dir = data/drop-box-3 -fl3.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl3.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl3.data-set-info-extractor.index-of-space-code = 0 -fl3.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl3.type-extractor.file-format-type = PROPRIETARY -fl3.type-extractor.data-set-type = FLOW_LANE -fl3.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 4 -------------------------------------- -fl4.incoming-dir = data/drop-box-4 -fl4.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl4.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl4.data-set-info-extractor.index-of-space-code = 0 -fl4.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl4.type-extractor.file-format-type = PROPRIETARY -fl4.type-extractor.data-set-type = FLOW_LANE -fl4.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 5 -------------------------------------- -fl5.incoming-dir = data/drop-box-5 -fl5.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl5.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl5.data-set-info-extractor.index-of-space-code = 0 -fl5.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl5.type-extractor.file-format-type = PROPRIETARY -fl5.type-extractor.data-set-type = FLOW_LANE -fl5.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 6 -------------------------------------- -fl6.incoming-dir = data/drop-box-6 -fl6.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl6.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl6.data-set-info-extractor.index-of-space-code = 0 -fl6.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl6.type-extractor.file-format-type = PROPRIETARY -fl6.type-extractor.data-set-type = FLOW_LANE -fl6.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 7 -------------------------------------- -fl7.incoming-dir = data/drop-box-7 -fl7.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl7.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl7.data-set-info-extractor.index-of-space-code = 0 -fl7.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl7.type-extractor.file-format-type = PROPRIETARY -fl7.type-extractor.data-set-type = FLOW_LANE -fl7.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -# -------- Flow Lane 8 -------------------------------------- -fl8.incoming-dir = data/drop-box-8 -fl8.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl8.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl8.data-set-info-extractor.index-of-space-code = 0 -fl8.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl8.type-extractor.file-format-type = PROPRIETARY -fl8.type-extractor.data-set-type = FLOW_LANE -fl8.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/etc/log.xml b/deep_sequencing_unit/etc/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/deep_sequencing_unit/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/etc/service.properties b/deep_sequencing_unit/etc/service.properties deleted file mode 100644 index be9f4246ff6..00000000000 --- a/deep_sequencing_unit/etc/service.properties +++ /dev/null @@ -1,189 +0,0 @@ -# Unique code of this Data Store Server. Not more than 40 characters. -data-store-server-code = DSS1 - -# The root directory of the data store -storeroot-dir = targets/playground/store -root = ${root-dir} -incoming-root-dir = ${root-dir} - -# The directory where the command queue file is located; defaults to storeroot-dir -commandqueue-dir = - -# Port -port = 8889 - -# Session timeout in minutes -session-timeout = 720 - -use-ssl = false - -# Path to the keystore -keystore.path = ../datastore_server/dist/etc/openBIS.keystore - -# Password of the keystore -keystore.password = changeit - -# Key password of the keystore -keystore.key-password = changeit - -# The check interval (in seconds) -check-interval = 5 - -# The time-out for clean up work in the shutdown sequence (in seconds). -# Note that that the maximal time for the shutdown sequence to complete can be as large -# as twice this time. -# Remark: On a network file system, it is not recommended to turn this value to something -# lower than 180. -shutdown-timeout = 2 - -# If free disk space goes below value defined here, a notification email will be sent. -# Value must be specified in kilobytes (1048576 = 1024 * 1024 = 1GB). If no high water mark is -# specified or if value is negative, the system will not be watching. -highwater-mark = -1 - -# If a data set is successfully registered it sends out an email to the registrator. -# If this property is not specified, no email is sent to the registrator. This property -# does not affect the mails which are sent, when the data set could not be registered. -notify-successful-registration = false - -# The URL of the openBIS server -server-url = http://localhost:8888/openbis - -# The username to use when contacting the openBIS server -username = etlserver_bsse - -# The password to use when contacting the openBIS server -password = etlserver - -# The base URL for Web client access. -download-url = http://localhost:${port} - -# SMTP properties (must start with 'mail' to be considered). -mail.smtp.host = file://targets/playground/email -# mail.from = datastore_server@localhost - -# ---------------- Timing parameters for file system operations on remote shares. - -# Time (in seconds) to wait for any file system operation to finish. Operations exceeding this -# timeout will be terminated. -timeout = 60 -# Number of times that a timed out operation will be tried again (0 means: every file system -# operation will only ever be performed once). -max-retries = 11 -# Time (in seconds) to wait after an operation has been timed out before re-trying. -failure-interval = 10 - -# The period of no write access that needs to pass before an incoming data item is considered -# complete and ready to be processed (in seconds) [default: 300]. -# Valid only when auto-detection method is used to determine if an incoming data are ready to be processed. -quiet-period = 10 - -# Globally used separator character which separates entities in a data set file name -data-set-file-name-entity-separator = : - -# Specifies what should happen if an error occurs during dataset processing. -# By default this flag is set to false and user has to modify the 'faulty paths file' -# each time the faulty dataset should be processed again. -# Set this flag to true if the processing should be repeated after some time without manual intervention. -# Note that this can increase the server load. -# reprocess-faulty-datasets = false - -# --------------------------------------------------------------------------- -# reporting and processing plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of reporting plugins. Each plugin should have configuration properties prefixed with its name. -# If name has 'default-' prefix it will be used by default in data set Data View. -reporting-plugins = illumina-summary - -# Label of the plugin which will be shown for the users. -illumina-summary.label = Illumina Summary -# Comma separated list of dataset type codes which can be handled by this plugin. -illumina-summary.dataset-types = BASECALL_STATS, ILLUMINA_GA_OUTPUT -# Plugin class specification (together with the list of packages this class belongs to). -illumina-summary.class = ch.ethz.bsse.cisd.dsu.dss.plugins.IlluminaSummaryReportingPlugin -# The property file. Its content will be passed as a parameter to the plugin. -illumina-summary.properties-file = - -processing-plugins = to-SOFT -to-SOFT.label = Flow Lane to SOFT Exporter -to-SOFT.dataset-types = FLOW_LANE -to-SOFT.class = ch.ethz.bsse.cisd.dsu.dss.plugins.DataSetToSOFT -#to-SOFT.properties-file = - -# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name. -# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor' -inputs = flow-cell, fl1, default, jbasecall - -default.incoming-dir = targets/playground/default_upload -default.incoming-data-completeness-condition = auto-detection -default.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -default.data-set-info-extractor.strip-file-extension = true -default.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -default.data-set-info-extractor.space-code = BSSE_FLOWCELLS -default.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -default.type-extractor.file-format-type = PROPRIETARY -default.type-extractor.locator-type = RELATIVE_LOCATION -default.type-extractor.data-set-type = ILLUMINA_GA_OUTPUT -default.type-extractor.is-measured = true -default.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -default.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - - -# --------------------------------------------------------------------------- -# 'flow-cell' thread configuration -# --------------------------------------------------------------------------- -# The directory to watch for incoming data. -flow-cell.incoming-dir = targets/playground/incoming-flow-cell - -# Determines when the incoming data should be considered complete and ready to be processed. -# Allowed values: -# - auto-detection - when no write access will be detected for a specified 'quite-period' -# - marker-file - when an appropriate marker file for the data exists. -# The default value is 'marker-file'. -flow-cell.incoming-data-completeness-condition = auto-detection - -# The space the samples extracted by this thread belong to. If commented out or empty, then samples -# are considered associated to a database instance (not space private). -# flow-cell.space-code = <change this> - -# ---------------- Plugin properties -# The extractor class to use for code extraction -flow-cell.data-set-info-extractor = ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor -flow-cell.data-set-info-extractor.strip-file-extension = true -flow-cell.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.data-set-info-extractor.space-code = BSSE -# Location of file containing data set properties -#flow-cell.data-set-info-extractor.data-set-properties-file-name = data-set.properties - -# The extractor class to use for type extraction -flow-cell.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -flow-cell.type-extractor.file-format-type = PROPRIETARY -flow-cell.type-extractor.locator-type = RELATIVE_LOCATION -flow-cell.type-extractor.data-set-type = ILLUMINA_GA_OUTPUT -flow-cell.type-extractor.is-measured = true - -# The storage processor (IStorageProcessor implementation) -flow-cell.storage-processor = ch.ethz.bsse.cisd.dsu.dss.StorageProcessor -flow-cell.storage-processor.processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -flow-cell.storage-processor.flow-lane-drop-box-template = targets/playground/drop-box-{0} -flow-cell.storage-processor.entity-separator = ${data-set-file-name-entity-separator} -flow-cell.storage-processor.transfer.FMI = targets/playground/drop-box-fmi -flow-cell.storage-processor.meta-data-file-prefix = PREFIX_FOR_TSV - -# -------- Flow Lane 1 -------------------------------------- -fl1.incoming-dir = targets/playground/drop-box-1 -fl1.data-set-info-extractor = ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor -fl1.data-set-info-extractor.entity-separator = ${data-set-file-name-entity-separator} -fl1.data-set-info-extractor.index-of-space-code = 0 -fl1.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor -fl1.type-extractor.file-format-type = SRF -fl1.type-extractor.data-set-type = SRF_PER_LANE -fl1.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - -jbasecall.incoming-dir = targets/playground/incoming-jython-basecall-stats -jbasecall.top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetHandler -jbasecall.script-path = ${root}/dss/jython_scripts/data-set-handler-basecall-stats.py -jbasecall.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jbasecall.incoming-data-completeness-condition = marker-file -jython-version=2.7 diff --git a/deep_sequencing_unit/etc/web-client.properties b/deep_sequencing_unit/etc/web-client.properties deleted file mode 100644 index f946e8e9637..00000000000 --- a/deep_sequencing_unit/etc/web-client.properties +++ /dev/null @@ -1,77 +0,0 @@ -# Experimental: Enable moving entities to trash (non-permanent deletion). -# Default value: false -enable-trash = true - -# Default view mode that should be used if user doesn't have it specified in URL. -# Options: 'NORMAL' (standard mode - default), 'SIMPLE' (readonly mode with simplified GUI). -# -#default-view-mode = SIMPLE - -# Flag specifying whether default login mode is anonymous or not. -# If true a user-for-anonymous-login has to be defined in service.properties -# Default value: false -#default-anonymous-login = true - -# Maximal number of visible columns in tables. Default: 50. -max-visible-columns = 25 - -# Should the feature of adding unofficial/ad-hoc terms to vocabularies be turned on. -# Default value: false -allow-adding-unofficial-terms = true - -# (optional) List of data set types for which there should be an image overview shown in dataset tables. -# If not specified image overview will not be shown for any datasets. -data-set-types-with-image-overview = HCS_IMAGE, UNKNOWN - -# (optional) Allows power users adding vocabulary terms when editing the form. -# If not specified, default is false -# allow-adding-unofficial-terms = true - -# Configuration of entity (experiment, sample, data set, material) detail views. -# -# Mandatory properties: -# - view (entity detail view id) -# - types (list of entity type codes) -# Optional properties: -# - hide-sections (list of section ids) -# - hide-smart-view (removes "Smart View" from Data Set Detail View -> Data View) (generic_dataset_viewer) -# - hide-file-view (removes "File View" from Data Set Detail View -> Data View) (generic_dataset_viewer) -# Available sections in entity-detail-views: -# generic_dataset_viewer -# data-set-data-section -# data-set-parents-section -# data-set-children-section -# data-set-contained-section -# query-section -# generic_experiment_viewer -# data-sets-section -# attachment-section -# query-section -# experiment-sample-section -# generic_sample_viewer -# container-sample-section -# derived-samples-section -# parent-samples-section -# data-sets-section -# attachment-section -# query-section -# generic_material_viewer -# query-section -# -# Example: -# -detail-views = sample-view, experiment-view, data-view - -sample-view.view = generic_sample_viewer -sample-view.types = CELL_PLATE, CONTROL_LAYOUT -sample-view.hide-sections = attachment-section, module-section - -experiment-view.view = generic_experiment_viewer -experiment-view.types = COMPOUND_HCS -experiment-view.hide-sections = attachment-section - -data-view.view = generic_dataset_viewer -data-view.types = HCS_IMAGE -data-view.hide-smart-view = false -data-view.hide-file-view = false - diff --git a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar b/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 5c2d1cf016b3885f6930543d57b744ea8c220a1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55616 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 I5eVr20d63LbpQYW diff --git a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties b/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 7745c4ec463..00000000000 --- a/deep_sequencing_unit/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://sissource.ethz.ch/openbis/openbis-public/openbis-ivy/-/raw/main/gradle/distribution/7.4/gradle-7.4-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/deep_sequencing_unit/gradlew b/deep_sequencing_unit/gradlew deleted file mode 100755 index 83f2acfdc31..00000000000 --- a/deep_sequencing_unit/gradlew +++ /dev/null @@ -1,188 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/deep_sequencing_unit/gradlew.bat b/deep_sequencing_unit/gradlew.bat deleted file mode 100644 index 24467a141f7..00000000000 --- a/deep_sequencing_unit/gradlew.bat +++ /dev/null @@ -1,100 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/deep_sequencing_unit/metadata/etc/log.xml b/deep_sequencing_unit/metadata/etc/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/deep_sequencing_unit/metadata/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/metadata/etc/openBIS.keystore b/deep_sequencing_unit/metadata/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98036 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 GrT!mNl@~Jr diff --git a/deep_sequencing_unit/metadata/etc/service.properties b/deep_sequencing_unit/metadata/etc/service.properties deleted file mode 100644 index d2377c4fad0..00000000000 --- a/deep_sequencing_unit/metadata/etc/service.properties +++ /dev/null @@ -1,8 +0,0 @@ -openbis-user = kohleman -openbis-password = password -openbis-server-url = http://127.0.0.1:8888 - -pathinfo-db-connection-string = jdbc:postgresql://localhost:5432/pathinfo_productive -pathinfo-db-user = postgres -pathinfo-db-password = postgres -jython-version=2.7 diff --git a/deep_sequencing_unit/resource/DSU TrackingClient.launch b/deep_sequencing_unit/resource/DSU TrackingClient.launch deleted file mode 100644 index f27f8805548..00000000000 --- a/deep_sequencing_unit/resource/DSU TrackingClient.launch +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> -<listEntry value="org.eclipse.debug.ui.launchGroup.run"/> -</listAttribute> -<listAttribute key="org.eclipse.jdt.launching.CLASSPATH"> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry containerPath="org.eclipse.jdt.launching.JRE_CONTAINER" javaProject="deep_sequencing_unit" path="1" type="4"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="authentication" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis-common" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="openbis_api" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="dbmigration" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry path="3" projectName="common" type="1"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry internalArchive="/libraries/hibernate-search/jsr250-api.jar" path="3" type="2"/> "/> -<listEntry value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <runtimeClasspathEntry id="org.eclipse.jdt.launching.classpathentry.defaultClasspath"> <memento exportedEntriesOnly="false" project="deep_sequencing_unit"/> </runtimeClasspathEntry> "/> -</listAttribute> -<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="false"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.ethz.bsse.cisd.dsu.tracking.main.TrackingClient"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="deep_sequencing_unit"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx1G -Djavax.net.ssl.trustStore=etc/openBIS.keystore"/> -<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc:deep_sequencing_unit/tracking}"/> -</launchConfiguration> diff --git a/deep_sequencing_unit/resource/dependency-structure.ddf b/deep_sequencing_unit/resource/dependency-structure.ddf deleted file mode 100644 index e152acbfae5..00000000000 --- a/deep_sequencing_unit/resource/dependency-structure.ddf +++ /dev/null @@ -1,16 +0,0 @@ -#show allResults - -{root} = ch.ethz.bsse.cisd.dsu -{dss} = ${root}.dss -{openbis} = ch.systemsx.cisd.openbis - -###################################################################### -# Check dependencies to openbis - -[dss] = ${dss}.* -[private_openbis] = ${openbis}.* excluding [dss] ${openbis}.dss.generic.shared.* ${openbis}.generic.shared.* ${openbis}.dss.generic.server.plugins.* ${openbis}.common.* - -check sets [dss] - -check [dss] independentOf [private_openbis] - diff --git a/deep_sequencing_unit/resource/dsu-master-data.py b/deep_sequencing_unit/resource/dsu-master-data.py deleted file mode 100644 index 0a2e7e5b7db..00000000000 --- a/deep_sequencing_unit/resource/dsu-master-data.py +++ /dev/null @@ -1,3623 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.createNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -file_type_HDF5 = tr.createNewFileFormatType('HDF5') -file_type_HDF5.setDescription('Hierarchical Data Format File, version 5') - -file_type_PROPRIETARY = tr.createNewFileFormatType('PROPRIETARY') -file_type_PROPRIETARY.setDescription('Proprietary Format File') - -file_type_SRF = tr.createNewFileFormatType('SRF') -file_type_SRF.setDescription('Sequence Read Format File') - -file_type_TIFF = tr.createNewFileFormatType('TIFF') -file_type_TIFF.setDescription('TIFF File') - -file_type_TSV = tr.createNewFileFormatType('TSV') -file_type_TSV.setDescription('Tab Separated Values File') - -file_type_XML = tr.createNewFileFormatType('XML') -file_type_XML.setDescription('XML File') - -vocabulary_STORAGE_FORMAT = tr.createNewVocabulary('STORAGE_FORMAT') -vocabulary_STORAGE_FORMAT.setDescription('The on-disk storage format of a data set') -vocabulary_STORAGE_FORMAT.setUrlTemplate(None) -vocabulary_STORAGE_FORMAT.setManagedInternally(True) -vocabulary_STORAGE_FORMAT.setInternalNamespace(True) -vocabulary_STORAGE_FORMAT.setChosenFromList(True) - -vocabulary_term_STORAGE_FORMAT_PROPRIETARY = tr.createNewVocabularyTerm('PROPRIETARY') -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setDescription(None) -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setLabel(None) -vocabulary_term_STORAGE_FORMAT_PROPRIETARY.setOrdinal(1) -vocabulary_STORAGE_FORMAT.addTerm(vocabulary_term_STORAGE_FORMAT_PROPRIETARY) - -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY = tr.createNewVocabularyTerm('BDS_DIRECTORY') -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setDescription(None) -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setLabel(None) -vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY.setOrdinal(2) -vocabulary_STORAGE_FORMAT.addTerm(vocabulary_term_STORAGE_FORMAT_BDS_DIRECTORY) - -vocabulary_AFFILIATION = tr.createNewVocabulary('AFFILIATION') -vocabulary_AFFILIATION.setDescription('Where will the data be shipped after analysis and where will the bill be sent to') -vocabulary_AFFILIATION.setUrlTemplate(None) -vocabulary_AFFILIATION.setManagedInternally(False) -vocabulary_AFFILIATION.setInternalNamespace(False) -vocabulary_AFFILIATION.setChosenFromList(True) - -vocabulary_term_AFFILIATION_NOVARTIS = tr.createNewVocabularyTerm('NOVARTIS') -vocabulary_term_AFFILIATION_NOVARTIS.setDescription(None) -vocabulary_term_AFFILIATION_NOVARTIS.setLabel('Novartis') -vocabulary_term_AFFILIATION_NOVARTIS.setOrdinal(6) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_NOVARTIS) - -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE = tr.createNewVocabularyTerm('ETHZ_NON_BSSE') -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setDescription(None) -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setLabel('ETHZ non-BSSE') -vocabulary_term_AFFILIATION_ETHZ_NON_BSSE.setOrdinal(9) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_ETHZ_NON_BSSE) - -vocabulary_term_AFFILIATION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_AFFILIATION_OTHER.setDescription(None) -vocabulary_term_AFFILIATION_OTHER.setLabel('Other') -vocabulary_term_AFFILIATION_OTHER.setOrdinal(8) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_OTHER) - -vocabulary_term_AFFILIATION_BSSE = tr.createNewVocabularyTerm('BSSE') -vocabulary_term_AFFILIATION_BSSE.setDescription(None) -vocabulary_term_AFFILIATION_BSSE.setLabel('BSSE') -vocabulary_term_AFFILIATION_BSSE.setOrdinal(7) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_BSSE) - -vocabulary_term_AFFILIATION_UNI_ZUERICH = tr.createNewVocabularyTerm('UNI_ZUERICH') -vocabulary_term_AFFILIATION_UNI_ZUERICH.setDescription(None) -vocabulary_term_AFFILIATION_UNI_ZUERICH.setLabel(None) -vocabulary_term_AFFILIATION_UNI_ZUERICH.setOrdinal(11) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNI_ZUERICH) - -vocabulary_term_AFFILIATION_BIOCENTER_BASEL = tr.createNewVocabularyTerm('BIOCENTER_BASEL') -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setDescription(None) -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setLabel('Biocenter Basel') -vocabulary_term_AFFILIATION_BIOCENTER_BASEL.setOrdinal(3) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_BIOCENTER_BASEL) - -vocabulary_term_AFFILIATION_PHIX = tr.createNewVocabularyTerm('PHIX') -vocabulary_term_AFFILIATION_PHIX.setDescription(None) -vocabulary_term_AFFILIATION_PHIX.setLabel(None) -vocabulary_term_AFFILIATION_PHIX.setOrdinal(5) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_PHIX) - -vocabulary_term_AFFILIATION_UNI_BERN = tr.createNewVocabularyTerm('UNI_BERN') -vocabulary_term_AFFILIATION_UNI_BERN.setDescription(None) -vocabulary_term_AFFILIATION_UNI_BERN.setLabel(None) -vocabulary_term_AFFILIATION_UNI_BERN.setOrdinal(10) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNI_BERN) - -vocabulary_term_AFFILIATION_FMI = tr.createNewVocabularyTerm('FMI') -vocabulary_term_AFFILIATION_FMI.setDescription(None) -vocabulary_term_AFFILIATION_FMI.setLabel('FMI') -vocabulary_term_AFFILIATION_FMI.setOrdinal(2) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_FMI) - -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH = tr.createNewVocabularyTerm('UNIVERSITY_HOSPITAL_ZURICH') -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setDescription(None) -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setLabel(None) -vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH.setOrdinal(12) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNIVERSITY_HOSPITAL_ZURICH) - -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL = tr.createNewVocabularyTerm('UNIVERSITY_BASEL') -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setDescription(None) -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setLabel('University of Basel') -vocabulary_term_AFFILIATION_UNIVERSITY_BASEL.setOrdinal(4) -vocabulary_AFFILIATION.addTerm(vocabulary_term_AFFILIATION_UNIVERSITY_BASEL) - -vocabulary_AGILENT_KIT = tr.createNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setInternalNamespace(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.createNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setInternalNamespace(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(9) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127 = tr.createNewVocabularyTerm('BOWTIE_0.12.7') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE_0127) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(5) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(8) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_BARCODES = tr.createNewVocabulary('BARCODES') -vocabulary_BARCODES.setDescription('Index 1 for Illumina Indexing') -vocabulary_BARCODES.setUrlTemplate(None) -vocabulary_BARCODES.setManagedInternally(False) -vocabulary_BARCODES.setInternalNamespace(False) -vocabulary_BARCODES.setChosenFromList(True) - -vocabulary_term_BARCODES_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_BARCODES_TCGGCAA.setDescription(None) -vocabulary_term_BARCODES_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_BARCODES_TCGGCAA.setOrdinal(90) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCGGCAA) - -vocabulary_term_BARCODES_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_BARCODES_TATAATA.setDescription(None) -vocabulary_term_BARCODES_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_BARCODES_TATAATA.setOrdinal(86) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TATAATA) - -vocabulary_term_BARCODES_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_BARCODES_CTAGCTA.setDescription(None) -vocabulary_term_BARCODES_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_BARCODES_CTAGCTA.setOrdinal(80) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTAGCTA) - -vocabulary_term_BARCODES_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_BARCODES_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_BARCODES_GTGAAAC.setOrdinal(18) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGAAAC) - -vocabulary_term_BARCODES_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_BARCODES_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_BARCODES_CGTACGT.setOrdinal(21) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACGT) - -vocabulary_term_BARCODES_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_BARCODES_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_BARCODES_CGAGGCTG.setOrdinal(34) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGAGGCTG) - -vocabulary_term_BARCODES_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_BARCODES_TCATTCA.setDescription(None) -vocabulary_term_BARCODES_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_BARCODES_TCATTCA.setOrdinal(87) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCATTCA) - -vocabulary_term_BARCODES_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_BARCODES_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_BARCODES_TAGCTTA.setOrdinal(10) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAGCTTA) - -vocabulary_term_BARCODES_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_BARCODES_AGCATAA.setDescription(None) -vocabulary_term_BARCODES_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_BARCODES_AGCATAA.setOrdinal(42) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGCATAA) - -vocabulary_term_BARCODES_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_BARCODES_TTCGTCA.setDescription(None) -vocabulary_term_BARCODES_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_BARCODES_TTCGTCA.setOrdinal(40) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTCGTCA) - -vocabulary_term_BARCODES_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_BARCODES_TTACTTA.setDescription(None) -vocabulary_term_BARCODES_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_BARCODES_TTACTTA.setOrdinal(58) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTACTTA) - -vocabulary_term_BARCODES_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_BARCODES_GAAGCCA.setDescription(None) -vocabulary_term_BARCODES_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_BARCODES_GAAGCCA.setOrdinal(50) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GAAGCCA) - -vocabulary_term_BARCODES_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_BARCODES_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_BARCODES_CTCTCTAC.setOrdinal(31) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTCTCTAC) - -vocabulary_term_BARCODES_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_BARCODES_CGGAATA.setDescription(None) -vocabulary_term_BARCODES_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_BARCODES_CGGAATA.setOrdinal(79) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGGAATA) - -vocabulary_term_BARCODES_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_BARCODES_GTAGAGA.setDescription(None) -vocabulary_term_BARCODES_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_BARCODES_GTAGAGA.setOrdinal(62) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTAGAGA) - -vocabulary_term_BARCODES_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_BARCODES_CCGTCCA.setDescription(None) -vocabulary_term_BARCODES_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_BARCODES_CCGTCCA.setOrdinal(61) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGTCCA) - -vocabulary_term_BARCODES_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_BARCODES_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_BARCODES_CTTGTAA.setOrdinal(12) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTTGTAA) - -vocabulary_term_BARCODES_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_BARCODES_AGTCAAC.setDescription(None) -vocabulary_term_BARCODES_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_BARCODES_AGTCAAC.setOrdinal(91) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGTCAAC) - -vocabulary_term_BARCODES_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_BARCODES_CTGACCA.setDescription(None) -vocabulary_term_BARCODES_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_BARCODES_CTGACCA.setOrdinal(49) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTGACCA) - -vocabulary_term_BARCODES_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_BARCODES_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_BARCODES_TGACCAA.setOrdinal(4) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TGACCAA) - -vocabulary_term_BARCODES_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_BARCODES_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_BARCODES_ATCACGA.setOrdinal(1) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATCACGA) - -vocabulary_term_BARCODES_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_BARCODES_TCCCGAA.setDescription(None) -vocabulary_term_BARCODES_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_BARCODES_TCCCGAA.setOrdinal(88) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCCGAA) - -vocabulary_term_BARCODES_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_BARCODES_CAAAAGA.setDescription(None) -vocabulary_term_BARCODES_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_BARCODES_CAAAAGA.setOrdinal(70) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAAAAGA) - -vocabulary_term_BARCODES_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_BARCODES_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_BARCODES_CGTACTAG.setOrdinal(26) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACTAG) - -vocabulary_term_BARCODES_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_BARCODES_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_BARCODES_GGCTACA.setOrdinal(11) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGCTACA) - -vocabulary_term_BARCODES_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_BARCODES_ATGTCAA.setDescription(None) -vocabulary_term_BARCODES_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_BARCODES_ATGTCAA.setOrdinal(60) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGTCAA) - -vocabulary_term_BARCODES_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_BARCODES_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_BARCODES_GAGTGGA.setOrdinal(22) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GAGTGGA) - -vocabulary_term_BARCODES_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_BARCODES_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_BARCODES_GGACTCCT.setOrdinal(29) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGACTCCT) - -vocabulary_term_BARCODES_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_BARCODES_CTATACA.setDescription(None) -vocabulary_term_BARCODES_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_BARCODES_CTATACA.setOrdinal(81) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTATACA) - -vocabulary_term_BARCODES_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_BARCODES_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_BARCODES_TCCTGAGC.setOrdinal(28) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCTGAGC) - -vocabulary_term_BARCODES_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_BARCODES_CACTCAA.setDescription(None) -vocabulary_term_BARCODES_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_BARCODES_CACTCAA.setOrdinal(74) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACTCAA) - -vocabulary_term_BARCODES_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_BARCODES_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_BARCODES_CAGATCA.setOrdinal(7) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGATCA) - -vocabulary_term_BARCODES_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_BARCODES_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_BARCODES_CGATGTA.setOrdinal(2) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGATGTA) - -vocabulary_term_BARCODES_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_BARCODES_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_BARCODES_AGTTCCG.setOrdinal(14) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGTTCCG) - -vocabulary_term_BARCODES_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_BARCODES_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_BARCODES_TAAGGCGA.setOrdinal(25) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAAGGCGA) - -vocabulary_term_BARCODES_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_BARCODES_GACGACA.setDescription(None) -vocabulary_term_BARCODES_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_BARCODES_GACGACA.setOrdinal(83) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GACGACA) - -vocabulary_term_BARCODES_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_BARCODES_CACGATA.setDescription(None) -vocabulary_term_BARCODES_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_BARCODES_CACGATA.setOrdinal(73) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACGATA) - -vocabulary_term_BARCODES_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_BARCODES_CGCTCGA.setDescription(None) -vocabulary_term_BARCODES_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_BARCODES_CGCTCGA.setOrdinal(46) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGCTCGA) - -vocabulary_term_BARCODES_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_BARCODES_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_BARCODES_ACTGATA.setOrdinal(23) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTGATA) - -vocabulary_term_BARCODES_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_BARCODES_AATGCGA.setDescription(None) -vocabulary_term_BARCODES_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_BARCODES_AATGCGA.setOrdinal(92) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AATGCGA) - -vocabulary_term_BARCODES_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_BARCODES_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_BARCODES_GTCCGCA.setOrdinal(17) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTCCGCA) - -vocabulary_term_BARCODES_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_BARCODES_CGTACGA.setDescription(None) -vocabulary_term_BARCODES_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_BARCODES_CGTACGA.setOrdinal(66) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTACGA) - -vocabulary_term_BARCODES_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_BARCODES_GTGAAAA.setDescription(None) -vocabulary_term_BARCODES_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_BARCODES_GTGAAAA.setOrdinal(63) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGAAAA) - -vocabulary_term_BARCODES_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_BARCODES_GTTTCGA.setDescription(None) -vocabulary_term_BARCODES_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_BARCODES_GTTTCGA.setOrdinal(65) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTTTCGA) - -vocabulary_term_BARCODES_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_BARCODES_TAATCGA.setDescription(None) -vocabulary_term_BARCODES_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_BARCODES_TAATCGA.setOrdinal(84) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAATCGA) - -vocabulary_term_BARCODES_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_BARCODES_CAGATGA.setDescription(None) -vocabulary_term_BARCODES_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_BARCODES_CAGATGA.setOrdinal(44) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGATGA) - -vocabulary_term_BARCODES_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_BARCODES_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_BARCODES_ACTTGAA.setOrdinal(8) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTTGAA) - -vocabulary_term_BARCODES_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_BARCODES_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_BARCODES_GCCAATA.setOrdinal(6) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCCAATA) - -vocabulary_term_BARCODES_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_BARCODES_AAGACTA.setDescription(None) -vocabulary_term_BARCODES_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_BARCODES_AAGACTA.setOrdinal(37) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AAGACTA) - -vocabulary_term_BARCODES_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_BARCODES_TACAGCA.setDescription(None) -vocabulary_term_BARCODES_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_BARCODES_TACAGCA.setOrdinal(85) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TACAGCA) - -vocabulary_term_BARCODES_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_BARCODES_GCTGAAA.setDescription(None) -vocabulary_term_BARCODES_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_BARCODES_GCTGAAA.setOrdinal(51) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCTGAAA) - -vocabulary_term_BARCODES_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_BARCODES_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_BARCODES_AGATACA.setOrdinal(13) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGATACA) - -vocabulary_term_BARCODES_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_BARCODES_TATCGTA.setDescription(None) -vocabulary_term_BARCODES_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_BARCODES_TATCGTA.setOrdinal(55) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TATCGTA) - -vocabulary_term_BARCODES_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_BARCODES_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_BARCODES_CCGTCCC.setOrdinal(16) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGTCCC) - -vocabulary_term_BARCODES_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_BARCODES_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_BARCODES_ATTCCTT.setOrdinal(24) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATTCCTT) - -vocabulary_term_BARCODES_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_BARCODES_ATACGCA.setDescription(None) -vocabulary_term_BARCODES_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_BARCODES_ATACGCA.setOrdinal(43) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATACGCA) - -vocabulary_term_BARCODES_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_BARCODES_GCGCTGA.setDescription(None) -vocabulary_term_BARCODES_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_BARCODES_GCGCTGA.setOrdinal(54) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCGCTGA) - -vocabulary_term_BARCODES_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_BARCODES_TCGAAGA.setDescription(None) -vocabulary_term_BARCODES_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_BARCODES_TCGAAGA.setOrdinal(89) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCGAAGA) - -vocabulary_term_BARCODES_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_BARCODES_GTGGCCA.setDescription(None) -vocabulary_term_BARCODES_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_BARCODES_GTGGCCA.setOrdinal(64) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGGCCA) - -vocabulary_term_BARCODES_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_BARCODES_CTCAGAA.setDescription(None) -vocabulary_term_BARCODES_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_BARCODES_CTCAGAA.setOrdinal(82) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CTCAGAA) - -vocabulary_term_BARCODES_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_BARCODES_CACCGGA.setDescription(None) -vocabulary_term_BARCODES_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_BARCODES_CACCGGA.setOrdinal(72) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CACCGGA) - -vocabulary_term_BARCODES_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_BARCODES_GGTAGCA.setDescription(None) -vocabulary_term_BARCODES_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_BARCODES_GGTAGCA.setOrdinal(67) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GGTAGCA) - -vocabulary_term_BARCODES_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_BARCODES_CCATGAA.setDescription(None) -vocabulary_term_BARCODES_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_BARCODES_CCATGAA.setOrdinal(48) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCATGAA) - -vocabulary_term_BARCODES_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_BARCODES_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_BARCODES_CAGAGAGG.setOrdinal(32) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGAGAGG) - -vocabulary_term_BARCODES_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_BARCODES_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_BARCODES_ACAGTGA.setOrdinal(5) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACAGTGA) - -vocabulary_term_BARCODES_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_BARCODES_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_BARCODES_GCTACGCT.setOrdinal(33) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GCTACGCT) - -vocabulary_term_BARCODES_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_BARCODES_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_BARCODES_GTAGAGGA.setOrdinal(36) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTAGAGGA) - -vocabulary_term_BARCODES_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_BARCODES_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_BARCODES_AGGCAGAA.setOrdinal(27) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGGCAGAA) - -vocabulary_term_BARCODES_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_BARCODES_TCCTACA.setDescription(None) -vocabulary_term_BARCODES_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_BARCODES_TCCTACA.setOrdinal(56) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCCTACA) - -vocabulary_term_BARCODES_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_BARCODES_TCTATAA.setDescription(None) -vocabulary_term_BARCODES_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_BARCODES_TCTATAA.setOrdinal(57) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TCTATAA) - -vocabulary_term_BARCODES_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_BARCODES_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_BARCODES_TTAGGCA.setOrdinal(3) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTAGGCA) - -vocabulary_term_BARCODES_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_BARCODES_CCAACAA.setDescription(None) -vocabulary_term_BARCODES_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_BARCODES_CCAACAA.setOrdinal(78) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCAACAA) - -vocabulary_term_BARCODES_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_BARCODES_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_BARCODES_ATGTCAG.setOrdinal(15) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGTCAG) - -vocabulary_term_BARCODES_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_BARCODES_CAGGCGA.setDescription(None) -vocabulary_term_BARCODES_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_BARCODES_CAGGCGA.setOrdinal(75) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAGGCGA) - -vocabulary_term_BARCODES_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_BARCODES_ATGAGCA.setDescription(None) -vocabulary_term_BARCODES_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_BARCODES_ATGAGCA.setOrdinal(68) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATGAGCA) - -vocabulary_term_BARCODES_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_BARCODES_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_BARCODES_GTTTCGG.setOrdinal(20) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTTTCGG) - -vocabulary_term_BARCODES_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_BARCODES_ATTCCTA.setDescription(None) -vocabulary_term_BARCODES_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_BARCODES_ATTCCTA.setOrdinal(69) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ATTCCTA) - -vocabulary_term_BARCODES_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_BARCODES_CGTATTA.setDescription(None) -vocabulary_term_BARCODES_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_BARCODES_CGTATTA.setOrdinal(47) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CGTATTA) - -vocabulary_term_BARCODES_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_BARCODES_CCGAATA.setDescription(None) -vocabulary_term_BARCODES_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_BARCODES_CCGAATA.setOrdinal(45) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CCGAATA) - -vocabulary_term_BARCODES_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_BARCODES_CATGGCA.setDescription(None) -vocabulary_term_BARCODES_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_BARCODES_CATGGCA.setOrdinal(76) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CATGGCA) - -vocabulary_term_BARCODES_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_BARCODES_GTCGCGA.setDescription(None) -vocabulary_term_BARCODES_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_BARCODES_GTCGCGA.setOrdinal(52) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTCGCGA) - -vocabulary_term_BARCODES_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_BARCODES_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_BARCODES_GATCAGA.setOrdinal(9) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GATCAGA) - -vocabulary_term_BARCODES_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_BARCODES_CATTTTA.setDescription(None) -vocabulary_term_BARCODES_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_BARCODES_CATTTTA.setOrdinal(77) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CATTTTA) - -vocabulary_term_BARCODES_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_BARCODES_AGGTTGA.setDescription(None) -vocabulary_term_BARCODES_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_BARCODES_AGGTTGA.setOrdinal(39) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AGGTTGA) - -vocabulary_term_BARCODES_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_BARCODES_TAAGATA.setDescription(None) -vocabulary_term_BARCODES_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_BARCODES_TAAGATA.setOrdinal(53) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAAGATA) - -vocabulary_term_BARCODES_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_BARCODES_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_BARCODES_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_BARCODES_AAGAGGCA.setOrdinal(35) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_AAGAGGCA) - -vocabulary_term_BARCODES_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_BARCODES_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_BARCODES_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_BARCODES_GTGGCCT.setOrdinal(19) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_GTGGCCT) - -vocabulary_term_BARCODES_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_BARCODES_TTCCGAA.setDescription(None) -vocabulary_term_BARCODES_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_BARCODES_TTCCGAA.setOrdinal(59) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TTCCGAA) - -vocabulary_term_BARCODES_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_BARCODES_ACTTCAA.setDescription(None) -vocabulary_term_BARCODES_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_BARCODES_ACTTCAA.setOrdinal(38) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_ACTTCAA) - -vocabulary_term_BARCODES_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_BARCODES_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_BARCODES_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_BARCODES_TAGGCATG.setOrdinal(30) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_TAGGCATG) - -vocabulary_term_BARCODES_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_BARCODES_CAACTAA.setDescription(None) -vocabulary_term_BARCODES_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_BARCODES_CAACTAA.setOrdinal(71) -vocabulary_BARCODES.addTerm(vocabulary_term_BARCODES_CAACTAA) - -vocabulary_CASAVA_VERSION = tr.createNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setInternalNamespace(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.createNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(16) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(8) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(14) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(15) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_CLUSTER_STATION = tr.createNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_SPUTNIK = tr.createNewVocabularyTerm('SPUTNIK') -vocabulary_term_CLUSTER_STATION_SPUTNIK.setDescription(None) -vocabulary_term_CLUSTER_STATION_SPUTNIK.setLabel('Sputnik') -vocabulary_term_CLUSTER_STATION_SPUTNIK.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_SPUTNIK) - -vocabulary_term_CLUSTER_STATION_ISS = tr.createNewVocabularyTerm('ISS') -vocabulary_term_CLUSTER_STATION_ISS.setDescription(None) -vocabulary_term_CLUSTER_STATION_ISS.setLabel('ISS (CS2)') -vocabulary_term_CLUSTER_STATION_ISS.setOrdinal(3) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_ISS) - -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION = tr.createNewVocabulary('CLUSTER_STATION_SOFTWARE_VERSION') -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setDescription(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN = tr.createNewVocabularyTerm('NOT_KNOWN') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setLabel(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setOrdinal(6) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06 = tr.createNewVocabularyTerm('GALAXY_0.6') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setDescription('Old Cluster Station') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setLabel('Galaxy 0.6 Build 98') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setOrdinal(3) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360 = tr.createNewVocabularyTerm('CBOT_1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setLabel('cBot 1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setOrdinal(1) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360) - -vocabulary_CONTROL_LANE = tr.createNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setInternalNamespace(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_CYCLES = tr.createNewVocabulary('CYCLES') -vocabulary_CYCLES.setDescription('Number of cycles') -vocabulary_CYCLES.setUrlTemplate(None) -vocabulary_CYCLES.setManagedInternally(False) -vocabulary_CYCLES.setInternalNamespace(False) -vocabulary_CYCLES.setChosenFromList(True) - -vocabulary_term_CYCLES_101 = tr.createNewVocabularyTerm('101') -vocabulary_term_CYCLES_101.setDescription(None) -vocabulary_term_CYCLES_101.setLabel(None) -vocabulary_term_CYCLES_101.setOrdinal(4) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_101) - -vocabulary_term_CYCLES_51 = tr.createNewVocabularyTerm('51') -vocabulary_term_CYCLES_51.setDescription(None) -vocabulary_term_CYCLES_51.setLabel(None) -vocabulary_term_CYCLES_51.setOrdinal(6) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_51) - -vocabulary_term_CYCLES_58 = tr.createNewVocabularyTerm('58') -vocabulary_term_CYCLES_58.setDescription(None) -vocabulary_term_CYCLES_58.setLabel(None) -vocabulary_term_CYCLES_58.setOrdinal(7) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_58) - -vocabulary_term_CYCLES_100 = tr.createNewVocabularyTerm('100') -vocabulary_term_CYCLES_100.setDescription(None) -vocabulary_term_CYCLES_100.setLabel(None) -vocabulary_term_CYCLES_100.setOrdinal(12) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_100) - -vocabulary_term_CYCLES_151 = tr.createNewVocabularyTerm('151') -vocabulary_term_CYCLES_151.setDescription(None) -vocabulary_term_CYCLES_151.setLabel(None) -vocabulary_term_CYCLES_151.setOrdinal(11) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_151) - -vocabulary_term_CYCLES_49 = tr.createNewVocabularyTerm('49') -vocabulary_term_CYCLES_49.setDescription(None) -vocabulary_term_CYCLES_49.setLabel(None) -vocabulary_term_CYCLES_49.setOrdinal(15) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_49) - -vocabulary_term_CYCLES_50 = tr.createNewVocabularyTerm('50') -vocabulary_term_CYCLES_50.setDescription(None) -vocabulary_term_CYCLES_50.setLabel(None) -vocabulary_term_CYCLES_50.setOrdinal(2) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_50) - -vocabulary_term_CYCLES_150 = tr.createNewVocabularyTerm('150') -vocabulary_term_CYCLES_150.setDescription(None) -vocabulary_term_CYCLES_150.setLabel(None) -vocabulary_term_CYCLES_150.setOrdinal(14) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_150) - -vocabulary_term_CYCLES_36 = tr.createNewVocabularyTerm('36') -vocabulary_term_CYCLES_36.setDescription(None) -vocabulary_term_CYCLES_36.setLabel(None) -vocabulary_term_CYCLES_36.setOrdinal(1) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_36) - -vocabulary_term_CYCLES_108 = tr.createNewVocabularyTerm('108') -vocabulary_term_CYCLES_108.setDescription(None) -vocabulary_term_CYCLES_108.setLabel(None) -vocabulary_term_CYCLES_108.setOrdinal(13) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_108) - -vocabulary_term_CYCLES_76 = tr.createNewVocabularyTerm('76') -vocabulary_term_CYCLES_76.setDescription(None) -vocabulary_term_CYCLES_76.setLabel(None) -vocabulary_term_CYCLES_76.setOrdinal(3) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_76) - -vocabulary_term_CYCLES_125 = tr.createNewVocabularyTerm('125') -vocabulary_term_CYCLES_125.setDescription(None) -vocabulary_term_CYCLES_125.setLabel(None) -vocabulary_term_CYCLES_125.setOrdinal(10) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_125) - -vocabulary_END_TYPE = tr.createNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setInternalNamespace(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(3) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_EXPERIMENT_DESIGN = tr.createNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setInternalNamespace(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_INDEX2 = tr.createNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setInternalNamespace(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_KIT = tr.createNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setInternalNamespace(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(20) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(19) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(23) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(14) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(17) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(15) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(22) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(21) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(18) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(16) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_MACS_VERSION = tr.createNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setInternalNamespace(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(4) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(3) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_MISMATCH_IN_INDEX = tr.createNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setInternalNamespace(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_NANO_DROP = tr.createNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setInternalNamespace(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.createNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setInternalNamespace(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(38) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\nInherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\nInherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\nInherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel(' Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(42) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(34) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\nInherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\nInherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(41) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription("Genbank common name: baker's yeast\nInherited blast name: ascomycetes") -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(40) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\nInherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\nPasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\nEbert D, Rainey P, Embley TM, Scholz D. Development, life\n cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate\n endoparasite of Daphnia magna Straus. Philos Trans R Soc\n Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(50) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\nInherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\nInherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\nInherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\nInherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(33) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(39) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(35) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_PIPELINE_VERSION = tr.createNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setInternalNamespace(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(26) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(23) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(22) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_1124 = tr.createNewVocabularyTerm('1.12.4') -vocabulary_term_PIPELINE_VERSION_1124.setDescription(None) -vocabulary_term_PIPELINE_VERSION_1124.setLabel('RTA 1.12.4 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_1124.setOrdinal(3) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_1124) - -vocabulary_term_PIPELINE_VERSION_RTA = tr.createNewVocabularyTerm('RTA') -vocabulary_term_PIPELINE_VERSION_RTA.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA.setLabel(None) -vocabulary_term_PIPELINE_VERSION_RTA.setOrdinal(30) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(17) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(18) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(27) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(29) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_REQUIRED_LANES = tr.createNewVocabulary('REQUIRED_LANES') -vocabulary_REQUIRED_LANES.setDescription('Amount of lanes needed for this probe') -vocabulary_REQUIRED_LANES.setUrlTemplate(None) -vocabulary_REQUIRED_LANES.setManagedInternally(False) -vocabulary_REQUIRED_LANES.setInternalNamespace(False) -vocabulary_REQUIRED_LANES.setChosenFromList(True) - -vocabulary_term_REQUIRED_LANES_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_REQUIRED_LANES_7.setDescription(None) -vocabulary_term_REQUIRED_LANES_7.setLabel(None) -vocabulary_term_REQUIRED_LANES_7.setOrdinal(8) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_7) - -vocabulary_term_REQUIRED_LANES_13 = tr.createNewVocabularyTerm('13') -vocabulary_term_REQUIRED_LANES_13.setDescription(None) -vocabulary_term_REQUIRED_LANES_13.setLabel(None) -vocabulary_term_REQUIRED_LANES_13.setOrdinal(15) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_13) - -vocabulary_term_REQUIRED_LANES_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_REQUIRED_LANES_8.setDescription(None) -vocabulary_term_REQUIRED_LANES_8.setLabel(None) -vocabulary_term_REQUIRED_LANES_8.setOrdinal(10) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_8) - -vocabulary_term_REQUIRED_LANES_14 = tr.createNewVocabularyTerm('14') -vocabulary_term_REQUIRED_LANES_14.setDescription(None) -vocabulary_term_REQUIRED_LANES_14.setLabel(None) -vocabulary_term_REQUIRED_LANES_14.setOrdinal(16) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_14) - -vocabulary_term_REQUIRED_LANES_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_REQUIRED_LANES_3.setDescription(None) -vocabulary_term_REQUIRED_LANES_3.setLabel(None) -vocabulary_term_REQUIRED_LANES_3.setOrdinal(4) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_3) - -vocabulary_term_REQUIRED_LANES_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_REQUIRED_LANES_4.setDescription(None) -vocabulary_term_REQUIRED_LANES_4.setLabel(None) -vocabulary_term_REQUIRED_LANES_4.setOrdinal(5) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_4) - -vocabulary_term_REQUIRED_LANES_16 = tr.createNewVocabularyTerm('16') -vocabulary_term_REQUIRED_LANES_16.setDescription(None) -vocabulary_term_REQUIRED_LANES_16.setLabel(None) -vocabulary_term_REQUIRED_LANES_16.setOrdinal(18) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_16) - -vocabulary_term_REQUIRED_LANES_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_REQUIRED_LANES_5.setDescription(None) -vocabulary_term_REQUIRED_LANES_5.setLabel(None) -vocabulary_term_REQUIRED_LANES_5.setOrdinal(6) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_5) - -vocabulary_term_REQUIRED_LANES_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_REQUIRED_LANES_2.setDescription(None) -vocabulary_term_REQUIRED_LANES_2.setLabel(None) -vocabulary_term_REQUIRED_LANES_2.setOrdinal(3) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_2) - -vocabulary_term_REQUIRED_LANES_15 = tr.createNewVocabularyTerm('15') -vocabulary_term_REQUIRED_LANES_15.setDescription(None) -vocabulary_term_REQUIRED_LANES_15.setLabel(None) -vocabulary_term_REQUIRED_LANES_15.setOrdinal(17) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_15) - -vocabulary_term_REQUIRED_LANES_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_REQUIRED_LANES_6.setDescription(None) -vocabulary_term_REQUIRED_LANES_6.setLabel(None) -vocabulary_term_REQUIRED_LANES_6.setOrdinal(7) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_6) - -vocabulary_term_REQUIRED_LANES_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_REQUIRED_LANES_1.setDescription(None) -vocabulary_term_REQUIRED_LANES_1.setLabel(None) -vocabulary_term_REQUIRED_LANES_1.setOrdinal(2) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_1) - -vocabulary_term_REQUIRED_LANES_11 = tr.createNewVocabularyTerm('11') -vocabulary_term_REQUIRED_LANES_11.setDescription(None) -vocabulary_term_REQUIRED_LANES_11.setLabel(None) -vocabulary_term_REQUIRED_LANES_11.setOrdinal(13) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_11) - -vocabulary_term_REQUIRED_LANES_10 = tr.createNewVocabularyTerm('10') -vocabulary_term_REQUIRED_LANES_10.setDescription(None) -vocabulary_term_REQUIRED_LANES_10.setLabel(None) -vocabulary_term_REQUIRED_LANES_10.setOrdinal(12) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_10) - -vocabulary_term_REQUIRED_LANES_12 = tr.createNewVocabularyTerm('12') -vocabulary_term_REQUIRED_LANES_12.setDescription(None) -vocabulary_term_REQUIRED_LANES_12.setLabel(None) -vocabulary_term_REQUIRED_LANES_12.setOrdinal(14) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_12) - -vocabulary_term_REQUIRED_LANES_9 = tr.createNewVocabularyTerm('9') -vocabulary_term_REQUIRED_LANES_9.setDescription(None) -vocabulary_term_REQUIRED_LANES_9.setLabel(None) -vocabulary_term_REQUIRED_LANES_9.setOrdinal(11) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_9) - -vocabulary_SAMPLE_LIBRARY_SELECTION = tr.createNewVocabulary('SAMPLE_LIBRARY_SELECTION') -vocabulary_SAMPLE_LIBRARY_SELECTION.setDescription('Describes whether any method was used to select and/or enrich the material being sequenced.') -vocabulary_SAMPLE_LIBRARY_SELECTION.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR = tr.createNewVocabularyTerm('RANDOM_PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setDescription('Source material was selected by randomly generated primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setLabel('RANDOM PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST = tr.createNewVocabularyTerm('RESTRICTION_DIGEST') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setDescription('Restriction enzyme digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setLabel('Restriction Digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setDescription('Chromatin immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setLabel('ChIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS = tr.createNewVocabularyTerm('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setDescription('Cot-filtered single/low-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setLabel('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED = tr.createNewVocabularyTerm('UNSPECIFIED') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setLabel('unspecified') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setOrdinal(18) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH = tr.createNewVocabularyTerm('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setDescription('Cot-filtered highly repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setLabel('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM = tr.createNewVocabularyTerm('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setDescription('Random shearing only') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setLabel('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR = tr.createNewVocabularyTerm('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setDescription('Hypo-methylated partial restriction digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setLabel('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE = tr.createNewVocabularyTerm('MNASE') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setDescription('Micrococcal Nuclease (MNase) digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setLabel('MNase') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY = tr.createNewVocabularyTerm('5-METHYLCYTIDINE_ANTIBODY') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setDescription('Methylated DNA immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setLabel('5-methylcytidine antibody') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR = tr.createNewVocabularyTerm('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setDescription('Source material was selected by reverse transcription PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setLabel('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM = tr.createNewVocabularyTerm('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setDescription('Cot-filtered moderately repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setLabel('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA = tr.createNewVocabularyTerm('CDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setDescription('complementary DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setLabel('cDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF = tr.createNewVocabularyTerm('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setDescription('Methyl Filtrated') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setLabel('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setLabel('other') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR = tr.createNewVocabularyTerm('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setDescription('Source material was selected by designed primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setLabel('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL = tr.createNewVocabularyTerm('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setDescription('Methylation Spanning Linking Library') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setLabel('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT = tr.createNewVocabularyTerm('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setDescription('Cot-filtered theoretical single-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setLabel('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT) - -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC = tr.createNewVocabulary('SAMPLE_LIBRARY_SOURCE_VOC') -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setDescription(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC = tr.createNewVocabularyTerm('GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA = tr.createNewVocabularyTerm('RNA') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA) - -vocabulary_SAMPLE_LIBRARY_STRATEGY = tr.createNewVocabulary('SAMPLE_LIBRARY_STRATEGY') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setDescription('Sequencing technique for this library.') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON = tr.createNewVocabularyTerm('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setDescription('Sequencing of overlapping or distinct PCR or RT-PCR products') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setLabel('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ = tr.createNewVocabularyTerm('CHIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setDescription('Direct sequencing of chromatin immunoprecipitates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setLabel('ChIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ = tr.createNewVocabularyTerm('RNA-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setDescription('RNA sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setLabel('RNA-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setDescription('Library strategy not listed') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setLabel('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS = tr.createNewVocabularyTerm('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setDescription('Concatenated Tag Sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setLabel('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ = tr.createNewVocabularyTerm('MNASE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setDescription('Direct sequencing following MNase digestion') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setLabel('MNase-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST = tr.createNewVocabularyTerm('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setDescription('Single pass sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setLabel('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA = tr.createNewVocabularyTerm('FL-CDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setDescription('Full-length sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setLabel('FL-cDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND = tr.createNewVocabularyTerm('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setDescription("Clone end (5', 3', or both) sequencing") -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setLabel('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ = tr.createNewVocabularyTerm('MEDIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setDescription('Methylated DNA immunoprecipitation sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setLabel('MeDIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE = tr.createNewVocabularyTerm('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setDescription('Sequencing of products that have been tagged with a short identifying sequence (barcode)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setLabel('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ = tr.createNewVocabularyTerm('MRE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setDescription('Methylation-sensitive restriction enzyme sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setLabel('MRE-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING = tr.createNewVocabularyTerm('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setDescription('Sequencing intended to finish (close) gaps in existing coverage') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setLabel('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS = tr.createNewVocabularyTerm('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setDescription('Whole chromosome (or other replicon) shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setLabel('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE = tr.createNewVocabularyTerm('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setDescription('Shotgun of pooled clones (usually BACs and Fosmids)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setLabel('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE = tr.createNewVocabularyTerm('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setDescription('Genomic clone based (hierarchical) sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setLabel('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS = tr.createNewVocabularyTerm('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setDescription('Whole genome shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setLabel('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS) - -vocabulary_SAMPLE_MOLECULE = tr.createNewVocabulary('SAMPLE_MOLECULE') -vocabulary_SAMPLE_MOLECULE.setDescription(None) -vocabulary_SAMPLE_MOLECULE.setUrlTemplate(None) -vocabulary_SAMPLE_MOLECULE.setManagedInternally(False) -vocabulary_SAMPLE_MOLECULE.setInternalNamespace(False) -vocabulary_SAMPLE_MOLECULE.setChosenFromList(True) - -vocabulary_term_SAMPLE_MOLECULE_PROTEIN = tr.createNewVocabularyTerm('PROTEIN') -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setOrdinal(6) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_PROTEIN) - -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setOrdinal(1) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA) - -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA = tr.createNewVocabularyTerm('CYTOPLASMIC_RNA') -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setOrdinal(3) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA) - -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA = tr.createNewVocabularyTerm('NUCLEAR_RNA') -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setOrdinal(4) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA) - -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setOrdinal(5) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA = tr.createNewVocabularyTerm('POLYA_RNA') -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setOrdinal(2) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA) - -vocabulary_term_SAMPLE_MOLECULE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_MOLECULE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setOrdinal(18) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_OTHER) - -vocabulary_SAMPLE_TYPE = tr.createNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setInternalNamespace(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(12) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.createNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(6) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_SCS_PROTOCOL_VERSION = tr.createNewVocabulary('SCS_PROTOCOL_VERSION') -vocabulary_SCS_PROTOCOL_VERSION.setDescription('THE Illumina protocol') -vocabulary_SCS_PROTOCOL_VERSION.setUrlTemplate(None) -vocabulary_SCS_PROTOCOL_VERSION.setManagedInternally(False) -vocabulary_SCS_PROTOCOL_VERSION.setInternalNamespace(False) -vocabulary_SCS_PROTOCOL_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_PROTOCOL_VERSION_V7 = tr.createNewVocabularyTerm('V7') -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setOrdinal(3) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V7) - -vocabulary_term_SCS_PROTOCOL_VERSION_V8 = tr.createNewVocabularyTerm('V8') -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setOrdinal(1) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V8) - -vocabulary_term_SCS_PROTOCOL_VERSION_V6 = tr.createNewVocabularyTerm('V6') -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setOrdinal(2) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V6) - -vocabulary_SCS_SOFTWARE_VERSION = tr.createNewVocabulary('SCS_SOFTWARE_VERSION') -vocabulary_SCS_SOFTWARE_VERSION.setDescription('Software version of the Sequencing PC attached to the GA') -vocabulary_SCS_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_SCS_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_SCS_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_SCS_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145 = tr.createNewVocabularyTerm('HCS_1.4.5') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setLabel('HCS 1.4.5/RTA 1.12.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setOrdinal(2) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145) - -vocabulary_term_SCS_SOFTWARE_VERSION_210 = tr.createNewVocabularyTerm('2.10') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_210.setLabel('2.10/RTA 1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setOrdinal(4) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_210) - -vocabulary_term_SCS_SOFTWARE_VERSION_25 = tr.createNewVocabularyTerm('2.5') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_25.setLabel('2.5 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setOrdinal(8) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_25) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515 = tr.createNewVocabularyTerm('HCS_1.5.15') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setLabel('HCS 1.5.15/1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setOrdinal(1) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515) - -vocabulary_term_SCS_SOFTWARE_VERSION_28 = tr.createNewVocabularyTerm('2.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_28.setLabel('2.8/RTA 1.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setOrdinal(6) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_28) - -vocabulary_term_SCS_SOFTWARE_VERSION_26 = tr.createNewVocabularyTerm('2.6') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_26.setLabel('2.6/RTA 1.6 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setOrdinal(7) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_26) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14 = tr.createNewVocabularyTerm('HCS_1.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setLabel('HCS 1.4/RTA 1.12') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setOrdinal(3) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14) - -vocabulary_term_SCS_SOFTWARE_VERSION_24 = tr.createNewVocabularyTerm('2.4') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_24.setLabel('2.4 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setOrdinal(9) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_24) - -vocabulary_term_SCS_SOFTWARE_VERSION_29 = tr.createNewVocabularyTerm('2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_29.setLabel('2.9/RTA2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setOrdinal(5) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_29) - -vocabulary_SEQUENCER = tr.createNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setInternalNamespace(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_ATTILA = tr.createNewVocabularyTerm('ATTILA') -vocabulary_term_SEQUENCER_ATTILA.setDescription('old GA II, do not use any more (deprecated)') -vocabulary_term_SEQUENCER_ATTILA.setLabel('Attila GA II') -vocabulary_term_SEQUENCER_ATTILA.setOrdinal(6) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ATTILA) - -vocabulary_term_SEQUENCER_RUA = tr.createNewVocabularyTerm('RUA') -vocabulary_term_SEQUENCER_RUA.setDescription('back of the room') -vocabulary_term_SEQUENCER_RUA.setLabel('Rua HiSeq2000') -vocabulary_term_SEQUENCER_RUA.setOrdinal(1) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_RUA) - -vocabulary_term_SEQUENCER_ELLAC = tr.createNewVocabularyTerm('ELLAC') -vocabulary_term_SEQUENCER_ELLAC.setDescription('GA IIx at the front of the room') -vocabulary_term_SEQUENCER_ELLAC.setLabel('Ellac GA IIx') -vocabulary_term_SEQUENCER_ELLAC.setOrdinal(4) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ELLAC) - -vocabulary_term_SEQUENCER_ATTILAX = tr.createNewVocabularyTerm('ATTILAX') -vocabulary_term_SEQUENCER_ATTILAX.setDescription('Upgraded Attila, back of the room (deprecated)') -vocabulary_term_SEQUENCER_ATTILAX.setLabel('Attila GA IIx') -vocabulary_term_SEQUENCER_ATTILAX.setOrdinal(5) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_ATTILAX) - -vocabulary_term_SEQUENCER_KITT = tr.createNewVocabularyTerm('KITT') -vocabulary_term_SEQUENCER_KITT.setDescription(None) -vocabulary_term_SEQUENCER_KITT.setLabel('Kitt HiSeq2500') -vocabulary_term_SEQUENCER_KITT.setOrdinal(2) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_KITT) - -vocabulary_SEQUENCING_APPLICATION = tr.createNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setInternalNamespace(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -vocabulary_TRANSFER_METHOD = tr.createNewVocabulary('TRANSFER_METHOD') -vocabulary_TRANSFER_METHOD.setDescription('How does the customer get the data') -vocabulary_TRANSFER_METHOD.setUrlTemplate(None) -vocabulary_TRANSFER_METHOD.setManagedInternally(False) -vocabulary_TRANSFER_METHOD.setInternalNamespace(False) -vocabulary_TRANSFER_METHOD.setChosenFromList(True) - -vocabulary_term_TRANSFER_METHOD_RSYNC = tr.createNewVocabularyTerm('RSYNC') -vocabulary_term_TRANSFER_METHOD_RSYNC.setDescription(None) -vocabulary_term_TRANSFER_METHOD_RSYNC.setLabel(None) -vocabulary_term_TRANSFER_METHOD_RSYNC.setOrdinal(1) -vocabulary_TRANSFER_METHOD.addTerm(vocabulary_term_TRANSFER_METHOD_RSYNC) - -exp_type_HT_SEQUENCING = tr.createNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina GA)') - -samp_type_ILLUMINA_FLOW_CELL = tr.createNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Flow Cell containing eight Flow Lanes') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('BSSE-QGF-FC-') - -samp_type_ILLUMINA_FLOW_LANE = tr.createNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Flow Lane containing one Biological Sample') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('BSSE-QGF-FL-') - -samp_type_ILLUMINA_SEQUENCING = tr.createNewSampleType('ILLUMINA_SEQUENCING') -samp_type_ILLUMINA_SEQUENCING.setDescription('Biological Sample') -samp_type_ILLUMINA_SEQUENCING.setListable(True) -samp_type_ILLUMINA_SEQUENCING.setSubcodeUnique(False) -samp_type_ILLUMINA_SEQUENCING.setAutoGeneratedCode(True) -samp_type_ILLUMINA_SEQUENCING.setGeneratedCodePrefix('BSSE-QGF-') - -data_set_type_ALIGNMENT = tr.createNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') - -data_set_type_BASECALL_STATS = tr.createNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics') - -data_set_type_BIGWIGGLE = tr.createNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('visualization') - -data_set_type_ELAND_ALIGNMENT = tr.createNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') - -data_set_type_FASTQ_GZ = tr.createNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') - -data_set_type_ILLUMINA_GA_OUTPUT = tr.createNewDataSetType('ILLUMINA_GA_OUTPUT') -data_set_type_ILLUMINA_GA_OUTPUT.setDescription('The directory structure as produced by the Illumina GA Pipeline (whatever Illumina spits out)') - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.createNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') - -data_set_type_MACS_OUTPUT = tr.createNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') - -data_set_type_QUALITY_JPGS = tr.createNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') - -data_set_type_QUALITY_PDFS = tr.createNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') - -data_set_type_QUALITY_SVG = tr.createNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') - -data_set_type_RUNINFO = tr.createNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') - -data_set_type_SRF_PER_LANE = tr.createNewDataSetType('SRF_PER_LANE') -data_set_type_SRF_PER_LANE.setDescription('Short Read Format file (SRF) plus meta data file (TSV)') - -data_set_type_THUMBNAILS = tr.createNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') - -data_set_type_TSV = tr.createNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') - -data_set_type_UNKNOWN = tr.createNewDataSetType('UNKNOWN') -data_set_type_UNKNOWN.setDescription('Unknown') - -prop_type_AFFILIATION = tr.createNewPropertyType('AFFILIATION', DataType.CONTROLLEDVOCABULARY) -prop_type_AFFILIATION.setLabel('Affiliation') -prop_type_AFFILIATION.setManagedInternally(False) -prop_type_AFFILIATION.setInternalNamespace(False) - -prop_type_AFFILIATION.setVocabulary(vocabulary_AFFILIATION) - -prop_type_AGILENT_KIT = tr.createNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) -prop_type_AGILENT_KIT.setInternalNamespace(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.createNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) -prop_type_ALIGNMENT_SOFTWARE.setInternalNamespace(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.createNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) -prop_type_ANALYSIS_FINISHED.setInternalNamespace(False) - - -prop_type_BARCODE = tr.createNewPropertyType('BARCODE', DataType.CONTROLLEDVOCABULARY) -prop_type_BARCODE.setLabel('Index 1') -prop_type_BARCODE.setManagedInternally(False) -prop_type_BARCODE.setInternalNamespace(False) - -prop_type_BARCODE.setVocabulary(vocabulary_BARCODES) - -prop_type_BARCODES = tr.createNewPropertyType('BARCODES', DataType.MULTILINE_VARCHAR) -prop_type_BARCODES.setLabel('Adaptor and Barcodes') -prop_type_BARCODES.setManagedInternally(False) -prop_type_BARCODES.setInternalNamespace(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.createNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) -prop_type_BARCODE_COMPLEXITY_CHECKER.setInternalNamespace(False) - - -prop_type_BARCODE_LENGTH = tr.createNewPropertyType('BARCODE_LENGTH', DataType.INTEGER) -prop_type_BARCODE_LENGTH.setLabel('Barcode Length (+ recognition site)') -prop_type_BARCODE_LENGTH.setManagedInternally(False) -prop_type_BARCODE_LENGTH.setInternalNamespace(False) - - -prop_type_BAREBACKED = tr.createNewPropertyType('BAREBACKED', DataType.BOOLEAN) -prop_type_BAREBACKED.setLabel('Barebacked?') -prop_type_BAREBACKED.setManagedInternally(False) -prop_type_BAREBACKED.setInternalNamespace(False) - - -prop_type_BASESCOVERED = tr.createNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) -prop_type_BASESCOVERED.setInternalNamespace(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.createNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setInternalNamespace(False) - - -prop_type_CALCLUATED_EXAMPLE = tr.createNewPropertyType('CALCLUATED_EXAMPLE', DataType.REAL) -prop_type_CALCLUATED_EXAMPLE.setLabel('Calcluated_example') -prop_type_CALCLUATED_EXAMPLE.setManagedInternally(False) -prop_type_CALCLUATED_EXAMPLE.setInternalNamespace(False) - - -prop_type_CASAVA_VERSION = tr.createNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) -prop_type_CASAVA_VERSION.setInternalNamespace(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.createNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) -prop_type_CELL_PLASTICITY_SYSTEMSX.setInternalNamespace(False) - - -prop_type_CHROMCOUNT = tr.createNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) -prop_type_CHROMCOUNT.setInternalNamespace(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.createNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.createNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) -prop_type_CLUSTER_STATION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION = tr.createNewPropertyType('CLUSTER_STATION_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setLabel('CS Software version') -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setVocabulary(vocabulary_CLUSTER_STATION_SOFTWARE_VERSION) - -prop_type_CONCENTRATION_FLOWLANE = tr.createNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) -prop_type_CONCENTRATION_FLOWLANE.setInternalNamespace(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.createNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/ul]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.createNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel('Concentration (prepared) [ng/ul]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_TOTAL = tr.createNewPropertyType('CONCENTRATION_TOTAL', DataType.INTEGER) -prop_type_CONCENTRATION_TOTAL.setLabel('DNA concentration of library [ng/ul])') -prop_type_CONCENTRATION_TOTAL.setManagedInternally(False) -prop_type_CONCENTRATION_TOTAL.setInternalNamespace(False) - - -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.createNewPropertyType('CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY', DataType.INTEGER) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setLabel('Conc. if sample="proc. DNA library" (nM)') -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setManagedInternally(False) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.createNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) -prop_type_CONTACT_PERSON_EMAIL.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_NAME = tr.createNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) -prop_type_CONTACT_PERSON_NAME.setInternalNamespace(False) - - -prop_type_CONTROL_LANE = tr.createNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) -prop_type_CONTROL_LANE.setInternalNamespace(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.createNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) -prop_type_CREATED_ON_CS.setInternalNamespace(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.createNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_CS_PROTOCOL_VERSION.setInternalNamespace(False) - - -prop_type_CYCLES = tr.createNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Number of Cycles') -prop_type_CYCLES.setManagedInternally(False) -prop_type_CYCLES.setInternalNamespace(False) - - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER = tr.createNewPropertyType('CYCLES_REQUESTED_BY_CUSTOMER', DataType.CONTROLLEDVOCABULARY) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setLabel('Cycles requested') -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setManagedInternally(False) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setInternalNamespace(False) - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setVocabulary(vocabulary_CYCLES) - -prop_type_DATA_TRANSFERRED = tr.createNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) -prop_type_DATA_TRANSFERRED.setInternalNamespace(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.createNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setInternalNamespace(False) - - -prop_type_END_TYPE = tr.createNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) -prop_type_END_TYPE.setInternalNamespace(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.createNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) -prop_type_EXPERIMENT_DESIGN.setInternalNamespace(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.createNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) -prop_type_EXTERNAL_SAMPLE_NAME.setInternalNamespace(False) - - -prop_type_FLOWCELLTYPE = tr.createNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) -prop_type_FLOWCELLTYPE.setInternalNamespace(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.createNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing date') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) -prop_type_FLOW_CELL_SEQUENCED_ON.setInternalNamespace(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.createNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.createNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) -prop_type_ILLUMINA_PIPELINE_VERSION.setInternalNamespace(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX2 = tr.createNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) -prop_type_INDEX2.setInternalNamespace(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.createNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Index Read') -prop_type_INDEXREAD.setManagedInternally(False) -prop_type_INDEXREAD.setInternalNamespace(False) - - -prop_type_INVOICE = tr.createNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) -prop_type_INVOICE.setInternalNamespace(False) - - -prop_type_ISCOMPRESSED = tr.createNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) -prop_type_ISCOMPRESSED.setInternalNamespace(False) - - -prop_type_ISSUED_COMMAND = tr.createNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) -prop_type_ISSUED_COMMAND.setInternalNamespace(False) - - -prop_type_ISSWAPPED = tr.createNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) -prop_type_ISSWAPPED.setInternalNamespace(False) - - -prop_type_KIT = tr.createNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) -prop_type_KIT.setInternalNamespace(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_ARRIVED = tr.createNewPropertyType('KIT_ARRIVED', DataType.TIMESTAMP) -prop_type_KIT_ARRIVED.setLabel('Kit arrived') -prop_type_KIT_ARRIVED.setManagedInternally(False) -prop_type_KIT_ARRIVED.setInternalNamespace(False) - - -prop_type_KIT_PREPARED = tr.createNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) -prop_type_KIT_PREPARED.setInternalNamespace(False) - - -prop_type_LANECOUNT = tr.createNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) -prop_type_LANECOUNT.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.createNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_FAILED.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE = tr.createNewPropertyType('LIBRARY_PROCESSING_POSSIBLE', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setLabel('Library Processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.createNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setInternalNamespace(False) - - -prop_type_LOT = tr.createNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) -prop_type_LOT.setInternalNamespace(False) - - -prop_type_MACS_VERSION = tr.createNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) -prop_type_MACS_VERSION.setInternalNamespace(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.createNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) -prop_type_MAPPED_READS.setInternalNamespace(False) - - -prop_type_MAX = tr.createNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) -prop_type_MAX.setInternalNamespace(False) - - -prop_type_MEAN = tr.createNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) -prop_type_MEAN.setInternalNamespace(False) - - -prop_type_MIN = tr.createNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) -prop_type_MIN.setInternalNamespace(False) - - -prop_type_MISMATCH_IN_INDEX = tr.createNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) -prop_type_MISMATCH_IN_INDEX.setInternalNamespace(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.createNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) -prop_type_NANO_DROP.setInternalNamespace(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.createNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) -prop_type_NCBI_ORGANISM_TAXONOMY.setInternalNamespace(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.createNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) -prop_type_NM_DNA.setInternalNamespace(False) - - -prop_type_NOTES = tr.createNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) -prop_type_NOTES.setInternalNamespace(False) - - -prop_type_NOTES_CUSTOMER = tr.createNewPropertyType('NOTES_CUSTOMER', DataType.MULTILINE_VARCHAR) -prop_type_NOTES_CUSTOMER.setLabel('Notes Customer') -prop_type_NOTES_CUSTOMER.setManagedInternally(False) -prop_type_NOTES_CUSTOMER.setInternalNamespace(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.createNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) -prop_type_NUMBER_OF_ATTACHMENTS.setInternalNamespace(False) - - -prop_type_ORGANISM_FREE = tr.createNewPropertyType('ORGANISM_FREE', DataType.VARCHAR) -prop_type_ORGANISM_FREE.setLabel('Organism (if OTHER)') -prop_type_ORGANISM_FREE.setManagedInternally(False) -prop_type_ORGANISM_FREE.setInternalNamespace(False) - - -prop_type_OTRS = tr.createNewPropertyType('OTRS', DataType.INTEGER) -prop_type_OTRS.setLabel('OTRS ID #') -prop_type_OTRS.setManagedInternally(False) -prop_type_OTRS.setInternalNamespace(False) - - -prop_type_PAIRED_END_KIT = tr.createNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) -prop_type_PAIRED_END_KIT.setInternalNamespace(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.createNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.createNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) -prop_type_PERCENTAGE_PASSED_FILTERING.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.createNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setInternalNamespace(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.createNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setInternalNamespace(False) - - -prop_type_PREPARED_BY = tr.createNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) -prop_type_PREPARED_BY.setInternalNamespace(False) - - -prop_type_PRIMARYDATASIZE = tr.createNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) -prop_type_PRIMARYDATASIZE.setInternalNamespace(False) - - -prop_type_PRIMARYINDEXSIZE = tr.createNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) -prop_type_PRIMARYINDEXSIZE.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.createNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.createNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setInternalNamespace(False) - - -prop_type_REQUIRED_LANES = tr.createNewPropertyType('REQUIRED_LANES', DataType.CONTROLLEDVOCABULARY) -prop_type_REQUIRED_LANES.setLabel('Number of Required Lanes') -prop_type_REQUIRED_LANES.setManagedInternally(False) -prop_type_REQUIRED_LANES.setInternalNamespace(False) - -prop_type_REQUIRED_LANES.setVocabulary(vocabulary_REQUIRED_LANES) - -prop_type_SAMPLE_CHARACTERISTICS = tr.createNewPropertyType('SAMPLE_CHARACTERISTICS', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_CHARACTERISTICS.setLabel('Sample characteristics') -prop_type_SAMPLE_CHARACTERISTICS.setManagedInternally(False) -prop_type_SAMPLE_CHARACTERISTICS.setInternalNamespace(False) - - -prop_type_SAMPLE_DATA_PROCESSING = tr.createNewPropertyType('SAMPLE_DATA_PROCESSING', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_DATA_PROCESSING.setLabel('Sample Data Processing') -prop_type_SAMPLE_DATA_PROCESSING.setManagedInternally(False) -prop_type_SAMPLE_DATA_PROCESSING.setInternalNamespace(False) - - -prop_type_SAMPLE_EXTRACT_PROTOCOL = tr.createNewPropertyType('SAMPLE_EXTRACT_PROTOCOL', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setLabel('Sample Extract Protocol') -prop_type_SAMPLE_EXTRACT_PROTOCOL.setManagedInternally(False) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setInternalNamespace(False) - - -prop_type_SAMPLE_ID = tr.createNewPropertyType('SAMPLE_ID', DataType.VARCHAR) -prop_type_SAMPLE_ID.setLabel('Sample ID') -prop_type_SAMPLE_ID.setManagedInternally(False) -prop_type_SAMPLE_ID.setInternalNamespace(False) - - -prop_type_SAMPLE_KIND = tr.createNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) -prop_type_SAMPLE_KIND.setInternalNamespace(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMPLE_LIBRARY_SELECTION = tr.createNewPropertyType('SAMPLE_LIBRARY_SELECTION', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SELECTION.setLabel('Sample Library Selection') -prop_type_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SELECTION.setVocabulary(vocabulary_SAMPLE_LIBRARY_SELECTION) - -prop_type_SAMPLE_LIBRARY_SOURCE = tr.createNewPropertyType('SAMPLE_LIBRARY_SOURCE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SOURCE.setLabel('Sample Library Source') -prop_type_SAMPLE_LIBRARY_SOURCE.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SOURCE.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SOURCE.setVocabulary(vocabulary_SAMPLE_LIBRARY_SOURCE_VOC) - -prop_type_SAMPLE_LIBRARY_STRATEGY = tr.createNewPropertyType('SAMPLE_LIBRARY_STRATEGY', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_STRATEGY.setLabel('Sample Library Strategy') -prop_type_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_STRATEGY.setVocabulary(vocabulary_SAMPLE_LIBRARY_STRATEGY) - -prop_type_SAMPLE_MOLECULE = tr.createNewPropertyType('SAMPLE_MOLECULE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_MOLECULE.setLabel('Sample molecule') -prop_type_SAMPLE_MOLECULE.setManagedInternally(False) -prop_type_SAMPLE_MOLECULE.setInternalNamespace(False) - -prop_type_SAMPLE_MOLECULE.setVocabulary(vocabulary_SAMPLE_MOLECULE) - -prop_type_SAMPLE_SOURCE_NAME = tr.createNewPropertyType('SAMPLE_SOURCE_NAME', DataType.VARCHAR) -prop_type_SAMPLE_SOURCE_NAME.setLabel('Sample Source Name') -prop_type_SAMPLE_SOURCE_NAME.setManagedInternally(False) -prop_type_SAMPLE_SOURCE_NAME.setInternalNamespace(False) - - -prop_type_SAMTOOLS_FLAGSTAT = tr.createNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) -prop_type_SAMTOOLS_FLAGSTAT.setInternalNamespace(False) - - -prop_type_SBS_KIT = tr.createNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) -prop_type_SBS_KIT.setInternalNamespace(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.createNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -prop_type_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SCRIPT_TYPE = tr.createNewPropertyType('SCRIPT_TYPE', DataType.REAL) -prop_type_SCRIPT_TYPE.setLabel('Script Type') -prop_type_SCRIPT_TYPE.setManagedInternally(False) -prop_type_SCRIPT_TYPE.setInternalNamespace(False) - - -prop_type_SCS_PROTOCOL_VERSION = tr.createNewPropertyType('SCS_PROTOCOL_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_PROTOCOL_VERSION.setLabel('SCS Protocol Version') -prop_type_SCS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_SCS_PROTOCOL_VERSION.setInternalNamespace(False) - -prop_type_SCS_PROTOCOL_VERSION.setVocabulary(vocabulary_SCS_PROTOCOL_VERSION) - -prop_type_SCS_SOFTWARE_VERSION = tr.createNewPropertyType('SCS_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_SOFTWARE_VERSION.setLabel('SCS Software Version') -prop_type_SCS_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_SCS_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_SCS_SOFTWARE_VERSION.setVocabulary(vocabulary_SCS_SOFTWARE_VERSION) - -prop_type_SEQUENCER = tr.createNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) -prop_type_SEQUENCER.setInternalNamespace(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.createNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) -prop_type_SEQUENCER_FINISHED.setInternalNamespace(False) - - -prop_type_SEQUENCING_APPLICATION = tr.createNewPropertyType('SEQUENCING_APPLICATION', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCING_APPLICATION.setLabel('Sequencing Application') -prop_type_SEQUENCING_APPLICATION.setManagedInternally(False) -prop_type_SEQUENCING_APPLICATION.setInternalNamespace(False) - -prop_type_SEQUENCING_APPLICATION.setVocabulary(vocabulary_SEQUENCING_APPLICATION) - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.createNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setInternalNamespace(False) - - -prop_type_STD = tr.createNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) -prop_type_STD.setInternalNamespace(False) - - -prop_type_SURFACECOUNT = tr.createNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) -prop_type_SURFACECOUNT.setInternalNamespace(False) - - -prop_type_SWATHCOUNT = tr.createNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) -prop_type_SWATHCOUNT.setInternalNamespace(False) - - -prop_type_TILECOUNT = tr.createNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) -prop_type_TILECOUNT.setInternalNamespace(False) - - -prop_type_TOTAL_READS = tr.createNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) -prop_type_TOTAL_READS.setInternalNamespace(False) - - -prop_type_TRANSFER_METHOD = tr.createNewPropertyType('TRANSFER_METHOD', DataType.CONTROLLEDVOCABULARY) -prop_type_TRANSFER_METHOD.setLabel('Data transfer method') -prop_type_TRANSFER_METHOD.setManagedInternally(False) -prop_type_TRANSFER_METHOD.setInternalNamespace(False) - -prop_type_TRANSFER_METHOD.setVocabulary(vocabulary_TRANSFER_METHOD) - -prop_type_UL_DNA = tr.createNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) -prop_type_UL_DNA.setInternalNamespace(False) - - -prop_type_UL_EB = tr.createNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) -prop_type_UL_EB.setInternalNamespace(False) - - -prop_type_UL_STOCK = tr.createNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) -prop_type_UL_STOCK.setInternalNamespace(False) - - -prop_type_VERSION = tr.createNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) -prop_type_VERSION.setInternalNamespace(False) - - -prop_type_YIELD_MBASES = tr.createNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) -prop_type_YIELD_MBASES.setInternalNamespace(False) - - -prop_type_ZOOMLEVELS = tr.createNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) -prop_type_ZOOMLEVELS.setInternalNamespace(False) - - -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(1) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(2) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(7) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(1) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(1) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(2) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(13) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(1) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(2) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_BARCODE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_BARCODE) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(7) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(2) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(4) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(5) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(6) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(15) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(16) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(4) - -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND = tr.assignPropertyType(data_set_type_ILLUMINA_GA_OUTPUT, prop_type_SAMPLE_KIND) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setMandatory(False) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setSection(None) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setPositionInForms(1) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_AFFILIATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_AFFILIATION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_NAME.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONTACT_PERSON_EMAIL.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setSection('Contact') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_EXTERNAL_SAMPLE_NAME.setPositionInForms(25) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_KIND) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_KIND.setPositionInForms(27) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SEQUENCING_APPLICATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SEQUENCING_APPLICATION.setPositionInForms(28) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(32) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setPositionInForms(35) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setMandatory(True) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NCBI_ORGANISM_TAXONOMY.setPositionInForms(36) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_ORGANISM_FREE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_ORGANISM_FREE.setPositionInForms(40) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CELL_PLASTICITY_SYSTEMSX) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setSection('Sample Data') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CELL_PLASTICITY_SYSTEMSX.setPositionInForms(41) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_LIBRARY_STRATEGY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_STRATEGY.setPositionInForms(48) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_SOURCE_NAME) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_SOURCE_NAME.setPositionInForms(49) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_LIBRARY_SELECTION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_LIBRARY_SELECTION.setPositionInForms(50) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_CHARACTERISTICS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_CHARACTERISTICS.setPositionInForms(51) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_MOLECULE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_MOLECULE.setPositionInForms(52) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_EXTRACT_PROTOCOL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_EXTRACT_PROTOCOL.setPositionInForms(53) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_DATA_PROCESSING) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setSection('GEO compliant annotation') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_DATA_PROCESSING.setPositionInForms(55) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(57) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_END_TYPE.setPositionInForms(58) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_REQUIRED_LANES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_REQUIRED_LANES.setPositionInForms(59) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODE_LENGTH) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE_LENGTH.setPositionInForms(60) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODES.setPositionInForms(62) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BARCODE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BARCODE.setPositionInForms(63) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2 = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_INDEX2) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setSection('Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_INDEX2.setPositionInForms(64) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NOTES_CUSTOMER) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setSection('Notes') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES_CUSTOMER.setPositionInForms(73) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_OTRS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_OTRS.setPositionInForms(74) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SAMPLE_ID) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SAMPLE_ID.setPositionInForms(75) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setSection('Laboratory of Quantitative Genomics (LQG)') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(76) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_POSSIBLE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_POSSIBLE.setPositionInForms(77) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_FRAGMENT_SIZE_PREPARED_ILLUMINA.setPositionInForms(78) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(80) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NM_DNA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NM_DNA.setPositionInForms(81) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_STOCK) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_STOCK.setPositionInForms(82) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_DNA) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_DNA.setPositionInForms(83) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_UL_EB) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_UL_EB.setPositionInForms(84) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_KIT_PREPARED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT_PREPARED.setPositionInForms(85) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_PREPARED_BY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_PREPARED_BY.setPositionInForms(86) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_KIT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_KIT.setPositionInForms(87) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LOT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LOT.setPositionInForms(89) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(90) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(92) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NANO_DROP) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NANO_DROP.setPositionInForms(93) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_AGILENT_KIT) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_AGILENT_KIT.setPositionInForms(94) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(95) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_LIBRARY_PROCESSING_FAILED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setSection('LQG: Generation of DNA library') -assignment_SAMPLE_ILLUMINA_SEQUENCING_LIBRARY_PROCESSING_FAILED.setPositionInForms(96) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION.setPositionInForms(102) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CREATED_ON_CS.setPositionInForms(103) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CS_PROTOCOL_VERSION.setPositionInForms(104) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(105) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CLUSTER_STATION_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CLUSTER_STATION_SOFTWARE_VERSION.setPositionInForms(106) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setSection('LQG: Clustering Process') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CONCENTRATION_FLOWLANE.setPositionInForms(107) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_CYCLES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_CYCLES.setPositionInForms(108) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SCS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_PROTOCOL_VERSION.setPositionInForms(110) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(111) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_SCS_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_SCS_SOFTWARE_VERSION.setPositionInForms(112) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_BAREBACKED) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setSection('LQG: Sequencing') -assignment_SAMPLE_ILLUMINA_SEQUENCING_BAREBACKED.setPositionInForms(113) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_INVOICE) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setSection('LQG: Administrative') -assignment_SAMPLE_ILLUMINA_SEQUENCING_INVOICE.setPositionInForms(117) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setSection('LQG: Administrative') -assignment_SAMPLE_ILLUMINA_SEQUENCING_NOTES.setPositionInForms(118) - -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS = tr.assignPropertyType(samp_type_ILLUMINA_SEQUENCING, prop_type_NUMBER_OF_ATTACHMENTS) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setSection(None) -assignment_SAMPLE_ILLUMINA_SEQUENCING_NUMBER_OF_ATTACHMENTS.setPositionInForms(119) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(1) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(2) diff --git a/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch b/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch deleted file mode 100644 index 27b002429a8..00000000000 --- a/deep_sequencing_unit/resource/eclipse/DSU Data Store Server.launch +++ /dev/null @@ -1,14 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication"> -<stringAttribute key="bad_container_name" value="/deep_sequencing_unit/resource/ecli"/> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> -<listEntry value="/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/DataStoreServer.java"/> -</listAttribute> -<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> -<listEntry value="1"/> -</listAttribute> -<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> -<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="ch.systemsx.cisd.openbis.dss.generic.DataStoreServer"/> -<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="deep_sequencing_unit"/> -<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx2G -ea -Dpython.path=../libraries/jython/jython-lib"/> -</launchConfiguration> diff --git a/deep_sequencing_unit/resource/property_types_for_admin_console.txt b/deep_sequencing_unit/resource/property_types_for_admin_console.txt deleted file mode 100644 index 552f1809c5e..00000000000 --- a/deep_sequencing_unit/resource/property_types_for_admin_console.txt +++ /dev/null @@ -1,268 +0,0 @@ --- --- Creating entities for Deep Sequencing Distribution --- - --- @author Manuel Kohler - -set type = POLYCOMB2010 -register-type EXPERIMENT ${type} - -register-type SAMPLE ILLUMINA_FLOW_CELL listable=true show-container=false show-parents=false description="Flow Cell containing eight flow lanes" -register-type SAMPLE ILLUMINA_FLOW_LANE listable=true show-container=true show-parents=true description="Flow Lane is parented by one ILLUMINA_SEQUENCING" -register-type SAMPLE ILLUMINA_SEQUENCING listable=true show-container=false show-parents=false description="Biological Sample" - -set type = FASTQ_GZ -register-type DATA_SET ${type} description="Gzipped FASTQ files produced by CASAVA 1.8+" - -set type = ILLUMINA_GA_OUTPUT -register-type DATA_SET ${type} description="Illumina GA Output" - -set type = ILLUMINA_HISEQ_OUTPUT description="Illumina HiSeq Output" -register-type DATA_SET ${type} - -set type = MACS_OUTPUT -register-type DATA_SET ${type} description="MACS Peak Caller output" - -set type = TSV -register-type DATA_SET ${type} description="All kind of Tab Separated Value files" - -set type = WIGGLE -register-type DATA_SET ${type} description="Visualization Format of ChIP-Seq data for UCSC browser" - -set type = BED -register-type DATA_SET ${type} description="Visualization Format of ChIP-Seq data for UCSC browser" - -set type = AFFILIATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(AFFILIATION) "description=Where data will be shipped to" "label=Affiliation" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = ALIGNMENT -register-type DATA_SET ${type} description="Alignment software output, e.g. SAM/BAM" -assign-to DATA_SET:${type} AFFILIATION - -set type = AGILENT_KIT -register-property-type ${type} with data type CONTROLLEDVOCABULARY(AGILENT_KIT) "description=Kit used for QC" "label=Agilent Kit" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = ANALYSIS_FINISHED -register-property-type ${type} with data type TIMESTAMP "description=Post processing of the complete Flow Cell is finished and the fastq/SRF files have been created" "label=Analysis finshed" -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = BIOLOGICAL_SAMPLE_ARRIVED -register-property-type ${type} with data type TIMESTAMP "description=The date when the biological sample arrived at lab" "label=Arrival Date of Biological Sample" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BARCODE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(BARCODES) "description=Barcodes used for multiplexing" "label=Barcode" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BARCODE_LENGTH -register-property-type ${type} with data type INTEGER "description=Length of the barcode. Will be used as a parameter for the bareback image analysis: Large Scale Loss of Data in Low-Diversity Illumina Sequencing Libraries Can Be recovered by Deferred Cluster Calling Felix Krueger1, Simon R. Andrews1, Cameron S. Osborne2*,Plos One, 2011" "label=Barcode Length (+ recognition site)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = BAREBACKED -register-property-type ${type} with data type BOOLEAN "description=Has the bareback algorithm been applied? Krueger F, Andrews SR, Osborne CS (2011) Large Scale Loss of Data in Low-Diversity Illumina Sequencing Libraries Can Be Recovered by Deferred Cluster Calling. PLoS ONE 6(1): e16607. doi:10.1371/journal.pone.0016607" "label=Barebacked?" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CLUSTER_GENERATION_KIT_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CLUSTER_GENERATION_KIT_VERSION) "description=Cluster Station Kit Version" "label=CS Generation Kit Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CASAVA_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CASAVA_VERSION) "description=Illumina's post analyzing software" "label=Casava Version" -assign-to DATA_SET:ILLUMINA_GA_OUTPUT ${type} -assign-to DATA_SET:ILLUMINA_HISEQ_OUTPUT ${type} - -set type = CLUSTER_STATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CLUSTER_STATION) "description=Used Cluster Station" "label=Cluster Station" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_ORIGINAL -register-property-type ${type} with data type REAL "description=Concentration of the original sample for Illumina Sequencing in nano grams per micro liter" "label=Concentration (original) [ng/μl]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_PREPARED -register-property-type ${type} with data type REAL "description=Concentration of the prepared sample for Illumina Sequencing in nano grams per micro liter" "label=Concentration (prepared) [ng/μl]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_FLOW_LANE -register-property-type ${type} with data type REAL "description=Concentration of library loaded in flow lane" "label=Concentration in flow lane [pM]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CYCLES_REQUESTED_BY_CUSTOMER -register-property-type ${type} with data type CONTROLLEDVOCABULARY(CYCLES) "description=Read length" "label=Cycles" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = DNA_CONCENTRATION_OF_LIBRARY -register-property-type ${type} with data type INTEGER "description=" "label=DNA concentration of library (nM)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONCENTRATION_TOTAL -register-property-type ${type} with data type INTEGER "description=Total amount of genetic material" "label=DNA concentration of library (ng/µl)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = DATA_TRANSFERRED -register-property-type ${type} with data type TIMESTAMP "description=Date of successful data transfer to the customer" "label=Data transferred on" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CONTACT_PERSON_EMAIL -register-property-type ${type} with data type VARCHAR "description=Email of person to contact about the sample, Used for the tracking system" "label=Email of Contact Person" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = CONTACT_PERSON_NAME -register-property-type ${type} with data type VARCHAR "description=Name of person to contact about the sample" "label=Email of Contact Person" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = EXTERNAL_SAMPLE_NAME -register-property-type ${type} with data type VARCHAR "description=Original Sample Name" "label=External Sample Name" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = FRAGMENT_SIZE_PREPARED_ILLUMINA -register-property-type ${type} with data type INTEGER "description=Fragment size of the library of a prepared Illumina Sequencing sample in either bases or base pairs" "label=Fragment Size (prepared) [base (pairs)]" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = INVOICE -register-property-type ${type} with data type BOOLEAN "description=Check box if invoice has been sent" "label=Invoice sent?" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LOT -register-property-type ${type} with data type INTEGER "description=Illumina Kit Lot" "label=Kit Lot #" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = KIT_ARRIVED -register-property-type ${type} with data type TIMESTAMP "description=Date when Illumina Kit arrived" "label=Kit arrived" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LIBRARY_PROCESSING_POSSIBLE -register-property-type ${type} with data type BOOLEAN "description=" "label=Library Processing possible" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = KIT -register-property-type ${type} with data type CONTROLLEDVOCABULARY(KIT) "description=Type of preparation kit" "label=Type of preparation kit" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = LIBRARY_PROCESSING_SUCCESSFUL -register-property-type ${type} with data type BOOLEAN "description=" "label=Library processing successful" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = MACS_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(MACS_VERSION) "description=Used MACS version (peak caller) http://liulab.dfci.harvard.edu/MACS/" "label=MACS Version" -assign-to DATA_SET:MACS_OUTPUT ${type} - -set type = MAPPED_READS -register-property-type ${type} with data type INTEGER "description=Reads successfully aligned to reference genome" "label=# of mapped reads" -assign-to DATA_SET:ALIGNMENT ${type} - -set type = NANO_DROP -register-property-type ${type} with data type CONTROLLEDVOCABULARY(NANO_DROP) "description=" "label=Nano Drop" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = NCBI_ORGANISM_TAXONOMY -register-property-type ${type} with data type CONTROLLEDVOCABULARY(NCBI_TAXONOMY) "description=Standard NCBI Taxonomy (http://www.ncbi.nlm.nih.gov/taxonomy)" "label=Organism (NCBI Taxonomy)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = NOTES -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Free text" "label=Notes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = NOTES_CUSTOMER -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Free text" "label=Customer notes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = NUMBER_OF_ATTACHMENTS -register-property-type ${type} with data type INTEGER "description=" "label=# of attachments" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = OTRS -register-property-type ${type} with data type INTEGER "description=OTRS Reference Number" "label=OTRS ID #" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = PRINCIPAL_INVESTIGATOR_EMAIL -register-property-type ${type} with data type VARCHAR "description=Email of Principal Investigator responsible for the sample. Used for the tracking system" "label=Email of Principal Investigator" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = PRINCIPAL_INVESTIGATOR_NAME -register-property-type ${type} with data type VARCHAR "description=Name of Principal Investigator responsible for the sample." "label=Name of Principal Investigator" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = REQUIRED_LANES -register-property-type ${type} with data type CONTROLLEDVOCABULARY(REQUIRED_LANES) "description=" "label=Required Lanes" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_CHARACTERISTICS -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Describe all available characteristics of the biological source, including factors not necessarily under investigation. Provide in 'Tag: Value' format, where 'Tag' is a type of characteristic (e.g. 'gender', 'strain', 'tissue', 'developmental stage', 'tumor stage', etc), and 'Value' is the value for each tag (e.g. 'female', '129SV', 'brain', 'embryo', etc). Include as many characteristics fields as necessary to thoroughly describe your Samples." "label=Sample characteristics" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_DATA_PROCESSING -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Provide details of how data were generated and calculated. For example, what software was used, how and to what were the reads aligned, what filtering parameters were applied, how were peaks calculated, etc. Include a separate 'data processing' attribute for each file type described." "label=Sample Data Processing" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_EXTRACT_PROTOCOL -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Describe the protocol used to isolate the extract material. Describe the library construction protocol, ie, the protocols used to extract and prepare the material to be sequenced. You can include as much text as you need to thoroughly describe the protocol; it is strongly recommended that complete protocol descriptions are provided within your submission." "label=Sample Extract Protocol" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_KIND -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_TYPE) "description=Kind of sample delivered by the customer (and suitable for a certain sequencing application)" "label=Sample Kind" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = SAMPLE_LIBRARY_SELECTION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_SELECTION) "description=Describes whether any method was used to select and/or enrich the material being sequenced." "label=Sample Library Selection" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_LIBRARY_SOURCE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_SOURCE_VOC) "description=Type of source material that is being sequenced." "label=Sample Library Source" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_LIBRARY_STRATEGY -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_LIBRARY_STRATEGY) "description=Sequencing technique for this library." "label=Sample Library Strategy" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_MOLECULE -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SAMPLE_MOLECULE) "description=Specify the type of molecule that was extracted from the biological material." "label=Sample molecule" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMPLE_SOURCE_NAME -register-property-type ${type} with data type VARCHAR "description=Briefly identify the biological material and the experimental variable(s), e.g., vastus lateralis muscle, exercised, 60 min." "label=Sample Source Name" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SAMTOOLS_FLAGSTAT -register-property-type ${type} with data type MULTILINE_VARCHAR "description=Output of the samtools flagstat command" "label=Samtools Flagstat Output" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SBS_SEQUENCING_KIT_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SBS_SEQUENCING_KIT_VERSION) "description=SBS Sequencing Kit Version" "label=SBS Sequencing Kit Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SCS_PROTOCOL_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SCS_PROTOCOL_VERSION) "description=Illumina protocol version" "label=SCS Protocol Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SCS_SOFTWARE_VERSION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SCS_SOFTWARE_VERSION) "description=Version of the SCS Software on the GA Control PC" "label=SCS Software Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = SEQUENCER -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SEQUENCER) "description=Which sequencer has been used?" "label=Sequencer" -assign-to SAMPLE:ILLUMINA_FLOW_CELL ${type} - -set type = SEQUENCING_APPLICATION -register-property-type ${type} with data type CONTROLLEDVOCABULARY(SEQUENCING_APPLICATION) "description=What kind of sequencing application the sample has been prepared for" "label=Sequencing Application" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} mandatory - -set type = STARTING_AMOUNT_OF_SAMPLE_IN_NG -register-property-type ${type} with data type REAL "description=" "label=Starting amount of sample (ng)" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = TOTAL_READS -register-property-type ${type} with data type REAL "description=Total reads which have been tried to map" "label=Total reads" -assign-to DATA_SET:ALIGNMENT ${type} - -set type = CLUSTERING_DATE -register-property-type ${type} with data type TIMESTAMP "description=Date of Clustering Process" "label=Clustering Date" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} - -set type = CLUSTERING_PROTOCOL_VERSION -register-property-type ${type} with data type VARCHAR "description=" "label=Cluster Station Protocol Version" -assign-to SAMPLE:ILLUMINA_SEQUENCING ${type} diff --git a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 b/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 deleted file mode 100644 index 7ed1e254022..00000000000 --- a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-1 +++ /dev/null @@ -1 +0,0 @@ -DEMO-EXPERIMENT-1 \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 b/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 deleted file mode 100644 index 0ce414b76f4..00000000000 --- a/deep_sequencing_unit/resource/test-data/DemoDropboxTest/demo-data/demo-file-2 +++ /dev/null @@ -1 +0,0 @@ -DEMO-EXPERIMENT-2 \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml deleted file mode 100644 index 1271980cef1..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0037_AC5UMNANXX/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0037_AC5UMNANXX" Number="37"> - <Flowcell>C5UMNANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml deleted file mode 100644 index de51e4e7d16..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0038_BC6A12ANXX" Number="38"> - <Flowcell>C6A12ANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml deleted file mode 100644 index a8074b90066..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX/runParameters.xml +++ /dev/null @@ -1,151 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <ExperimentName>141212_C6A12ANXX</ExperimentName> - <ScanID>-999</ScanID> - <FCPosition>B</FCPosition> - <WorkFlowType>SINGLEINDEX</WorkFlowType> - <PairEndFC>false</PairEndFC> - <Read1>51</Read1> - <IndexRead1>7</IndexRead1> - <IndexRead2>0</IndexRead2> - <Read2>0</Read2> - <OutputFolder>Y:\jabba</OutputFolder> - <CompressBcls>true</CompressBcls> - <RemapQScores /> - <NearNeighborCorrection>false</NearNeighborCorrection> - <PeriodicSave>Save All Thumbnails</PeriodicSave> - <Flowcell>HiSeq Flow Cell v4</Flowcell> - <FirstBaseConfirmation>true</FirstBaseConfirmation> - <SampleSheet /> - <KeepIntensityFiles>false</KeepIntensityFiles> - <Sbs>HiSeq SBS Kit v4</Sbs> - <Pe /> - <Index>HiSeq v4 Single Index</Index> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - <ClusteringChoice>None</ClusteringChoice> - <RunMode>RapidHighOutput</RunMode> - <Rehyb>None</Rehyb> - <PerformPreRunFluidicsCheck>false</PerformPreRunFluidicsCheck> - <ServiceRun>false</ServiceRun> - <ApplicationName>HiSeq Control Software</ApplicationName> - <ApplicationVersion>2.2.38</ApplicationVersion> - <RunID>141212_D00535_0038_BC6A12ANXX</RunID> - <RunStartDate>141212</RunStartDate> - <IntegrationMode>Standalone</IntegrationMode> - <BaseSpaceSettings> - <Username /> - <RunId /> - <TempFolder /> - <SendInstrumentHealthToILMN>false</SendInstrumentHealthToILMN> - <RunMonitoringOnly>false</RunMonitoringOnly> - <PlannedRun>false</PlannedRun> - </BaseSpaceSettings> - <ScannerID>D00535</ScannerID> - <ScanNumber>38</ScanNumber> - <ComputerName>BS-DSFCONTROL06</ComputerName> - <FPGAVersion>7.9.7</FPGAVersion> - <CPLDVersion>3.0.0</CPLDVersion> - <RTAVersion>1.18.61</RTAVersion> - <ChemistryVersion>Illumina,Bruno Fluidics Controller,0,v2.0340</ChemistryVersion> - <CameraFirmware>2.01-F20-R02</CameraFirmware> - <CameraDriver>6.45.20.3690</CameraDriver> - <FocusCameraFirmware /> - <Barcode>C6A12ANXX</Barcode> - <WashBarcode>C4R3MANXX</WashBarcode> - <Username>bs-dsfcontrol06</Username> - <SelectedSections> - <Section Name="A_1" /> - <Section Name="B_1" /> - <Section Name="C_1" /> - <Section Name="D_1" /> - <Section Name="E_1" /> - <Section Name="F_1" /> - <Section Name="G_1" /> - <Section Name="H_1" /> - </SelectedSections> - <FocusMethod>DynamicITF</FocusMethod> - <SelectedSurface>BothLaneSurfaces</SelectedSurface> - <SwathScanMode>AutoSwath</SwathScanMode> - <EnableLft>true</EnableLft> - <AutoTiltOnce>true</AutoTiltOnce> - <EnableAutoCenter>true</EnableAutoCenter> - <EnableAnalysis>true</EnableAnalysis> - <EnableBasecalling>true</EnableBasecalling> - <EnableCameraLogging>false</EnableCameraLogging> - <AdapterPlate>HiSeq Adapter Plate</AdapterPlate> - <SlideHolder>HiSeq Flow Cell Holder</SlideHolder> - <TemplateCycleCount>5</TemplateCycleCount> - <NumAnalysisThreads>8</NumAnalysisThreads> - <FPGADynamicFocusSettings> - <MaxInitialZJumpHalfUm>3</MaxInitialZJumpHalfUm> - <MaxSubsequentZJumpHalfUm>7</MaxSubsequentZJumpHalfUm> - <NumberOfInitialZJumps>0</NumberOfInitialZJumps> - <CVGainStart>500</CVGainStart> - <CVGainPosLocked>500</CVGainPosLocked> - <Offset>250</Offset> - <HotPixel>350</HotPixel> - <MotorDelayFrames>10</MotorDelayFrames> - <SoftwareLaserLag>200</SoftwareLaserLag> - <DitherSize>100</DitherSize> - <GroupSize>40</GroupSize> - <DitherShift>0</DitherShift> - <IntensityCeiling>65535</IntensityCeiling> - <IGain>100</IGain> - <IHistory>4</IHistory> - </FPGADynamicFocusSettings> - <TileWidth>2048</TileWidth> - <TileHeight>10000</TileHeight> - <ImageWidth>2048</ImageWidth> - <ImageHeight>160000</ImageHeight> - <AreaPerPixelmm2>1.40625E-07</AreaPerPixelmm2> - <LaneLength>60</LaneLength> - <NumTilesPerSwath>16</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <UseExistingRecipe>false</UseExistingRecipe> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <EnableNotifications>false</EnableNotifications> - <ReagentKits> - <Sbs> - <SbsReagentKit> - <ID>RGT4611449RGT4588772RGT4731952</ID> - <Prime>false</Prime> - <NumberCyclesRemaining>74</NumberCyclesRemaining> - <IsNew50Cycle>true</IsNew50Cycle> - <IsNew200Cycle>false</IsNew200Cycle> - </SbsReagentKit> - </Sbs> - <Index> - <ReagentKit> - <ID /> - </ReagentKit> - </Index> - <Pe /> - <Rehyb /> - </ReagentKits> - <ReagentBottles> - <Sbs /> - </ReagentBottles> - <Resume>false</Resume> - <ResumeCycle>0</ResumeCycle> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <TempFolder>E:\Illumina\HiSeqTemp\141212_D00535_0038_BC6A12ANXX</TempFolder> - <RecipeFragmentVersion>1.5.14.0</RecipeFragmentVersion> - <PromptForPeReagents>false</PromptForPeReagents> - <MockRun>false</MockRun> - <ScannedBarcode /> - </Setup> - <Version>1</Version> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml deleted file mode 100644 index de51e4e7d16..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/RunInfo.xml +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="2"> - <Run Id="141212_D00535_0038_BC6A12ANXX" Number="38"> - <Flowcell>C6A12ANXX</Flowcell> - <Instrument>D00535</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="8" SurfaceCount="2" SwathCount="3" TileCount="16" /> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml deleted file mode 100644 index a8074b90066..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowCellHiseqTest/141212_D00535_0038_BC6A12ANXX_NonmatchingFolderName/runParameters.xml +++ /dev/null @@ -1,151 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <ExperimentName>141212_C6A12ANXX</ExperimentName> - <ScanID>-999</ScanID> - <FCPosition>B</FCPosition> - <WorkFlowType>SINGLEINDEX</WorkFlowType> - <PairEndFC>false</PairEndFC> - <Read1>51</Read1> - <IndexRead1>7</IndexRead1> - <IndexRead2>0</IndexRead2> - <Read2>0</Read2> - <OutputFolder>Y:\jabba</OutputFolder> - <CompressBcls>true</CompressBcls> - <RemapQScores /> - <NearNeighborCorrection>false</NearNeighborCorrection> - <PeriodicSave>Save All Thumbnails</PeriodicSave> - <Flowcell>HiSeq Flow Cell v4</Flowcell> - <FirstBaseConfirmation>true</FirstBaseConfirmation> - <SampleSheet /> - <KeepIntensityFiles>false</KeepIntensityFiles> - <Sbs>HiSeq SBS Kit v4</Sbs> - <Pe /> - <Index>HiSeq v4 Single Index</Index> - <AlignToPhiX> - <Lane>1</Lane> - <Lane>2</Lane> - <Lane>3</Lane> - <Lane>4</Lane> - <Lane>5</Lane> - <Lane>6</Lane> - <Lane>7</Lane> - <Lane>8</Lane> - </AlignToPhiX> - <ClusteringChoice>None</ClusteringChoice> - <RunMode>RapidHighOutput</RunMode> - <Rehyb>None</Rehyb> - <PerformPreRunFluidicsCheck>false</PerformPreRunFluidicsCheck> - <ServiceRun>false</ServiceRun> - <ApplicationName>HiSeq Control Software</ApplicationName> - <ApplicationVersion>2.2.38</ApplicationVersion> - <RunID>141212_D00535_0038_BC6A12ANXX</RunID> - <RunStartDate>141212</RunStartDate> - <IntegrationMode>Standalone</IntegrationMode> - <BaseSpaceSettings> - <Username /> - <RunId /> - <TempFolder /> - <SendInstrumentHealthToILMN>false</SendInstrumentHealthToILMN> - <RunMonitoringOnly>false</RunMonitoringOnly> - <PlannedRun>false</PlannedRun> - </BaseSpaceSettings> - <ScannerID>D00535</ScannerID> - <ScanNumber>38</ScanNumber> - <ComputerName>BS-DSFCONTROL06</ComputerName> - <FPGAVersion>7.9.7</FPGAVersion> - <CPLDVersion>3.0.0</CPLDVersion> - <RTAVersion>1.18.61</RTAVersion> - <ChemistryVersion>Illumina,Bruno Fluidics Controller,0,v2.0340</ChemistryVersion> - <CameraFirmware>2.01-F20-R02</CameraFirmware> - <CameraDriver>6.45.20.3690</CameraDriver> - <FocusCameraFirmware /> - <Barcode>C6A12ANXX</Barcode> - <WashBarcode>C4R3MANXX</WashBarcode> - <Username>bs-dsfcontrol06</Username> - <SelectedSections> - <Section Name="A_1" /> - <Section Name="B_1" /> - <Section Name="C_1" /> - <Section Name="D_1" /> - <Section Name="E_1" /> - <Section Name="F_1" /> - <Section Name="G_1" /> - <Section Name="H_1" /> - </SelectedSections> - <FocusMethod>DynamicITF</FocusMethod> - <SelectedSurface>BothLaneSurfaces</SelectedSurface> - <SwathScanMode>AutoSwath</SwathScanMode> - <EnableLft>true</EnableLft> - <AutoTiltOnce>true</AutoTiltOnce> - <EnableAutoCenter>true</EnableAutoCenter> - <EnableAnalysis>true</EnableAnalysis> - <EnableBasecalling>true</EnableBasecalling> - <EnableCameraLogging>false</EnableCameraLogging> - <AdapterPlate>HiSeq Adapter Plate</AdapterPlate> - <SlideHolder>HiSeq Flow Cell Holder</SlideHolder> - <TemplateCycleCount>5</TemplateCycleCount> - <NumAnalysisThreads>8</NumAnalysisThreads> - <FPGADynamicFocusSettings> - <MaxInitialZJumpHalfUm>3</MaxInitialZJumpHalfUm> - <MaxSubsequentZJumpHalfUm>7</MaxSubsequentZJumpHalfUm> - <NumberOfInitialZJumps>0</NumberOfInitialZJumps> - <CVGainStart>500</CVGainStart> - <CVGainPosLocked>500</CVGainPosLocked> - <Offset>250</Offset> - <HotPixel>350</HotPixel> - <MotorDelayFrames>10</MotorDelayFrames> - <SoftwareLaserLag>200</SoftwareLaserLag> - <DitherSize>100</DitherSize> - <GroupSize>40</GroupSize> - <DitherShift>0</DitherShift> - <IntensityCeiling>65535</IntensityCeiling> - <IGain>100</IGain> - <IHistory>4</IHistory> - </FPGADynamicFocusSettings> - <TileWidth>2048</TileWidth> - <TileHeight>10000</TileHeight> - <ImageWidth>2048</ImageWidth> - <ImageHeight>160000</ImageHeight> - <AreaPerPixelmm2>1.40625E-07</AreaPerPixelmm2> - <LaneLength>60</LaneLength> - <NumTilesPerSwath>16</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <UseExistingRecipe>false</UseExistingRecipe> - <Reads> - <Read Number="1" NumCycles="51" IsIndexedRead="N" /> - <Read Number="2" NumCycles="7" IsIndexedRead="Y" /> - </Reads> - <EnableNotifications>false</EnableNotifications> - <ReagentKits> - <Sbs> - <SbsReagentKit> - <ID>RGT4611449RGT4588772RGT4731952</ID> - <Prime>false</Prime> - <NumberCyclesRemaining>74</NumberCyclesRemaining> - <IsNew50Cycle>true</IsNew50Cycle> - <IsNew200Cycle>false</IsNew200Cycle> - </SbsReagentKit> - </Sbs> - <Index> - <ReagentKit> - <ID /> - </ReagentKit> - </Index> - <Pe /> - <Rehyb /> - </ReagentKits> - <ReagentBottles> - <Sbs /> - </ReagentBottles> - <Resume>false</Resume> - <ResumeCycle>0</ResumeCycle> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <TempFolder>E:\Illumina\HiSeqTemp\141212_D00535_0038_BC6A12ANXX</TempFolder> - <RecipeFragmentVersion>1.5.14.0</RecipeFragmentVersion> - <PromptForPeReagents>false</PromptForPeReagents> - <MockRun>false</MockRun> - <ScannedBarcode /> - </Setup> - <Version>1</Version> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml deleted file mode 100644 index 168a72f9f21..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunInfo.xml +++ /dev/null @@ -1,888 +0,0 @@ -<?xml version="1.0"?> -<RunInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Version="4"> - <Run Id="141212_NS500318_0033_AH16YMBGXX" Number="33"> - <Flowcell>H16YMBGXX</Flowcell> - <Instrument>NS500318</Instrument> - <Date>141212</Date> - <Reads> - <Read Number="1" NumCycles="76" IsIndexedRead="N" /> - <Read Number="2" NumCycles="8" IsIndexedRead="Y" /> - <Read Number="3" NumCycles="8" IsIndexedRead="Y" /> - </Reads> - <FlowcellLayout LaneCount="4" SurfaceCount="2" SwathCount="3" TileCount="12" SectionPerLane="3" LanePerSection="2"> - <TileSet TileNamingConvention="FiveDigit"> - <Tiles> - <Tile>1_11101</Tile> - <Tile>1_21101</Tile> - <Tile>1_11102</Tile> - <Tile>1_21102</Tile> - <Tile>1_11103</Tile> - <Tile>1_21103</Tile> - <Tile>1_11104</Tile> - <Tile>1_21104</Tile> - <Tile>1_11105</Tile> - <Tile>1_21105</Tile> - <Tile>1_11106</Tile> - <Tile>1_21106</Tile> - <Tile>1_11107</Tile> - <Tile>1_21107</Tile> - <Tile>1_11108</Tile> - <Tile>1_21108</Tile> - <Tile>1_11109</Tile> - <Tile>1_21109</Tile> - <Tile>1_11110</Tile> - <Tile>1_21110</Tile> - <Tile>1_11111</Tile> - <Tile>1_21111</Tile> - <Tile>1_11112</Tile> - <Tile>1_21112</Tile> - <Tile>1_12101</Tile> - <Tile>1_22101</Tile> - <Tile>1_12102</Tile> - <Tile>1_22102</Tile> - <Tile>1_12103</Tile> - <Tile>1_22103</Tile> - <Tile>1_12104</Tile> - <Tile>1_22104</Tile> - <Tile>1_12105</Tile> - <Tile>1_22105</Tile> - <Tile>1_12106</Tile> - <Tile>1_22106</Tile> - <Tile>1_12107</Tile> - <Tile>1_22107</Tile> - <Tile>1_12108</Tile> - <Tile>1_22108</Tile> - <Tile>1_12109</Tile> - <Tile>1_22109</Tile> - <Tile>1_12110</Tile> - <Tile>1_22110</Tile> - <Tile>1_12111</Tile> - <Tile>1_22111</Tile> - <Tile>1_12112</Tile> - <Tile>1_22112</Tile> - <Tile>1_13101</Tile> - <Tile>1_23101</Tile> - <Tile>1_13102</Tile> - <Tile>1_23102</Tile> - <Tile>1_13103</Tile> - <Tile>1_23103</Tile> - <Tile>1_13104</Tile> - <Tile>1_23104</Tile> - <Tile>1_13105</Tile> - <Tile>1_23105</Tile> - <Tile>1_13106</Tile> - <Tile>1_23106</Tile> - <Tile>1_13107</Tile> - <Tile>1_23107</Tile> - <Tile>1_13108</Tile> - <Tile>1_23108</Tile> - <Tile>1_13109</Tile> - <Tile>1_23109</Tile> - <Tile>1_13110</Tile> - <Tile>1_23110</Tile> - <Tile>1_13111</Tile> - <Tile>1_23111</Tile> - <Tile>1_13112</Tile> - <Tile>1_23112</Tile> - <Tile>2_11101</Tile> - <Tile>2_21101</Tile> - <Tile>2_11102</Tile> - <Tile>2_21102</Tile> - <Tile>2_11103</Tile> - <Tile>2_21103</Tile> - <Tile>2_11104</Tile> - <Tile>2_21104</Tile> - <Tile>2_11105</Tile> - <Tile>2_21105</Tile> - <Tile>2_11106</Tile> - <Tile>2_21106</Tile> - <Tile>2_11107</Tile> - <Tile>2_21107</Tile> - <Tile>2_11108</Tile> - <Tile>2_21108</Tile> - <Tile>2_11109</Tile> - <Tile>2_21109</Tile> - <Tile>2_11110</Tile> - <Tile>2_21110</Tile> - <Tile>2_11111</Tile> - <Tile>2_21111</Tile> - <Tile>2_11112</Tile> - <Tile>2_21112</Tile> - <Tile>2_12101</Tile> - <Tile>2_22101</Tile> - <Tile>2_12102</Tile> - <Tile>2_22102</Tile> - <Tile>2_12103</Tile> - <Tile>2_22103</Tile> - <Tile>2_12104</Tile> - <Tile>2_22104</Tile> - <Tile>2_12105</Tile> - <Tile>2_22105</Tile> - <Tile>2_12106</Tile> - <Tile>2_22106</Tile> - <Tile>2_12107</Tile> - <Tile>2_22107</Tile> - <Tile>2_12108</Tile> - <Tile>2_22108</Tile> - <Tile>2_12109</Tile> - <Tile>2_22109</Tile> - <Tile>2_12110</Tile> - <Tile>2_22110</Tile> - <Tile>2_12111</Tile> - <Tile>2_22111</Tile> - <Tile>2_12112</Tile> - <Tile>2_22112</Tile> - <Tile>2_13101</Tile> - <Tile>2_23101</Tile> - <Tile>2_13102</Tile> - <Tile>2_23102</Tile> - <Tile>2_13103</Tile> - <Tile>2_23103</Tile> - <Tile>2_13104</Tile> - <Tile>2_23104</Tile> - <Tile>2_13105</Tile> - <Tile>2_23105</Tile> - <Tile>2_13106</Tile> - <Tile>2_23106</Tile> - <Tile>2_13107</Tile> - <Tile>2_23107</Tile> - <Tile>2_13108</Tile> - <Tile>2_23108</Tile> - <Tile>2_13109</Tile> - <Tile>2_23109</Tile> - <Tile>2_13110</Tile> - <Tile>2_23110</Tile> - <Tile>2_13111</Tile> - <Tile>2_23111</Tile> - <Tile>2_13112</Tile> - <Tile>2_23112</Tile> - <Tile>1_11201</Tile> - <Tile>1_21201</Tile> - <Tile>1_11202</Tile> - <Tile>1_21202</Tile> - <Tile>1_11203</Tile> - <Tile>1_21203</Tile> - <Tile>1_11204</Tile> - <Tile>1_21204</Tile> - <Tile>1_11205</Tile> - <Tile>1_21205</Tile> - <Tile>1_11206</Tile> - <Tile>1_21206</Tile> - <Tile>1_11207</Tile> - <Tile>1_21207</Tile> - <Tile>1_11208</Tile> - <Tile>1_21208</Tile> - <Tile>1_11209</Tile> - <Tile>1_21209</Tile> - <Tile>1_11210</Tile> - <Tile>1_21210</Tile> - <Tile>1_11211</Tile> - <Tile>1_21211</Tile> - <Tile>1_11212</Tile> - <Tile>1_21212</Tile> - <Tile>1_12201</Tile> - <Tile>1_22201</Tile> - <Tile>1_12202</Tile> - <Tile>1_22202</Tile> - <Tile>1_12203</Tile> - <Tile>1_22203</Tile> - <Tile>1_12204</Tile> - <Tile>1_22204</Tile> - <Tile>1_12205</Tile> - <Tile>1_22205</Tile> - <Tile>1_12206</Tile> - <Tile>1_22206</Tile> - <Tile>1_12207</Tile> - <Tile>1_22207</Tile> - <Tile>1_12208</Tile> - <Tile>1_22208</Tile> - <Tile>1_12209</Tile> - <Tile>1_22209</Tile> - <Tile>1_12210</Tile> - <Tile>1_22210</Tile> - <Tile>1_12211</Tile> - <Tile>1_22211</Tile> - <Tile>1_12212</Tile> - <Tile>1_22212</Tile> - <Tile>1_13201</Tile> - <Tile>1_23201</Tile> - <Tile>1_13202</Tile> - <Tile>1_23202</Tile> - <Tile>1_13203</Tile> - <Tile>1_23203</Tile> - <Tile>1_13204</Tile> - <Tile>1_23204</Tile> - <Tile>1_13205</Tile> - <Tile>1_23205</Tile> - <Tile>1_13206</Tile> - <Tile>1_23206</Tile> - <Tile>1_13207</Tile> - <Tile>1_23207</Tile> - <Tile>1_13208</Tile> - <Tile>1_23208</Tile> - <Tile>1_13209</Tile> - <Tile>1_23209</Tile> - <Tile>1_13210</Tile> - <Tile>1_23210</Tile> - <Tile>1_13211</Tile> - <Tile>1_23211</Tile> - <Tile>1_13212</Tile> - <Tile>1_23212</Tile> - <Tile>2_11201</Tile> - <Tile>2_21201</Tile> - <Tile>2_11202</Tile> - <Tile>2_21202</Tile> - <Tile>2_11203</Tile> - <Tile>2_21203</Tile> - <Tile>2_11204</Tile> - <Tile>2_21204</Tile> - <Tile>2_11205</Tile> - <Tile>2_21205</Tile> - <Tile>2_11206</Tile> - <Tile>2_21206</Tile> - <Tile>2_11207</Tile> - <Tile>2_21207</Tile> - <Tile>2_11208</Tile> - <Tile>2_21208</Tile> - <Tile>2_11209</Tile> - <Tile>2_21209</Tile> - <Tile>2_11210</Tile> - <Tile>2_21210</Tile> - <Tile>2_11211</Tile> - <Tile>2_21211</Tile> - <Tile>2_11212</Tile> - <Tile>2_21212</Tile> - <Tile>2_12201</Tile> - <Tile>2_22201</Tile> - <Tile>2_12202</Tile> - <Tile>2_22202</Tile> - <Tile>2_12203</Tile> - <Tile>2_22203</Tile> - <Tile>2_12204</Tile> - <Tile>2_22204</Tile> - <Tile>2_12205</Tile> - <Tile>2_22205</Tile> - <Tile>2_12206</Tile> - <Tile>2_22206</Tile> - <Tile>2_12207</Tile> - <Tile>2_22207</Tile> - <Tile>2_12208</Tile> - <Tile>2_22208</Tile> - <Tile>2_12209</Tile> - <Tile>2_22209</Tile> - <Tile>2_12210</Tile> - <Tile>2_22210</Tile> - <Tile>2_12211</Tile> - <Tile>2_22211</Tile> - <Tile>2_12212</Tile> - <Tile>2_22212</Tile> - <Tile>2_13201</Tile> - <Tile>2_23201</Tile> - <Tile>2_13202</Tile> - <Tile>2_23202</Tile> - <Tile>2_13203</Tile> - <Tile>2_23203</Tile> - <Tile>2_13204</Tile> - <Tile>2_23204</Tile> - <Tile>2_13205</Tile> - <Tile>2_23205</Tile> - <Tile>2_13206</Tile> - <Tile>2_23206</Tile> - <Tile>2_13207</Tile> - <Tile>2_23207</Tile> - <Tile>2_13208</Tile> - <Tile>2_23208</Tile> - <Tile>2_13209</Tile> - <Tile>2_23209</Tile> - <Tile>2_13210</Tile> - <Tile>2_23210</Tile> - <Tile>2_13211</Tile> - <Tile>2_23211</Tile> - <Tile>2_13212</Tile> - <Tile>2_23212</Tile> - <Tile>1_11301</Tile> - <Tile>1_21301</Tile> - <Tile>1_11302</Tile> - <Tile>1_21302</Tile> - <Tile>1_11303</Tile> - <Tile>1_21303</Tile> - <Tile>1_11304</Tile> - <Tile>1_21304</Tile> - <Tile>1_11305</Tile> - <Tile>1_21305</Tile> - <Tile>1_11306</Tile> - <Tile>1_21306</Tile> - <Tile>1_11307</Tile> - <Tile>1_21307</Tile> - <Tile>1_11308</Tile> - <Tile>1_21308</Tile> - <Tile>1_11309</Tile> - <Tile>1_21309</Tile> - <Tile>1_11310</Tile> - <Tile>1_21310</Tile> - <Tile>1_11311</Tile> - <Tile>1_21311</Tile> - <Tile>1_11312</Tile> - <Tile>1_21312</Tile> - <Tile>1_12301</Tile> - <Tile>1_22301</Tile> - <Tile>1_12302</Tile> - <Tile>1_22302</Tile> - <Tile>1_12303</Tile> - <Tile>1_22303</Tile> - <Tile>1_12304</Tile> - <Tile>1_22304</Tile> - <Tile>1_12305</Tile> - <Tile>1_22305</Tile> - <Tile>1_12306</Tile> - <Tile>1_22306</Tile> - <Tile>1_12307</Tile> - <Tile>1_22307</Tile> - <Tile>1_12308</Tile> - <Tile>1_22308</Tile> - <Tile>1_12309</Tile> - <Tile>1_22309</Tile> - <Tile>1_12310</Tile> - <Tile>1_22310</Tile> - <Tile>1_12311</Tile> - <Tile>1_22311</Tile> - <Tile>1_12312</Tile> - <Tile>1_22312</Tile> - <Tile>1_13301</Tile> - <Tile>1_23301</Tile> - <Tile>1_13302</Tile> - <Tile>1_23302</Tile> - <Tile>1_13303</Tile> - <Tile>1_23303</Tile> - <Tile>1_13304</Tile> - <Tile>1_23304</Tile> - <Tile>1_13305</Tile> - <Tile>1_23305</Tile> - <Tile>1_13306</Tile> - <Tile>1_23306</Tile> - <Tile>1_13307</Tile> - <Tile>1_23307</Tile> - <Tile>1_13308</Tile> - <Tile>1_23308</Tile> - <Tile>1_13309</Tile> - <Tile>1_23309</Tile> - <Tile>1_13310</Tile> - <Tile>1_23310</Tile> - <Tile>1_13311</Tile> - <Tile>1_23311</Tile> - <Tile>1_13312</Tile> - <Tile>1_23312</Tile> - <Tile>2_11301</Tile> - <Tile>2_21301</Tile> - <Tile>2_11302</Tile> - <Tile>2_21302</Tile> - <Tile>2_11303</Tile> - <Tile>2_21303</Tile> - <Tile>2_11304</Tile> - <Tile>2_21304</Tile> - <Tile>2_11305</Tile> - <Tile>2_21305</Tile> - <Tile>2_11306</Tile> - <Tile>2_21306</Tile> - <Tile>2_11307</Tile> - <Tile>2_21307</Tile> - <Tile>2_11308</Tile> - <Tile>2_21308</Tile> - <Tile>2_11309</Tile> - <Tile>2_21309</Tile> - <Tile>2_11310</Tile> - <Tile>2_21310</Tile> - <Tile>2_11311</Tile> - <Tile>2_21311</Tile> - <Tile>2_11312</Tile> - <Tile>2_21312</Tile> - <Tile>2_12301</Tile> - <Tile>2_22301</Tile> - <Tile>2_12302</Tile> - <Tile>2_22302</Tile> - <Tile>2_12303</Tile> - <Tile>2_22303</Tile> - <Tile>2_12304</Tile> - <Tile>2_22304</Tile> - <Tile>2_12305</Tile> - <Tile>2_22305</Tile> - <Tile>2_12306</Tile> - <Tile>2_22306</Tile> - <Tile>2_12307</Tile> - <Tile>2_22307</Tile> - <Tile>2_12308</Tile> - <Tile>2_22308</Tile> - <Tile>2_12309</Tile> - <Tile>2_22309</Tile> - <Tile>2_12310</Tile> - <Tile>2_22310</Tile> - <Tile>2_12311</Tile> - <Tile>2_22311</Tile> - <Tile>2_12312</Tile> - <Tile>2_22312</Tile> - <Tile>2_13301</Tile> - <Tile>2_23301</Tile> - <Tile>2_13302</Tile> - <Tile>2_23302</Tile> - <Tile>2_13303</Tile> - <Tile>2_23303</Tile> - <Tile>2_13304</Tile> - <Tile>2_23304</Tile> - <Tile>2_13305</Tile> - <Tile>2_23305</Tile> - <Tile>2_13306</Tile> - <Tile>2_23306</Tile> - <Tile>2_13307</Tile> - <Tile>2_23307</Tile> - <Tile>2_13308</Tile> - <Tile>2_23308</Tile> - <Tile>2_13309</Tile> - <Tile>2_23309</Tile> - <Tile>2_13310</Tile> - <Tile>2_23310</Tile> - <Tile>2_13311</Tile> - <Tile>2_23311</Tile> - <Tile>2_13312</Tile> - <Tile>2_23312</Tile> - <Tile>1_11401</Tile> - <Tile>1_21401</Tile> - <Tile>1_11402</Tile> - <Tile>1_21402</Tile> - <Tile>1_11403</Tile> - <Tile>1_21403</Tile> - <Tile>1_11404</Tile> - <Tile>1_21404</Tile> - <Tile>1_11405</Tile> - <Tile>1_21405</Tile> - <Tile>1_11406</Tile> - <Tile>1_21406</Tile> - <Tile>1_11407</Tile> - <Tile>1_21407</Tile> - <Tile>1_11408</Tile> - <Tile>1_21408</Tile> - <Tile>1_11409</Tile> - <Tile>1_21409</Tile> - <Tile>1_11410</Tile> - <Tile>1_21410</Tile> - <Tile>1_11411</Tile> - <Tile>1_21411</Tile> - <Tile>1_11412</Tile> - <Tile>1_21412</Tile> - <Tile>1_12401</Tile> - <Tile>1_22401</Tile> - <Tile>1_12402</Tile> - <Tile>1_22402</Tile> - <Tile>1_12403</Tile> - <Tile>1_22403</Tile> - <Tile>1_12404</Tile> - <Tile>1_22404</Tile> - <Tile>1_12405</Tile> - <Tile>1_22405</Tile> - <Tile>1_12406</Tile> - <Tile>1_22406</Tile> - <Tile>1_12407</Tile> - <Tile>1_22407</Tile> - <Tile>1_12408</Tile> - <Tile>1_22408</Tile> - <Tile>1_12409</Tile> - <Tile>1_22409</Tile> - <Tile>1_12410</Tile> - <Tile>1_22410</Tile> - <Tile>1_12411</Tile> - <Tile>1_22411</Tile> - <Tile>1_12412</Tile> - <Tile>1_22412</Tile> - <Tile>1_13401</Tile> - <Tile>1_23401</Tile> - <Tile>1_13402</Tile> - <Tile>1_23402</Tile> - <Tile>1_13403</Tile> - <Tile>1_23403</Tile> - <Tile>1_13404</Tile> - <Tile>1_23404</Tile> - <Tile>1_13405</Tile> - <Tile>1_23405</Tile> - <Tile>1_13406</Tile> - <Tile>1_23406</Tile> - <Tile>1_13407</Tile> - <Tile>1_23407</Tile> - <Tile>1_13408</Tile> - <Tile>1_23408</Tile> - <Tile>1_13409</Tile> - <Tile>1_23409</Tile> - <Tile>1_13410</Tile> - <Tile>1_23410</Tile> - <Tile>1_13411</Tile> - <Tile>1_23411</Tile> - <Tile>1_13412</Tile> - <Tile>1_23412</Tile> - <Tile>2_11401</Tile> - <Tile>2_21401</Tile> - <Tile>2_11402</Tile> - <Tile>2_21402</Tile> - <Tile>2_11403</Tile> - <Tile>2_21403</Tile> - <Tile>2_11404</Tile> - <Tile>2_21404</Tile> - <Tile>2_11405</Tile> - <Tile>2_21405</Tile> - <Tile>2_11406</Tile> - <Tile>2_21406</Tile> - <Tile>2_11407</Tile> - <Tile>2_21407</Tile> - <Tile>2_11408</Tile> - <Tile>2_21408</Tile> - <Tile>2_11409</Tile> - <Tile>2_21409</Tile> - <Tile>2_11410</Tile> - <Tile>2_21410</Tile> - <Tile>2_11411</Tile> - <Tile>2_21411</Tile> - <Tile>2_11412</Tile> - <Tile>2_21412</Tile> - <Tile>2_12401</Tile> - <Tile>2_22401</Tile> - <Tile>2_12402</Tile> - <Tile>2_22402</Tile> - <Tile>2_12403</Tile> - <Tile>2_22403</Tile> - <Tile>2_12404</Tile> - <Tile>2_22404</Tile> - <Tile>2_12405</Tile> - <Tile>2_22405</Tile> - <Tile>2_12406</Tile> - <Tile>2_22406</Tile> - <Tile>2_12407</Tile> - <Tile>2_22407</Tile> - <Tile>2_12408</Tile> - <Tile>2_22408</Tile> - <Tile>2_12409</Tile> - <Tile>2_22409</Tile> - <Tile>2_12410</Tile> - <Tile>2_22410</Tile> - <Tile>2_12411</Tile> - <Tile>2_22411</Tile> - <Tile>2_12412</Tile> - <Tile>2_22412</Tile> - <Tile>2_13401</Tile> - <Tile>2_23401</Tile> - <Tile>2_13402</Tile> - <Tile>2_23402</Tile> - <Tile>2_13403</Tile> - <Tile>2_23403</Tile> - <Tile>2_13404</Tile> - <Tile>2_23404</Tile> - <Tile>2_13405</Tile> - <Tile>2_23405</Tile> - <Tile>2_13406</Tile> - <Tile>2_23406</Tile> - <Tile>2_13407</Tile> - <Tile>2_23407</Tile> - <Tile>2_13408</Tile> - <Tile>2_23408</Tile> - <Tile>2_13409</Tile> - <Tile>2_23409</Tile> - <Tile>2_13410</Tile> - <Tile>2_23410</Tile> - <Tile>2_13411</Tile> - <Tile>2_23411</Tile> - <Tile>2_13412</Tile> - <Tile>2_23412</Tile> - <Tile>1_11501</Tile> - <Tile>1_21501</Tile> - <Tile>1_11502</Tile> - <Tile>1_21502</Tile> - <Tile>1_11503</Tile> - <Tile>1_21503</Tile> - <Tile>1_11504</Tile> - <Tile>1_21504</Tile> - <Tile>1_11505</Tile> - <Tile>1_21505</Tile> - <Tile>1_11506</Tile> - <Tile>1_21506</Tile> - <Tile>1_11507</Tile> - <Tile>1_21507</Tile> - <Tile>1_11508</Tile> - <Tile>1_21508</Tile> - <Tile>1_11509</Tile> - <Tile>1_21509</Tile> - <Tile>1_11510</Tile> - <Tile>1_21510</Tile> - <Tile>1_11511</Tile> - <Tile>1_21511</Tile> - <Tile>1_11512</Tile> - <Tile>1_21512</Tile> - <Tile>1_12501</Tile> - <Tile>1_22501</Tile> - <Tile>1_12502</Tile> - <Tile>1_22502</Tile> - <Tile>1_12503</Tile> - <Tile>1_22503</Tile> - <Tile>1_12504</Tile> - <Tile>1_22504</Tile> - <Tile>1_12505</Tile> - <Tile>1_22505</Tile> - <Tile>1_12506</Tile> - <Tile>1_22506</Tile> - <Tile>1_12507</Tile> - <Tile>1_22507</Tile> - <Tile>1_12508</Tile> - <Tile>1_22508</Tile> - <Tile>1_12509</Tile> - <Tile>1_22509</Tile> - <Tile>1_12510</Tile> - <Tile>1_22510</Tile> - <Tile>1_12511</Tile> - <Tile>1_22511</Tile> - <Tile>1_12512</Tile> - <Tile>1_22512</Tile> - <Tile>1_13501</Tile> - <Tile>1_23501</Tile> - <Tile>1_13502</Tile> - <Tile>1_23502</Tile> - <Tile>1_13503</Tile> - <Tile>1_23503</Tile> - <Tile>1_13504</Tile> - <Tile>1_23504</Tile> - <Tile>1_13505</Tile> - <Tile>1_23505</Tile> - <Tile>1_13506</Tile> - <Tile>1_23506</Tile> - <Tile>1_13507</Tile> - <Tile>1_23507</Tile> - <Tile>1_13508</Tile> - <Tile>1_23508</Tile> - <Tile>1_13509</Tile> - <Tile>1_23509</Tile> - <Tile>1_13510</Tile> - <Tile>1_23510</Tile> - <Tile>1_13511</Tile> - <Tile>1_23511</Tile> - <Tile>1_13512</Tile> - <Tile>1_23512</Tile> - <Tile>2_11501</Tile> - <Tile>2_21501</Tile> - <Tile>2_11502</Tile> - <Tile>2_21502</Tile> - <Tile>2_11503</Tile> - <Tile>2_21503</Tile> - <Tile>2_11504</Tile> - <Tile>2_21504</Tile> - <Tile>2_11505</Tile> - <Tile>2_21505</Tile> - <Tile>2_11506</Tile> - <Tile>2_21506</Tile> - <Tile>2_11507</Tile> - <Tile>2_21507</Tile> - <Tile>2_11508</Tile> - <Tile>2_21508</Tile> - <Tile>2_11509</Tile> - <Tile>2_21509</Tile> - <Tile>2_11510</Tile> - <Tile>2_21510</Tile> - <Tile>2_11511</Tile> - <Tile>2_21511</Tile> - <Tile>2_11512</Tile> - <Tile>2_21512</Tile> - <Tile>2_12501</Tile> - <Tile>2_22501</Tile> - <Tile>2_12502</Tile> - <Tile>2_22502</Tile> - <Tile>2_12503</Tile> - <Tile>2_22503</Tile> - <Tile>2_12504</Tile> - <Tile>2_22504</Tile> - <Tile>2_12505</Tile> - <Tile>2_22505</Tile> - <Tile>2_12506</Tile> - <Tile>2_22506</Tile> - <Tile>2_12507</Tile> - <Tile>2_22507</Tile> - <Tile>2_12508</Tile> - <Tile>2_22508</Tile> - <Tile>2_12509</Tile> - <Tile>2_22509</Tile> - <Tile>2_12510</Tile> - <Tile>2_22510</Tile> - <Tile>2_12511</Tile> - <Tile>2_22511</Tile> - <Tile>2_12512</Tile> - <Tile>2_22512</Tile> - <Tile>2_13501</Tile> - <Tile>2_23501</Tile> - <Tile>2_13502</Tile> - <Tile>2_23502</Tile> - <Tile>2_13503</Tile> - <Tile>2_23503</Tile> - <Tile>2_13504</Tile> - <Tile>2_23504</Tile> - <Tile>2_13505</Tile> - <Tile>2_23505</Tile> - <Tile>2_13506</Tile> - <Tile>2_23506</Tile> - <Tile>2_13507</Tile> - <Tile>2_23507</Tile> - <Tile>2_13508</Tile> - <Tile>2_23508</Tile> - <Tile>2_13509</Tile> - <Tile>2_23509</Tile> - <Tile>2_13510</Tile> - <Tile>2_23510</Tile> - <Tile>2_13511</Tile> - <Tile>2_23511</Tile> - <Tile>2_13512</Tile> - <Tile>2_23512</Tile> - <Tile>1_11601</Tile> - <Tile>1_21601</Tile> - <Tile>1_11602</Tile> - <Tile>1_21602</Tile> - <Tile>1_11603</Tile> - <Tile>1_21603</Tile> - <Tile>1_11604</Tile> - <Tile>1_21604</Tile> - <Tile>1_11605</Tile> - <Tile>1_21605</Tile> - <Tile>1_11606</Tile> - <Tile>1_21606</Tile> - <Tile>1_11607</Tile> - <Tile>1_21607</Tile> - <Tile>1_11608</Tile> - <Tile>1_21608</Tile> - <Tile>1_11609</Tile> - <Tile>1_21609</Tile> - <Tile>1_11610</Tile> - <Tile>1_21610</Tile> - <Tile>1_11611</Tile> - <Tile>1_21611</Tile> - <Tile>1_11612</Tile> - <Tile>1_21612</Tile> - <Tile>1_12601</Tile> - <Tile>1_22601</Tile> - <Tile>1_12602</Tile> - <Tile>1_22602</Tile> - <Tile>1_12603</Tile> - <Tile>1_22603</Tile> - <Tile>1_12604</Tile> - <Tile>1_22604</Tile> - <Tile>1_12605</Tile> - <Tile>1_22605</Tile> - <Tile>1_12606</Tile> - <Tile>1_22606</Tile> - <Tile>1_12607</Tile> - <Tile>1_22607</Tile> - <Tile>1_12608</Tile> - <Tile>1_22608</Tile> - <Tile>1_12609</Tile> - <Tile>1_22609</Tile> - <Tile>1_12610</Tile> - <Tile>1_22610</Tile> - <Tile>1_12611</Tile> - <Tile>1_22611</Tile> - <Tile>1_12612</Tile> - <Tile>1_22612</Tile> - <Tile>1_13601</Tile> - <Tile>1_23601</Tile> - <Tile>1_13602</Tile> - <Tile>1_23602</Tile> - <Tile>1_13603</Tile> - <Tile>1_23603</Tile> - <Tile>1_13604</Tile> - <Tile>1_23604</Tile> - <Tile>1_13605</Tile> - <Tile>1_23605</Tile> - <Tile>1_13606</Tile> - <Tile>1_23606</Tile> - <Tile>1_13607</Tile> - <Tile>1_23607</Tile> - <Tile>1_13608</Tile> - <Tile>1_23608</Tile> - <Tile>1_13609</Tile> - <Tile>1_23609</Tile> - <Tile>1_13610</Tile> - <Tile>1_23610</Tile> - <Tile>1_13611</Tile> - <Tile>1_23611</Tile> - <Tile>1_13612</Tile> - <Tile>1_23612</Tile> - <Tile>2_11601</Tile> - <Tile>2_21601</Tile> - <Tile>2_11602</Tile> - <Tile>2_21602</Tile> - <Tile>2_11603</Tile> - <Tile>2_21603</Tile> - <Tile>2_11604</Tile> - <Tile>2_21604</Tile> - <Tile>2_11605</Tile> - <Tile>2_21605</Tile> - <Tile>2_11606</Tile> - <Tile>2_21606</Tile> - <Tile>2_11607</Tile> - <Tile>2_21607</Tile> - <Tile>2_11608</Tile> - <Tile>2_21608</Tile> - <Tile>2_11609</Tile> - <Tile>2_21609</Tile> - <Tile>2_11610</Tile> - <Tile>2_21610</Tile> - <Tile>2_11611</Tile> - <Tile>2_21611</Tile> - <Tile>2_11612</Tile> - <Tile>2_21612</Tile> - <Tile>2_12601</Tile> - <Tile>2_22601</Tile> - <Tile>2_12602</Tile> - <Tile>2_22602</Tile> - <Tile>2_12603</Tile> - <Tile>2_22603</Tile> - <Tile>2_12604</Tile> - <Tile>2_22604</Tile> - <Tile>2_12605</Tile> - <Tile>2_22605</Tile> - <Tile>2_12606</Tile> - <Tile>2_22606</Tile> - <Tile>2_12607</Tile> - <Tile>2_22607</Tile> - <Tile>2_12608</Tile> - <Tile>2_22608</Tile> - <Tile>2_12609</Tile> - <Tile>2_22609</Tile> - <Tile>2_12610</Tile> - <Tile>2_22610</Tile> - <Tile>2_12611</Tile> - <Tile>2_22611</Tile> - <Tile>2_12612</Tile> - <Tile>2_22612</Tile> - <Tile>2_13601</Tile> - <Tile>2_23601</Tile> - <Tile>2_13602</Tile> - <Tile>2_23602</Tile> - <Tile>2_13603</Tile> - <Tile>2_23603</Tile> - <Tile>2_13604</Tile> - <Tile>2_23604</Tile> - <Tile>2_13605</Tile> - <Tile>2_23605</Tile> - <Tile>2_13606</Tile> - <Tile>2_23606</Tile> - <Tile>2_13607</Tile> - <Tile>2_23607</Tile> - <Tile>2_13608</Tile> - <Tile>2_23608</Tile> - <Tile>2_13609</Tile> - <Tile>2_23609</Tile> - <Tile>2_13610</Tile> - <Tile>2_23610</Tile> - <Tile>2_13611</Tile> - <Tile>2_23611</Tile> - <Tile>2_13612</Tile> - <Tile>2_23612</Tile> - </Tiles> - </TileSet> - </FlowcellLayout> - <ImageDimensions Width="2592" Height="1944" /> - <ImageChannels> - <Name>Red</Name> - <Name>Green</Name> - </ImageChannels> - </Run> -</RunInfo> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml b/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml deleted file mode 100644 index dadfb6c1ad6..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFCreateFlowcellNextseqTest/141212_NS500318_0033_AH16YMBGXX/RunParameters.xml +++ /dev/null @@ -1,926 +0,0 @@ -<?xml version="1.0"?> -<RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - <Setup> - <SupportMultipleSurfacesInUI>true</SupportMultipleSurfacesInUI> - <ApplicationVersion>1.3.0.23</ApplicationVersion> - <ApplicationName>NextSeq Control Software</ApplicationName> - <NumTilesPerSwath>12</NumTilesPerSwath> - <NumSwaths>3</NumSwaths> - <NumLanes>4</NumLanes> - <Read1>76</Read1> - <Read2>0</Read2> - <Index1Read>8</Index1Read> - <Index2Read>8</Index2Read> - <SectionPerLane>3</SectionPerLane> - <LanePerSection>2</LanePerSection> - </Setup> - <RunID>141212_NS500318_0033_AH16YMBGXX</RunID> - <InstrumentID>NS500318</InstrumentID> - <RunNumber>33</RunNumber> - <RTAVersion>2.1.3</RTAVersion> - <SystemSuiteVersion>1.3.0.9</SystemSuiteVersion> - <FlowCellSerial>H16YMBGXX</FlowCellSerial> - <PR2BottleSerial>NS2049329-BUFFR</PR2BottleSerial> - <ReagentKitSerial>NS2038160-REAGT</ReagentKitSerial> - <ReagentKitSerialWasEnteredInBaseSpace>false</ReagentKitSerialWasEnteredInBaseSpace> - <ExperimentName>Arnau_SC4</ExperimentName> - <LibraryID /> - <Chemistry>NextSeq High</Chemistry> - <SelectedTiles> - <Tile>1_11101</Tile> - <Tile>1_21101</Tile> - <Tile>1_11102</Tile> - <Tile>1_21102</Tile> - <Tile>1_11103</Tile> - <Tile>1_21103</Tile> - <Tile>1_11104</Tile> - <Tile>1_21104</Tile> - <Tile>1_11105</Tile> - <Tile>1_21105</Tile> - <Tile>1_11106</Tile> - <Tile>1_21106</Tile> - <Tile>1_11107</Tile> - <Tile>1_21107</Tile> - <Tile>1_11108</Tile> - <Tile>1_21108</Tile> - <Tile>1_11109</Tile> - <Tile>1_21109</Tile> - <Tile>1_11110</Tile> - <Tile>1_21110</Tile> - <Tile>1_11111</Tile> - <Tile>1_21111</Tile> - <Tile>1_11112</Tile> - <Tile>1_21112</Tile> - <Tile>1_12101</Tile> - <Tile>1_22101</Tile> - <Tile>1_12102</Tile> - <Tile>1_22102</Tile> - <Tile>1_12103</Tile> - <Tile>1_22103</Tile> - <Tile>1_12104</Tile> - <Tile>1_22104</Tile> - <Tile>1_12105</Tile> - <Tile>1_22105</Tile> - <Tile>1_12106</Tile> - <Tile>1_22106</Tile> - <Tile>1_12107</Tile> - <Tile>1_22107</Tile> - <Tile>1_12108</Tile> - <Tile>1_22108</Tile> - <Tile>1_12109</Tile> - <Tile>1_22109</Tile> - <Tile>1_12110</Tile> - <Tile>1_22110</Tile> - <Tile>1_12111</Tile> - <Tile>1_22111</Tile> - <Tile>1_12112</Tile> - <Tile>1_22112</Tile> - <Tile>1_13101</Tile> - <Tile>1_23101</Tile> - <Tile>1_13102</Tile> - <Tile>1_23102</Tile> - <Tile>1_13103</Tile> - <Tile>1_23103</Tile> - <Tile>1_13104</Tile> - <Tile>1_23104</Tile> - <Tile>1_13105</Tile> - <Tile>1_23105</Tile> - <Tile>1_13106</Tile> - <Tile>1_23106</Tile> - <Tile>1_13107</Tile> - <Tile>1_23107</Tile> - <Tile>1_13108</Tile> - <Tile>1_23108</Tile> - <Tile>1_13109</Tile> - <Tile>1_23109</Tile> - <Tile>1_13110</Tile> - <Tile>1_23110</Tile> - <Tile>1_13111</Tile> - <Tile>1_23111</Tile> - <Tile>1_13112</Tile> - <Tile>1_23112</Tile> - <Tile>2_11101</Tile> - <Tile>2_21101</Tile> - <Tile>2_11102</Tile> - <Tile>2_21102</Tile> - <Tile>2_11103</Tile> - <Tile>2_21103</Tile> - <Tile>2_11104</Tile> - <Tile>2_21104</Tile> - <Tile>2_11105</Tile> - <Tile>2_21105</Tile> - <Tile>2_11106</Tile> - <Tile>2_21106</Tile> - <Tile>2_11107</Tile> - <Tile>2_21107</Tile> - <Tile>2_11108</Tile> - <Tile>2_21108</Tile> - <Tile>2_11109</Tile> - <Tile>2_21109</Tile> - <Tile>2_11110</Tile> - <Tile>2_21110</Tile> - <Tile>2_11111</Tile> - <Tile>2_21111</Tile> - <Tile>2_11112</Tile> - <Tile>2_21112</Tile> - <Tile>2_12101</Tile> - <Tile>2_22101</Tile> - <Tile>2_12102</Tile> - <Tile>2_22102</Tile> - <Tile>2_12103</Tile> - <Tile>2_22103</Tile> - <Tile>2_12104</Tile> - <Tile>2_22104</Tile> - <Tile>2_12105</Tile> - <Tile>2_22105</Tile> - <Tile>2_12106</Tile> - <Tile>2_22106</Tile> - <Tile>2_12107</Tile> - <Tile>2_22107</Tile> - <Tile>2_12108</Tile> - <Tile>2_22108</Tile> - <Tile>2_12109</Tile> - <Tile>2_22109</Tile> - <Tile>2_12110</Tile> - <Tile>2_22110</Tile> - <Tile>2_12111</Tile> - <Tile>2_22111</Tile> - <Tile>2_12112</Tile> - <Tile>2_22112</Tile> - <Tile>2_13101</Tile> - <Tile>2_23101</Tile> - <Tile>2_13102</Tile> - <Tile>2_23102</Tile> - <Tile>2_13103</Tile> - <Tile>2_23103</Tile> - <Tile>2_13104</Tile> - <Tile>2_23104</Tile> - <Tile>2_13105</Tile> - <Tile>2_23105</Tile> - <Tile>2_13106</Tile> - <Tile>2_23106</Tile> - <Tile>2_13107</Tile> - <Tile>2_23107</Tile> - <Tile>2_13108</Tile> - <Tile>2_23108</Tile> - <Tile>2_13109</Tile> - <Tile>2_23109</Tile> - <Tile>2_13110</Tile> - <Tile>2_23110</Tile> - <Tile>2_13111</Tile> - <Tile>2_23111</Tile> - <Tile>2_13112</Tile> - <Tile>2_23112</Tile> - <Tile>1_11201</Tile> - <Tile>1_21201</Tile> - <Tile>1_11202</Tile> - <Tile>1_21202</Tile> - <Tile>1_11203</Tile> - <Tile>1_21203</Tile> - <Tile>1_11204</Tile> - <Tile>1_21204</Tile> - <Tile>1_11205</Tile> - <Tile>1_21205</Tile> - <Tile>1_11206</Tile> - <Tile>1_21206</Tile> - <Tile>1_11207</Tile> - <Tile>1_21207</Tile> - <Tile>1_11208</Tile> - <Tile>1_21208</Tile> - <Tile>1_11209</Tile> - <Tile>1_21209</Tile> - <Tile>1_11210</Tile> - <Tile>1_21210</Tile> - <Tile>1_11211</Tile> - <Tile>1_21211</Tile> - <Tile>1_11212</Tile> - <Tile>1_21212</Tile> - <Tile>1_12201</Tile> - <Tile>1_22201</Tile> - <Tile>1_12202</Tile> - <Tile>1_22202</Tile> - <Tile>1_12203</Tile> - <Tile>1_22203</Tile> - <Tile>1_12204</Tile> - <Tile>1_22204</Tile> - <Tile>1_12205</Tile> - <Tile>1_22205</Tile> - <Tile>1_12206</Tile> - <Tile>1_22206</Tile> - <Tile>1_12207</Tile> - <Tile>1_22207</Tile> - <Tile>1_12208</Tile> - <Tile>1_22208</Tile> - <Tile>1_12209</Tile> - <Tile>1_22209</Tile> - <Tile>1_12210</Tile> - <Tile>1_22210</Tile> - <Tile>1_12211</Tile> - <Tile>1_22211</Tile> - <Tile>1_12212</Tile> - <Tile>1_22212</Tile> - <Tile>1_13201</Tile> - <Tile>1_23201</Tile> - <Tile>1_13202</Tile> - <Tile>1_23202</Tile> - <Tile>1_13203</Tile> - <Tile>1_23203</Tile> - <Tile>1_13204</Tile> - <Tile>1_23204</Tile> - <Tile>1_13205</Tile> - <Tile>1_23205</Tile> - <Tile>1_13206</Tile> - <Tile>1_23206</Tile> - <Tile>1_13207</Tile> - <Tile>1_23207</Tile> - <Tile>1_13208</Tile> - <Tile>1_23208</Tile> - <Tile>1_13209</Tile> - <Tile>1_23209</Tile> - <Tile>1_13210</Tile> - <Tile>1_23210</Tile> - <Tile>1_13211</Tile> - <Tile>1_23211</Tile> - <Tile>1_13212</Tile> - <Tile>1_23212</Tile> - <Tile>2_11201</Tile> - <Tile>2_21201</Tile> - <Tile>2_11202</Tile> - <Tile>2_21202</Tile> - <Tile>2_11203</Tile> - <Tile>2_21203</Tile> - <Tile>2_11204</Tile> - <Tile>2_21204</Tile> - <Tile>2_11205</Tile> - <Tile>2_21205</Tile> - <Tile>2_11206</Tile> - <Tile>2_21206</Tile> - <Tile>2_11207</Tile> - <Tile>2_21207</Tile> - <Tile>2_11208</Tile> - <Tile>2_21208</Tile> - <Tile>2_11209</Tile> - <Tile>2_21209</Tile> - <Tile>2_11210</Tile> - <Tile>2_21210</Tile> - <Tile>2_11211</Tile> - <Tile>2_21211</Tile> - <Tile>2_11212</Tile> - <Tile>2_21212</Tile> - <Tile>2_12201</Tile> - <Tile>2_22201</Tile> - <Tile>2_12202</Tile> - <Tile>2_22202</Tile> - <Tile>2_12203</Tile> - <Tile>2_22203</Tile> - <Tile>2_12204</Tile> - <Tile>2_22204</Tile> - <Tile>2_12205</Tile> - <Tile>2_22205</Tile> - <Tile>2_12206</Tile> - <Tile>2_22206</Tile> - <Tile>2_12207</Tile> - <Tile>2_22207</Tile> - <Tile>2_12208</Tile> - <Tile>2_22208</Tile> - <Tile>2_12209</Tile> - <Tile>2_22209</Tile> - <Tile>2_12210</Tile> - <Tile>2_22210</Tile> - <Tile>2_12211</Tile> - <Tile>2_22211</Tile> - <Tile>2_12212</Tile> - <Tile>2_22212</Tile> - <Tile>2_13201</Tile> - <Tile>2_23201</Tile> - <Tile>2_13202</Tile> - <Tile>2_23202</Tile> - <Tile>2_13203</Tile> - <Tile>2_23203</Tile> - <Tile>2_13204</Tile> - <Tile>2_23204</Tile> - <Tile>2_13205</Tile> - <Tile>2_23205</Tile> - <Tile>2_13206</Tile> - <Tile>2_23206</Tile> - <Tile>2_13207</Tile> - <Tile>2_23207</Tile> - <Tile>2_13208</Tile> - <Tile>2_23208</Tile> - <Tile>2_13209</Tile> - <Tile>2_23209</Tile> - <Tile>2_13210</Tile> - <Tile>2_23210</Tile> - <Tile>2_13211</Tile> - <Tile>2_23211</Tile> - <Tile>2_13212</Tile> - <Tile>2_23212</Tile> - <Tile>1_11301</Tile> - <Tile>1_21301</Tile> - <Tile>1_11302</Tile> - <Tile>1_21302</Tile> - <Tile>1_11303</Tile> - <Tile>1_21303</Tile> - <Tile>1_11304</Tile> - <Tile>1_21304</Tile> - <Tile>1_11305</Tile> - <Tile>1_21305</Tile> - <Tile>1_11306</Tile> - <Tile>1_21306</Tile> - <Tile>1_11307</Tile> - <Tile>1_21307</Tile> - <Tile>1_11308</Tile> - <Tile>1_21308</Tile> - <Tile>1_11309</Tile> - <Tile>1_21309</Tile> - <Tile>1_11310</Tile> - <Tile>1_21310</Tile> - <Tile>1_11311</Tile> - <Tile>1_21311</Tile> - <Tile>1_11312</Tile> - <Tile>1_21312</Tile> - <Tile>1_12301</Tile> - <Tile>1_22301</Tile> - <Tile>1_12302</Tile> - <Tile>1_22302</Tile> - <Tile>1_12303</Tile> - <Tile>1_22303</Tile> - <Tile>1_12304</Tile> - <Tile>1_22304</Tile> - <Tile>1_12305</Tile> - <Tile>1_22305</Tile> - <Tile>1_12306</Tile> - <Tile>1_22306</Tile> - <Tile>1_12307</Tile> - <Tile>1_22307</Tile> - <Tile>1_12308</Tile> - <Tile>1_22308</Tile> - <Tile>1_12309</Tile> - <Tile>1_22309</Tile> - <Tile>1_12310</Tile> - <Tile>1_22310</Tile> - <Tile>1_12311</Tile> - <Tile>1_22311</Tile> - <Tile>1_12312</Tile> - <Tile>1_22312</Tile> - <Tile>1_13301</Tile> - <Tile>1_23301</Tile> - <Tile>1_13302</Tile> - <Tile>1_23302</Tile> - <Tile>1_13303</Tile> - <Tile>1_23303</Tile> - <Tile>1_13304</Tile> - <Tile>1_23304</Tile> - <Tile>1_13305</Tile> - <Tile>1_23305</Tile> - <Tile>1_13306</Tile> - <Tile>1_23306</Tile> - <Tile>1_13307</Tile> - <Tile>1_23307</Tile> - <Tile>1_13308</Tile> - <Tile>1_23308</Tile> - <Tile>1_13309</Tile> - <Tile>1_23309</Tile> - <Tile>1_13310</Tile> - <Tile>1_23310</Tile> - <Tile>1_13311</Tile> - <Tile>1_23311</Tile> - <Tile>1_13312</Tile> - <Tile>1_23312</Tile> - <Tile>2_11301</Tile> - <Tile>2_21301</Tile> - <Tile>2_11302</Tile> - <Tile>2_21302</Tile> - <Tile>2_11303</Tile> - <Tile>2_21303</Tile> - <Tile>2_11304</Tile> - <Tile>2_21304</Tile> - <Tile>2_11305</Tile> - <Tile>2_21305</Tile> - <Tile>2_11306</Tile> - <Tile>2_21306</Tile> - <Tile>2_11307</Tile> - <Tile>2_21307</Tile> - <Tile>2_11308</Tile> - <Tile>2_21308</Tile> - <Tile>2_11309</Tile> - <Tile>2_21309</Tile> - <Tile>2_11310</Tile> - <Tile>2_21310</Tile> - <Tile>2_11311</Tile> - <Tile>2_21311</Tile> - <Tile>2_11312</Tile> - <Tile>2_21312</Tile> - <Tile>2_12301</Tile> - <Tile>2_22301</Tile> - <Tile>2_12302</Tile> - <Tile>2_22302</Tile> - <Tile>2_12303</Tile> - <Tile>2_22303</Tile> - <Tile>2_12304</Tile> - <Tile>2_22304</Tile> - <Tile>2_12305</Tile> - <Tile>2_22305</Tile> - <Tile>2_12306</Tile> - <Tile>2_22306</Tile> - <Tile>2_12307</Tile> - <Tile>2_22307</Tile> - <Tile>2_12308</Tile> - <Tile>2_22308</Tile> - <Tile>2_12309</Tile> - <Tile>2_22309</Tile> - <Tile>2_12310</Tile> - <Tile>2_22310</Tile> - <Tile>2_12311</Tile> - <Tile>2_22311</Tile> - <Tile>2_12312</Tile> - <Tile>2_22312</Tile> - <Tile>2_13301</Tile> - <Tile>2_23301</Tile> - <Tile>2_13302</Tile> - <Tile>2_23302</Tile> - <Tile>2_13303</Tile> - <Tile>2_23303</Tile> - <Tile>2_13304</Tile> - <Tile>2_23304</Tile> - <Tile>2_13305</Tile> - <Tile>2_23305</Tile> - <Tile>2_13306</Tile> - <Tile>2_23306</Tile> - <Tile>2_13307</Tile> - <Tile>2_23307</Tile> - <Tile>2_13308</Tile> - <Tile>2_23308</Tile> - <Tile>2_13309</Tile> - <Tile>2_23309</Tile> - <Tile>2_13310</Tile> - <Tile>2_23310</Tile> - <Tile>2_13311</Tile> - <Tile>2_23311</Tile> - <Tile>2_13312</Tile> - <Tile>2_23312</Tile> - <Tile>1_11401</Tile> - <Tile>1_21401</Tile> - <Tile>1_11402</Tile> - <Tile>1_21402</Tile> - <Tile>1_11403</Tile> - <Tile>1_21403</Tile> - <Tile>1_11404</Tile> - <Tile>1_21404</Tile> - <Tile>1_11405</Tile> - <Tile>1_21405</Tile> - <Tile>1_11406</Tile> - <Tile>1_21406</Tile> - <Tile>1_11407</Tile> - <Tile>1_21407</Tile> - <Tile>1_11408</Tile> - <Tile>1_21408</Tile> - <Tile>1_11409</Tile> - <Tile>1_21409</Tile> - <Tile>1_11410</Tile> - <Tile>1_21410</Tile> - <Tile>1_11411</Tile> - <Tile>1_21411</Tile> - <Tile>1_11412</Tile> - <Tile>1_21412</Tile> - <Tile>1_12401</Tile> - <Tile>1_22401</Tile> - <Tile>1_12402</Tile> - <Tile>1_22402</Tile> - <Tile>1_12403</Tile> - <Tile>1_22403</Tile> - <Tile>1_12404</Tile> - <Tile>1_22404</Tile> - <Tile>1_12405</Tile> - <Tile>1_22405</Tile> - <Tile>1_12406</Tile> - <Tile>1_22406</Tile> - <Tile>1_12407</Tile> - <Tile>1_22407</Tile> - <Tile>1_12408</Tile> - <Tile>1_22408</Tile> - <Tile>1_12409</Tile> - <Tile>1_22409</Tile> - <Tile>1_12410</Tile> - <Tile>1_22410</Tile> - <Tile>1_12411</Tile> - <Tile>1_22411</Tile> - <Tile>1_12412</Tile> - <Tile>1_22412</Tile> - <Tile>1_13401</Tile> - <Tile>1_23401</Tile> - <Tile>1_13402</Tile> - <Tile>1_23402</Tile> - <Tile>1_13403</Tile> - <Tile>1_23403</Tile> - <Tile>1_13404</Tile> - <Tile>1_23404</Tile> - <Tile>1_13405</Tile> - <Tile>1_23405</Tile> - <Tile>1_13406</Tile> - <Tile>1_23406</Tile> - <Tile>1_13407</Tile> - <Tile>1_23407</Tile> - <Tile>1_13408</Tile> - <Tile>1_23408</Tile> - <Tile>1_13409</Tile> - <Tile>1_23409</Tile> - <Tile>1_13410</Tile> - <Tile>1_23410</Tile> - <Tile>1_13411</Tile> - <Tile>1_23411</Tile> - <Tile>1_13412</Tile> - <Tile>1_23412</Tile> - <Tile>2_11401</Tile> - <Tile>2_21401</Tile> - <Tile>2_11402</Tile> - <Tile>2_21402</Tile> - <Tile>2_11403</Tile> - <Tile>2_21403</Tile> - <Tile>2_11404</Tile> - <Tile>2_21404</Tile> - <Tile>2_11405</Tile> - <Tile>2_21405</Tile> - <Tile>2_11406</Tile> - <Tile>2_21406</Tile> - <Tile>2_11407</Tile> - <Tile>2_21407</Tile> - <Tile>2_11408</Tile> - <Tile>2_21408</Tile> - <Tile>2_11409</Tile> - <Tile>2_21409</Tile> - <Tile>2_11410</Tile> - <Tile>2_21410</Tile> - <Tile>2_11411</Tile> - <Tile>2_21411</Tile> - <Tile>2_11412</Tile> - <Tile>2_21412</Tile> - <Tile>2_12401</Tile> - <Tile>2_22401</Tile> - <Tile>2_12402</Tile> - <Tile>2_22402</Tile> - <Tile>2_12403</Tile> - <Tile>2_22403</Tile> - <Tile>2_12404</Tile> - <Tile>2_22404</Tile> - <Tile>2_12405</Tile> - <Tile>2_22405</Tile> - <Tile>2_12406</Tile> - <Tile>2_22406</Tile> - <Tile>2_12407</Tile> - <Tile>2_22407</Tile> - <Tile>2_12408</Tile> - <Tile>2_22408</Tile> - <Tile>2_12409</Tile> - <Tile>2_22409</Tile> - <Tile>2_12410</Tile> - <Tile>2_22410</Tile> - <Tile>2_12411</Tile> - <Tile>2_22411</Tile> - <Tile>2_12412</Tile> - <Tile>2_22412</Tile> - <Tile>2_13401</Tile> - <Tile>2_23401</Tile> - <Tile>2_13402</Tile> - <Tile>2_23402</Tile> - <Tile>2_13403</Tile> - <Tile>2_23403</Tile> - <Tile>2_13404</Tile> - <Tile>2_23404</Tile> - <Tile>2_13405</Tile> - <Tile>2_23405</Tile> - <Tile>2_13406</Tile> - <Tile>2_23406</Tile> - <Tile>2_13407</Tile> - <Tile>2_23407</Tile> - <Tile>2_13408</Tile> - <Tile>2_23408</Tile> - <Tile>2_13409</Tile> - <Tile>2_23409</Tile> - <Tile>2_13410</Tile> - <Tile>2_23410</Tile> - <Tile>2_13411</Tile> - <Tile>2_23411</Tile> - <Tile>2_13412</Tile> - <Tile>2_23412</Tile> - <Tile>1_11501</Tile> - <Tile>1_21501</Tile> - <Tile>1_11502</Tile> - <Tile>1_21502</Tile> - <Tile>1_11503</Tile> - <Tile>1_21503</Tile> - <Tile>1_11504</Tile> - <Tile>1_21504</Tile> - <Tile>1_11505</Tile> - <Tile>1_21505</Tile> - <Tile>1_11506</Tile> - <Tile>1_21506</Tile> - <Tile>1_11507</Tile> - <Tile>1_21507</Tile> - <Tile>1_11508</Tile> - <Tile>1_21508</Tile> - <Tile>1_11509</Tile> - <Tile>1_21509</Tile> - <Tile>1_11510</Tile> - <Tile>1_21510</Tile> - <Tile>1_11511</Tile> - <Tile>1_21511</Tile> - <Tile>1_11512</Tile> - <Tile>1_21512</Tile> - <Tile>1_12501</Tile> - <Tile>1_22501</Tile> - <Tile>1_12502</Tile> - <Tile>1_22502</Tile> - <Tile>1_12503</Tile> - <Tile>1_22503</Tile> - <Tile>1_12504</Tile> - <Tile>1_22504</Tile> - <Tile>1_12505</Tile> - <Tile>1_22505</Tile> - <Tile>1_12506</Tile> - <Tile>1_22506</Tile> - <Tile>1_12507</Tile> - <Tile>1_22507</Tile> - <Tile>1_12508</Tile> - <Tile>1_22508</Tile> - <Tile>1_12509</Tile> - <Tile>1_22509</Tile> - <Tile>1_12510</Tile> - <Tile>1_22510</Tile> - <Tile>1_12511</Tile> - <Tile>1_22511</Tile> - <Tile>1_12512</Tile> - <Tile>1_22512</Tile> - <Tile>1_13501</Tile> - <Tile>1_23501</Tile> - <Tile>1_13502</Tile> - <Tile>1_23502</Tile> - <Tile>1_13503</Tile> - <Tile>1_23503</Tile> - <Tile>1_13504</Tile> - <Tile>1_23504</Tile> - <Tile>1_13505</Tile> - <Tile>1_23505</Tile> - <Tile>1_13506</Tile> - <Tile>1_23506</Tile> - <Tile>1_13507</Tile> - <Tile>1_23507</Tile> - <Tile>1_13508</Tile> - <Tile>1_23508</Tile> - <Tile>1_13509</Tile> - <Tile>1_23509</Tile> - <Tile>1_13510</Tile> - <Tile>1_23510</Tile> - <Tile>1_13511</Tile> - <Tile>1_23511</Tile> - <Tile>1_13512</Tile> - <Tile>1_23512</Tile> - <Tile>2_11501</Tile> - <Tile>2_21501</Tile> - <Tile>2_11502</Tile> - <Tile>2_21502</Tile> - <Tile>2_11503</Tile> - <Tile>2_21503</Tile> - <Tile>2_11504</Tile> - <Tile>2_21504</Tile> - <Tile>2_11505</Tile> - <Tile>2_21505</Tile> - <Tile>2_11506</Tile> - <Tile>2_21506</Tile> - <Tile>2_11507</Tile> - <Tile>2_21507</Tile> - <Tile>2_11508</Tile> - <Tile>2_21508</Tile> - <Tile>2_11509</Tile> - <Tile>2_21509</Tile> - <Tile>2_11510</Tile> - <Tile>2_21510</Tile> - <Tile>2_11511</Tile> - <Tile>2_21511</Tile> - <Tile>2_11512</Tile> - <Tile>2_21512</Tile> - <Tile>2_12501</Tile> - <Tile>2_22501</Tile> - <Tile>2_12502</Tile> - <Tile>2_22502</Tile> - <Tile>2_12503</Tile> - <Tile>2_22503</Tile> - <Tile>2_12504</Tile> - <Tile>2_22504</Tile> - <Tile>2_12505</Tile> - <Tile>2_22505</Tile> - <Tile>2_12506</Tile> - <Tile>2_22506</Tile> - <Tile>2_12507</Tile> - <Tile>2_22507</Tile> - <Tile>2_12508</Tile> - <Tile>2_22508</Tile> - <Tile>2_12509</Tile> - <Tile>2_22509</Tile> - <Tile>2_12510</Tile> - <Tile>2_22510</Tile> - <Tile>2_12511</Tile> - <Tile>2_22511</Tile> - <Tile>2_12512</Tile> - <Tile>2_22512</Tile> - <Tile>2_13501</Tile> - <Tile>2_23501</Tile> - <Tile>2_13502</Tile> - <Tile>2_23502</Tile> - <Tile>2_13503</Tile> - <Tile>2_23503</Tile> - <Tile>2_13504</Tile> - <Tile>2_23504</Tile> - <Tile>2_13505</Tile> - <Tile>2_23505</Tile> - <Tile>2_13506</Tile> - <Tile>2_23506</Tile> - <Tile>2_13507</Tile> - <Tile>2_23507</Tile> - <Tile>2_13508</Tile> - <Tile>2_23508</Tile> - <Tile>2_13509</Tile> - <Tile>2_23509</Tile> - <Tile>2_13510</Tile> - <Tile>2_23510</Tile> - <Tile>2_13511</Tile> - <Tile>2_23511</Tile> - <Tile>2_13512</Tile> - <Tile>2_23512</Tile> - <Tile>1_11601</Tile> - <Tile>1_21601</Tile> - <Tile>1_11602</Tile> - <Tile>1_21602</Tile> - <Tile>1_11603</Tile> - <Tile>1_21603</Tile> - <Tile>1_11604</Tile> - <Tile>1_21604</Tile> - <Tile>1_11605</Tile> - <Tile>1_21605</Tile> - <Tile>1_11606</Tile> - <Tile>1_21606</Tile> - <Tile>1_11607</Tile> - <Tile>1_21607</Tile> - <Tile>1_11608</Tile> - <Tile>1_21608</Tile> - <Tile>1_11609</Tile> - <Tile>1_21609</Tile> - <Tile>1_11610</Tile> - <Tile>1_21610</Tile> - <Tile>1_11611</Tile> - <Tile>1_21611</Tile> - <Tile>1_11612</Tile> - <Tile>1_21612</Tile> - <Tile>1_12601</Tile> - <Tile>1_22601</Tile> - <Tile>1_12602</Tile> - <Tile>1_22602</Tile> - <Tile>1_12603</Tile> - <Tile>1_22603</Tile> - <Tile>1_12604</Tile> - <Tile>1_22604</Tile> - <Tile>1_12605</Tile> - <Tile>1_22605</Tile> - <Tile>1_12606</Tile> - <Tile>1_22606</Tile> - <Tile>1_12607</Tile> - <Tile>1_22607</Tile> - <Tile>1_12608</Tile> - <Tile>1_22608</Tile> - <Tile>1_12609</Tile> - <Tile>1_22609</Tile> - <Tile>1_12610</Tile> - <Tile>1_22610</Tile> - <Tile>1_12611</Tile> - <Tile>1_22611</Tile> - <Tile>1_12612</Tile> - <Tile>1_22612</Tile> - <Tile>1_13601</Tile> - <Tile>1_23601</Tile> - <Tile>1_13602</Tile> - <Tile>1_23602</Tile> - <Tile>1_13603</Tile> - <Tile>1_23603</Tile> - <Tile>1_13604</Tile> - <Tile>1_23604</Tile> - <Tile>1_13605</Tile> - <Tile>1_23605</Tile> - <Tile>1_13606</Tile> - <Tile>1_23606</Tile> - <Tile>1_13607</Tile> - <Tile>1_23607</Tile> - <Tile>1_13608</Tile> - <Tile>1_23608</Tile> - <Tile>1_13609</Tile> - <Tile>1_23609</Tile> - <Tile>1_13610</Tile> - <Tile>1_23610</Tile> - <Tile>1_13611</Tile> - <Tile>1_23611</Tile> - <Tile>1_13612</Tile> - <Tile>1_23612</Tile> - <Tile>2_11601</Tile> - <Tile>2_21601</Tile> - <Tile>2_11602</Tile> - <Tile>2_21602</Tile> - <Tile>2_11603</Tile> - <Tile>2_21603</Tile> - <Tile>2_11604</Tile> - <Tile>2_21604</Tile> - <Tile>2_11605</Tile> - <Tile>2_21605</Tile> - <Tile>2_11606</Tile> - <Tile>2_21606</Tile> - <Tile>2_11607</Tile> - <Tile>2_21607</Tile> - <Tile>2_11608</Tile> - <Tile>2_21608</Tile> - <Tile>2_11609</Tile> - <Tile>2_21609</Tile> - <Tile>2_11610</Tile> - <Tile>2_21610</Tile> - <Tile>2_11611</Tile> - <Tile>2_21611</Tile> - <Tile>2_11612</Tile> - <Tile>2_21612</Tile> - <Tile>2_12601</Tile> - <Tile>2_22601</Tile> - <Tile>2_12602</Tile> - <Tile>2_22602</Tile> - <Tile>2_12603</Tile> - <Tile>2_22603</Tile> - <Tile>2_12604</Tile> - <Tile>2_22604</Tile> - <Tile>2_12605</Tile> - <Tile>2_22605</Tile> - <Tile>2_12606</Tile> - <Tile>2_22606</Tile> - <Tile>2_12607</Tile> - <Tile>2_22607</Tile> - <Tile>2_12608</Tile> - <Tile>2_22608</Tile> - <Tile>2_12609</Tile> - <Tile>2_22609</Tile> - <Tile>2_12610</Tile> - <Tile>2_22610</Tile> - <Tile>2_12611</Tile> - <Tile>2_22611</Tile> - <Tile>2_12612</Tile> - <Tile>2_22612</Tile> - <Tile>2_13601</Tile> - <Tile>2_23601</Tile> - <Tile>2_13602</Tile> - <Tile>2_23602</Tile> - <Tile>2_13603</Tile> - <Tile>2_23603</Tile> - <Tile>2_13604</Tile> - <Tile>2_23604</Tile> - <Tile>2_13605</Tile> - <Tile>2_23605</Tile> - <Tile>2_13606</Tile> - <Tile>2_23606</Tile> - <Tile>2_13607</Tile> - <Tile>2_23607</Tile> - <Tile>2_13608</Tile> - <Tile>2_23608</Tile> - <Tile>2_13609</Tile> - <Tile>2_23609</Tile> - <Tile>2_13610</Tile> - <Tile>2_23610</Tile> - <Tile>2_13611</Tile> - <Tile>2_23611</Tile> - <Tile>2_13612</Tile> - <Tile>2_23612</Tile> - </SelectedTiles> - <RunFolder>D:\Illumina\NextSeq Control Software Temp\141212_NS500318_0033_AH16YMBGXX\</RunFolder> - <OutputFolder>Y:\r2d2\141212_NS500318_0033_AH16YMBGXX\</OutputFolder> - <RecipeFolder>C:\Illumina\NextSeq Control Software\Recipe\High\v1.1</RecipeFolder> - <SimulationFolder /> - <RunStartDate>141212</RunStartDate> - <FocusMethod>IXFocus</FocusMethod> - <SurfaceToScan>Both</SurfaceToScan> - <SaveFocusImages>false</SaveFocusImages> - <SaveScanImages>false</SaveScanImages> - <SelectiveSave>true</SelectiveSave> - <IsPairedEnd>false</IsPairedEnd> - <AnalysisWorkflowType /> - <CustomReadOnePrimer>BP10</CustomReadOnePrimer> - <CustomReadTwoPrimer>BP11</CustomReadTwoPrimer> - <CustomIndexPrimer>BP12</CustomIndexPrimer> - <CustomIndexTwoPrimer>EXT</CustomIndexTwoPrimer> - <UsesCustomReadOnePrimer>false</UsesCustomReadOnePrimer> - <UsesCustomReadTwoPrimer>false</UsesCustomReadTwoPrimer> - <UsesCustomIndexPrimer>false</UsesCustomIndexPrimer> - <UsesCustomIndexTwoPrimer>false</UsesCustomIndexTwoPrimer> - <RunManagementType>Standalone</RunManagementType> - <BaseSpaceRunId>9643683</BaseSpaceRunId> - <BaseSpaceRunMode>IlluminaHealthOnly</BaseSpaceRunMode> - <ComputerName>BS-DSFCONTROL05</ComputerName> - <SequencingStarted>true</SequencingStarted> - <PlannedRead1Cycles>76</PlannedRead1Cycles> - <PlannedRead2Cycles>0</PlannedRead2Cycles> - <PlannedIndex1ReadCycles>8</PlannedIndex1ReadCycles> - <PlannedIndex2ReadCycles>8</PlannedIndex2ReadCycles> - <IsRehyb>false</IsRehyb> - <MaxCyclesSupportedByReagentKit>92</MaxCyclesSupportedByReagentKit> -</RunParameters> \ No newline at end of file diff --git a/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt b/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt deleted file mode 100644 index 3a3b0960199..00000000000 --- a/deep_sequencing_unit/resource/test-data/QGFReadRtaTimestampTest/141204_D00535_0035_BC5LPVANXX/RTAComplete.txt +++ /dev/null @@ -1 +0,0 @@ -12/5/2014,16:47:09.380,Illumina RTA 1.18.61 diff --git a/deep_sequencing_unit/resource/test-db/.gitignore b/deep_sequencing_unit/resource/test-db/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/settings.gradle b/deep_sequencing_unit/settings.gradle deleted file mode 100644 index 33440dae995..00000000000 --- a/deep_sequencing_unit/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', 'datastore_server' diff --git a/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds b/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds deleted file mode 100755 index 7085666c1b9..00000000000 --- a/deep_sequencing_unit/source/BDS/analysis_bcl2fastq.bds +++ /dev/null @@ -1,770 +0,0 @@ -#!/usr/bin/env /links/application/dsu/.bds/bds - -/* The BDS automatic command line parsing allows the control on what to run -* bds yoda_analysis.bds -reRun true -latestFolder /home/sbsuser/yoda/150304_M01761_0119_000000000-ADTAN -* -* For trying out what would run use the dryRun flag: -* bds -c /links/application/dsu/.bds/bds.config -dryRun -s ssh yoda_analysis.bds -reRun \ -* -latestFolder /home/sbsuser/yoda/150304_M01761_0119_000000000-ADTAN \ -* -runReadRTATimestamp -runSampleSheetCreation -runTriggerBcl2fastq -runDemultiplexStats -runRsyncOnDemux -* -runRsyncFlowcell -runCreateFastqc -runBarcodeDistribution -runRsyncDemux -*/ - -bool reRun -bool runReadRTATimestamp -bool runSampleSheetCreation -bool runTriggerBcl2fastq -bool runDemultiplexStats -bool runRsyncFlowcell -bool runCreateFastqc -bool runAggregateFastqc -bool runBarcodeDistribution -bool runRsyncDemultiplexedFiles -bool runRsyncLaneStatictics -bool runBowtie -bool runReadJSON -bool runChecksums -bool debugRun -string sequencer -string latestFolder -string [] laneList -int mismatches - -runBase := "/links/shared/dsu/runs/$sequencer" - -if (latestFolder.isEmpty()) { - latestFolder = getLatestFolder(runBase) -} - -analysisStarted := "$latestFolder" + "/Analysis.started" -analysisFinished := "$latestFolder" + "/Analysis.finished" -runCompleted := "$latestFolder" + "/RTAComplete.txt" - -dss := "/links/shared/dsu/dss" - -# Drop boxes paths -rtaIncoming := "$dss/v2_read-rta-timestamp" -flowCellData := "$dss/v2_register-flowcell" -unalignedData := "$dss/v2_register-flowlane" -# is set in the function depending on the run -#demuxData := "$dss/v2_read-demultiplex-stats-miseq-hiseq" -fastqcData := "$dss/v2_register-fastqc" -fastqcAggregateData := "$dss/v2_register-fastqc-aggregate" -barcodeDistData := "$dss/v2_register-undetermined" -reportsData := "$dss/v2_register-demuliplex-stats" - -demultiplexedFolder := "demultiplexed" -marker := ".MARKER_is_finished_" -#marker := ".MARKER_" -samplePrefix := "BSSE_QGF_" - -if (!latestFolder.exists()) { - print("Folder $latestFolder does not exist!\n") - exit 0 -} - -string fcName -runFolderName := latestFolder.baseName() -print("Runfolder: $runFolderName\n") - -splits := runFolderName.split("_") - -if (splits[3].startsWith("000")) { - fcName = splits[3] -} -else { - fcName = splits[3].substr(1) -} - -print("Flowcell: $fcName\n") -string model = get_model(splits[1]) -print("Model: $model\n") -bool {} taskList - -# ----------------------------------------------------------------------------- -# Pre-Checks - -if (reRun) { - removeOutputFiles() - if (laneList.isEmpty()) { - taskList = {"runReadRTATimestamp" => true, \ - "runSampleSheetCreation" => true, \ - "runTriggerBcl2fastq" => true, \ - "runDemultiplexStats" => true, \ - "runRsyncDemultiplexedFiles" => true, \ - "runRsyncFlowcell" => true, \ - "runCreateFastqc" => true, \ - "runAggregateFastqc" => true, \ - "runBowtie" => true, \ - "runBarcodeDistribution" => true, \ - "runRsyncLaneStatictics" => true,\ - "runReadJSON" => true, \ - "runChecksums" => true, \ - "debugRun" => debugRun} - } - else { - taskList = {"runReadRTATimestamp" => false, \ - "runSampleSheetCreation" => true, \ - "runTriggerBcl2fastq" => true, \ - "runDemultiplexStats" => true, \ - "runRsyncDemultiplexedFiles" => true, \ - "runRsyncFlowcell" => true, \ - "runCreateFastqc" => true, \ - "runAggregateFastqc" => true, \ - "runBarcodeDistribution" => true, \ - "runBowtie" => false, \ - "runRsyncLaneStatictics" => true, \ - "runReadJSON" => true, \ - "runChecksums" => true, \ - "debugRun" => true} - } -} -else { - taskList = {"runReadRTATimestamp" => runReadRTATimestamp, \ - "runSampleSheetCreation" => runSampleSheetCreation, \ - "runTriggerBcl2fastq" => runTriggerBcl2fastq, \ - "runDemultiplexStats" => runDemultiplexStats, \ - "runRsyncDemultiplexedFiles" => runRsyncDemultiplexedFiles, \ - "runRsyncFlowcell" => runRsyncFlowcell, \ - "runCreateFastqc" => runCreateFastqc, \ - "runAggregateFastqc" => runAggregateFastqc, \ - "runBowtie" => runBowtie, \ - "runBarcodeDistribution" => runBarcodeDistribution, \ - "runRsyncLaneStatictics" => runRsyncLaneStatictics, \ - "runReadJSON" => runReadJSON, \ - "runChecksums" => runChecksums, \ - "debugRun" => debugRun} -} - -print("taskList\n$taskList\n") - -if (analysisStarted.canRead() && (!taskList{"debugRun"})) { - print("Analysis already started/done for flowcell $runFolderName\n") - exit 0 -} - -if ( runCompleted.canRead() ) { - print ("Run is complete, found: $runCompleted\n" ) - analysisStarted.write("Started: " + getDate()) - startAnalysis("$fcName", "$model") -} - -# -------------------------------------------------------------------------- -# Helper functions - -string getLatestFolder (string runBase) { - - string [] runFolderList - - folderList := runBase.dir("*") - for (string folder : folderList) { - fullfolder := "$runBase/$folder" - Analysisstarted := "$fullfolder/" + "Analysis.started" - runComplete := "$fullfolder/" + "RTAComplete.txt" - if (fullfolder.isDir() && !Analysisstarted.exists() && runComplete.exists()) { - runFolderList.add(fullfolder) - } - } - print("Run Folders to consider: " + "$runFolderList\n") - - string latestFolder = "does_not_exist" - - if (runFolderList.size() > 0 ) { - runFolderList.sort() - reversedList := runFolderList.reverse() - latestFolder = reversedList.pop() - } - - return latestFolder -} - -void removeOutputFiles() { - - print "Removing files...\n" - - for (int i=1; i < 9; i++) { - oldDemuxFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$i" - print("Removing $oldDemuxFolder\n") - string demuxTaskID task ( canFail := true, cpus := 1 ){ - sys rm -rf "$oldDemuxFolder" - } - wait demuxTaskID - } - - string markerTaskId task (canFail := true, cpus := 4 ){ - sys rm -f "$analysisStarted" - sys rm -f "$analysisFinished" - } - wait markerTaskId - sleep(30) - sys rm -f "$analysisStarted" -} - -string cleanString (string toClean) { - return toClean.replace("-", "_") -} - - -string [] getLaneNumbers (string searchFolder, string fileRegex) { - # try to figure out which lanes are present and returns the result as a string list - - string [] listOfLanes - fileList := searchFolder.dir(fileRegex) - # print("$searchFolder\n") - # print("$fileRegex\n") - - for (string aFile : fileList) { - string lane - - splittedName := aFile.split("_") - # print("splittedName") - # print(splittedName) - - # 'Regular case': Undetermined_S0_L003_R1_001.fastq.gz - if (splittedName[2].startsWith("L00") || splittedName[0].startsWith("BSSE")) { - splitSize := splittedName.size() - lane = splittedName[splitSize-3].substr(3,4) - } - # Assuming that Illumina leaves out the Lane - # information when there using the option "--no-lane-splitting" - # with bcl2fastq - else { - lane = "1" - } - if (!listOfLanes.has(lane) && !lane.isEmpty()) { - listOfLanes.add(lane) - } - } - return listOfLanes -} - -int extractLaneNumberfromRunInfo () { - - string laneCount = sys /bin/grep LaneCount "$latestFolder/RunInfo.xml" | /bin/awk '{ print $2 }' | /usr/bin/tr -dc '0-9' - - laneCountInt := laneCount.parseInt() - if (model == "NEXTSEQ_500") { - laneCountInt = 1 - } - return laneCountInt -} - - -string get_model(string machineId) { - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - - if (machineId.startsWith("NS")) model = "NEXTSEQ_500" - else if (machineId.startsWith("M")) model = "MISEQ" - else if (machineId.startsWith("D")) model = "HISEQ_2500" - else if (machineId.startsWith("SN")) model = "HISEQ_2000" - else if (machineId.startsWith("J")) model = "HISEQ_3000" - else if (machineId.startsWith("K")) model = "HISEQ_4000" - else if (machineId.startsWith("ST")) model = "HISEQ_X" - else model = "UNIDENTIFIED" - - return model -} - -void rsyncRunFolder (string[] rsyncParameters, string source, string targetFolder, string markerFile) { - targetFolder.mkdir() - source.trim() - joinedParameters := rsyncParameters.join() - print("rsync $joinedParameters $source $targetFolder\n") - - string taskId = task /usr/bin/rsync $joinedParameters $source $targetFolder - wait taskId - if (!markerFile.isEmpty()) { - task touch "$markerFile" - } -} - -int[] buildLaneList(string [] laneList) { - """ - Builds a list of lanes which need to be processed. Could be all lanes or a subset which is - given by a parameter. - """ - - int [] laneListInt - if (laneList.isEmpty()) { - int [] laneList - int laneCount = extractLaneNumberfromRunInfo() - for (int i=1; i < laneCount + 1; i++) { - laneListInt.add(i) - } - } - else { - for (string lane : laneList) { - laneListInt.add(lane.parseInt()) - } - } - return laneListInt -} - - -# -------------------------------------------------------------------------- - -void startAnalysis (string fcName, string model) { - - # Main function - - int laneCount = extractLaneNumberfromRunInfo() - int [] laneListInt - - laneListInt = buildLaneList(laneList) - - print("laneListInt: " + "$laneListInt\n") - - # Read RTA timestamp - if (taskList{"runReadRTATimestamp"}) { - rsyncRunFolder(["-a"], \ - "$runCompleted", \ - "$rtaIncoming/$runFolderName", \ - "$rtaIncoming/$marker$runFolderName") - } - - # Read the JSON created with illuminate - if (taskList{"runReadJSON"}) { - triggerRunReadJSON() - } - - # Create a sample sheet from data from openBIS - if (taskList{"runSampleSheetCreation"}) { - sampleSheetName := triggerSampleSheetCreation() - } - - # Start Demultiplexing for lanes - if (taskList{"runTriggerBcl2fastq"}) { - triggerBcl2fastq(model, laneListInt, mismatches) - } - - # html demultiplexing overview - if (taskList{"runDemultiplexStats"}) { - triggerDemultiplexStats(laneListInt) - } - - if (taskList{"runChecksums"}) { - max_jobs := 15 - if ((model != "MISEQ") || (model != "NEXTSEQ_500")){ - max_jobs = 8 - } - triggerChecksums(max_jobs, laneListInt) - } - - # Rsync Flow Cell Raw Data - if (taskList{"runRsyncFlowcell"}) { - # sys mkdir "$flowCellData/$runFolderName" - rsyncRunFolder (["-a", \ - "--exclude='*.cif'", \ - "--exclude='*.FWHMMap'", \ - "--exclude='demultiplexed*'", \ - "--exclude='Images'", \ - "--exclude='L00*'", \ - "--exclude='fastqc'", \ - "--exclude='*_pos.txt'"], \ - "$latestFolder", \ - "$flowCellData", \ - "$flowCellData/$marker$runFolderName") - } - - if (taskList{"runCreateFastqc"}) { - createFastqc (laneListInt) - } - - if (taskList{"runAggregateFastqc"}) { - aggregateFastqc (laneListInt) - } - - # run in parallel - par { - if (taskList{"runBarcodeDistribution"}) { - # We skip this for now as we have the stats in the bcl2fastq - barcodeDistribution (laneListInt) - } - if (taskList{"runBowtie"}) { - bowtie () - } - } - wait - - # Rsync the demultiplexed files: Register flow_lane - if (taskList{"runRsyncDemultiplexedFiles"}) { - rsyncDemultiplexedFiles(laneListInt) - if (model == "MISEQ") { - sleep(600) - } - else { - sleep(1) - } - } - - # Sync Statistic for Flowcell and Lane statistic - if (taskList{"runRsyncLaneStatictics"}) { - rsyncLaneStatictics(laneListInt) - - # Ugly hack to ensure that the data have been registered and we can set the properties - #if ((model != "MISEQ") || (model != "NEXTSEQ_500")){ - sleep(7200) - rsyncLaneStatictics(laneListInt) - #} - } - - - if (!taskList{"debugRun"}) { - analysisFinished.write("Finished: " + getDate()) - send_mail ("Sequencer $sequencer: Analysis finished", "Analysis for flow cell $fcName is finished.") - } - -} - -/* --------------------------------------------------------------------------*/ - -string triggerSampleSheetCreation() { - createSampleSheetBinary := "/links/application/dsu/createSampleSheet/createSampleSheet_bcl2fastq.sh" - - splits := runFolderName.split("_") - SampleSheetName := "SampleSheet_" + "$fcName" + ".csv" - - task $createSampleSheetBinary \ - -f $fcName \ - -o $latestFolder \ - -s - wait - return SampleSheetName -} - - -void triggerBcl2fastq (string model, int [] laneList, int mismatches) { - - bcl2fastqBinary := "/usr/local/bin/bcl2fastq" - string laneSplitting - print("Starting demultiplexing using bcl2fastq\n") - - if (model == "NEXTSEQ_500") { - # just appending the option - bcl2fastqBinary += " --no-lane-splitting " - } - - print("laneList" + "$laneList\n") - - for(int lane : laneList) { - sampleSheetName := "SampleSheet_" + "$fcName" + "_" + "$lane" + ".csv" - outDir := "$latestFolder/$demultiplexedFolder" + "_" + "$lane" - nohupFile := "$latestFolder/" + "nohup_" + "$runFolderName" + "_" + "$lane" + ".txt" - - task ( cpus := 8 ) { - sys /usr/bin/nohup $bcl2fastqBinary \ - --with-failed-reads \ - --ignore-missing-bcls \ - --ignore-missing-controls \ - --ignore-missing-positions \ - --ignore-missing-filter \ - --no-bgzf-compression \ - --barcode-mismatches $mismatches \ - --runfolder-dir $latestFolder \ - --input-dir $latestFolder/Data/Intensities/BaseCalls \ - --output-dir $outDir\ - --min-log-level DEBUG \ - --sample-sheet $latestFolder/$sampleSheetName \ - > $nohupFile 2>> $nohupFile - } - wait - } -} - - -void triggerDemultiplexStats (int [] laneCount) { - - print("triggerDemultiplexStats: laneCount: " + "$laneCount") - - binary := "/home/sbsuser/munge_demultiplex_files_bcl2fastq/source/mungeDemultiplexStats_bcl2fastq.py" - task python3.5 $binary \ - -p "$latestFolder" \ - -o "$reportsData/$runFolderName" - wait - sleep(5) - task touch "$reportsData/$marker$runFolderName" - - for(int lane : laneCount) { - - rsyncRunFolder (["-a"], \ - "$latestFolder/$demultiplexedFolder" + "_" + "$lane" + "/Reports", \ - "$reportsData/$runFolderName"+ "_" + "$lane", \ - "") - - rsyncRunFolder (["-a"], \ - "$latestFolder/$demultiplexedFolder" + "_" + "$lane" + "/Stats", \ - "$reportsData/$runFolderName"+ "_" + "$lane", \ - "$reportsData/$marker$runFolderName"+ "_" + "$lane") - } -} - - -void createFastqc (int [] laneCount) { - - fastqcBinary := "/links/application/dsu/Python-scripts/fastqc_plots_improved.py" - fastqcOutputFolder := "fastqc" - - for(int intLane : laneCount) { - - inputFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - outPutFolder := "$inputFolder/$fastqcOutputFolder" - - task python3.5 $fastqcBinary \ - --path $inputFolder \ - --outpath $outPutFolder \ - --regex "*.fastq.gz" \ - --debug - wait - - filesPerLane := outPutFolder.dir("*$intLane*.html") - print("$filesPerLane") - folderName := cleanString("$fcName") + "_" + "$intLane" - - newFastqcFolder := "$outPutFolder/$folderName" - newFastqcFolder.mkdir() - - for (string fastqcHtmlfile : filesPerLane) { - sys mv "$outPutFolder/$fastqcHtmlfile" "$newFastqcFolder" - } - - rsyncRunFolder (["-a"], \ - "$newFastqcFolder", \ - "$fastqcData", \ - "$fastqcData/$marker$folderName") - - } -} - - -void aggregateFastqc (int [] laneCount) { - - fastqc_aggregate_binary := "/links/application/dsu/fastqc-aggregation/fastqc_aggregate/fastqc_aggregate.py" - fastqcOutputFolder := "fastqc-aggregate" - folderName := fastqcOutputFolder + "_" + cleanString("$fcName") - outPutFolder := "$latestFolder$folderName" - - for(int intLane : laneCount) { - - inputFolder := "$latestFolder$demultiplexedFolder" + "_" + "$intLane/fastqc" - filename := cleanString("$fcName") + "_" + "$intLane" + ".html" - task python3.5 $fastqc_aggregate_binary --path $inputFolder --outpath $outPutFolder --filename "$filename" --ids M1,M2,M4,M5,M6,M8,M10 - } - wait - - rsyncRunFolder (["-a"], \ - "$outPutFolder", \ - "$fastqcAggregateData", \ - "$fastqcAggregateData/$marker$folderName") -} - - -void barcodeDistribution (int [] laneCount) { - - barcodeDistBinary := "/links/application/dsu/barcodeDistribution/source/barcodeDistribution.py" - - for(int intLane : laneCount) { - - searchFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - - listOfLanes := getLaneNumbers("$searchFolder", "*R1_001*.gz") - print("$listOfLanes\n") - string laneString - - # TODO distinguish between single lane and more lanes - if (listOfLanes.size() > 1) { - laneString = "L00" - } - else{ - laneString = "" - } - for (string lane : listOfLanes) { - outputFolder := cleanString("$fcName") + "_" + "$lane" - fullOutputfolder := "$barcodeDistData/$outputFolder" - regex := "Undetermined*$laneString$lane*R1*.fastq.gz" - fullOutputfolder.mkdir() - task (cpus := 2) { - sys python3.5 $barcodeDistBinary \ - -f $outputFolder \ - -p $searchFolder \ - -r $regex \ - -o $fullOutputfolder \ - -d - } - wait - task touch "$barcodeDistData/$marker$outputFolder" - } - wait - } -} - - -void rsyncDemultiplexedFiles (int [] laneCount) { - - for(int intLane : laneCount) { - - searchFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - nohupFile := "$latestFolder/" + "nohup_" + "$runFolderName" + "_" + "$intLane" + ".txt" - - listOfLanes := getLaneNumbers(searchFolder, "*R1_001*.fastq.gz") - print(listOfLanes) - debug(listOfLanes) - - string [] filesPerLane - - # just for the Undetermined - for (string lane : listOfLanes) { - string newFolderName = "Undetermined_" + cleanString(fcName) + "_" + lane - #Undetermined_000000000_AH4PH_1 - string newFolderPath = searchFolder + "/" + newFolderName - - # Assuming it is only one lane - if (listOfLanes.size() == 1 && listOfLanes[0] == 1) { - filesPerLane = searchFolder.dir("*.fastq.gz") - } - else { - filesPerLane = searchFolder.dir("*L00" + lane + "*.fastq.gz") - } - - newFolderPath.mkdir() - print("Created $newFolderPath\n") - - for (string fastqFile : filesPerLane) { - string moveAndLinkID task ( canFail := true, cpus := 1 ){ - # sys echo "$searchFolder/$fastqFile" "$searchFolder/$newFolderName" - sys [[ -f "$searchFolder/$fastqFile" ]] && mv "$searchFolder/$fastqFile" "$searchFolder/$newFolderName/" - sys [[ ! -f "$searchFolder/$fastqFile" ]] && ln -s "$searchFolder/$newFolderName/$fastqFile" "$searchFolder/$fastqFile" - } - } - sys chmod -R 774 "$newFolderPath" - - rsyncRunFolder (["-a"], \ - "$nohupFile", \ - "$unalignedData/$newFolderName", \ - "") - - rsyncRunFolder (["-a"], \ - "$newFolderPath", \ - "$unalignedData", \ - "$unalignedData/$marker$newFolderName") - } - - # BSSE_QGF_36104_000000000_AH4PH_1 - sampleDirList := searchFolder.dir("$samplePrefix*") - for( string sampleFolder : sampleDirList) { - sys chmod -R 774 "$searchFolder/$sampleFolder" - - rsyncRunFolder (["-a"], \ - "$searchFolder/$sampleFolder", \ - "$unalignedData", \ - "") - - rsyncRunFolder (["-a"], \ - "$nohupFile", \ - "$unalignedData/$sampleFolder", \ - "$unalignedData/$marker$sampleFolder") - } - } -} - - -void rsyncLaneStatictics (int [] laneCount) { - - print("Starting rsyncLaneStatictics with lanes $laneCount\n") - for(int intLane : laneCount) { - - conversionStatsFile := "ConversionStats.xml" - demuxFile := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" + "/Stats/$conversionStatsFile" - if (!demuxFile.canRead()) { - printErr("Cannot read $demuxFile") - } - else { - print("Found $demuxFile") - } - demuxData := "" - folder_splits := runFolderName.split("_") - if (folder_splits[1].startsWith("NS")) { - demuxData = "$dss/v2_read-demultiplex-stats-nextseq" - } - else { - demuxData = "$dss/v2_read-demultiplex-stats-miseq-hiseq" - } - - outputDir:= "$demuxData/$runFolderName" + "_" + "$intLane" - markerFile := "$demuxData/$marker" + "$runFolderName" + "_" + "$intLane" - - print("$demuxFile") - rsyncRunFolder (["-a"], \ - "$demuxFile", \ - "$outputDir", \ - "$markerFile") - } -} - - -void bowtie () { - - undeterminedPath := "$latestFolder/$demultiplexedFolder/Undetermined_indices/Sample_lane1" - bowtie2Binary := "/links/application/dsu/aligner/bowtie2/bowtie2" - bowtie2PhixIndices := "/links/application/dsu/Genomes/bowtie2_indexes/phix/phix" - r1 := "$undeterminedPath/lane1_Undetermined_L001_R1_001.fastq.gz" - r2 := "$undeterminedPath/lane1_Undetermined_L001_R2_001.fastq.gz" - - task ( cpus := 7 ) { - sys $bowtie2Binary \ - -p7 \ - -x $bowtie2PhixIndices \ - -1 $r1 \ - -2 $r2 2>"$undeterminedPath/bowtie2_outPE.txt" \ - -S "$undeterminedPath/bowtie2_phiX_mapped_reads_PE.sam" - } -} - -void triggerRunReadJSON() { - - monitoringBinary := "/links/application/dsu/monitor_Illumina/source/monitor.py" - v2_read_json_dropbox := "/home/sbsuser/dss/v2_read-json" - - task /usr/local/bin/python2.7 $monitoringBinary \ - --single $latestFolder \ - --calculate \ - --outpath $v2_read_json_dropbox - wait - task touch "$v2_read_json_dropbox/$marker$fcName" -} - -void triggerChecksums(int max_jobs, int [] laneCount) { - checksumBinary := "/links/application/dsu/crc32/create_checksum_file.sh" - - for(int intLane : laneCount) { - inputFolder := "$latestFolder/$demultiplexedFolder" + "_" + "$intLane" - task $checksumBinary $inputFolder $max_jobs - } - wait -} - - -string getDate() { - return sys date -} - -void send_mail (string subject, string message){ - mailList := "kohleman@ethz.ch cbeisel@ethz.ch" - #mailList := "kohleman@ethz.ch" - task echo "$message" | /usr/bin/mutt -s "$subject" $mailList -} diff --git a/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py b/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py deleted file mode 100644 index d44c5aafc9c..00000000000 --- a/deep_sequencing_unit/source/Jython/barcodeComplexityChecker.py +++ /dev/null @@ -1,62 +0,0 @@ -def checkBarcodes(): - ''' - 'parents' are a HashSet of SamplePropertyPE - ''' - VOCABULARY_INDEX1 = 'BARCODE' - VOCABULARY_INDEX2 = 'INDEX2' - - RED = set(['A', 'C']) - GREEN = set(['T', 'G']) - - SUCCESS_MESSAGE = "OK" - NO_INDEX = "No Index" - - listofIndices = [] - boolList = [] - positionList = [] - returnString = " " - - for e in entity.entityPE().parents: - for s in e.properties: - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX1: - index = s.getVocabularyTerm().code - - if len(listofIndices) > 0: - for n in range(0, len(index) - 1): - listofIndices[n].append(index[n]) - else: - for n in range(0, len(index) - 1): - listofIndices.append([index[n]]) - - # remove any duplicates - setofIndices = [set(list) for list in listofIndices] - - # Test whether every element in the set 's' is in the RED set - boolList = [setofNuc.issubset(RED) for setofNuc in setofIndices] - - if boolList: - for b in boolList: - if b: - positionList.append(boolList.index(b) + 1) - # set the value to False, because 'index' returns only the first occurrence - boolList[boolList.index(b)] = False - else: - return NO_INDEX - - # if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX2: - # pass - - if positionList: - for pos in positionList: - returnString += "WARNING! The following base position of " + \ - VOCABULARY_INDEX1 + \ - " does not have both color channels the index read: " + str(pos) + \ - "\n" - else: - returnString = SUCCESS_MESSAGE - - return returnString - -def calculate(): - """Main script function. The result will be used as the value of appropriate dynamic property.""" - return checkBarcodes() diff --git a/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py b/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py deleted file mode 100644 index d77c5c5f062..00000000000 --- a/deep_sequencing_unit/source/Jython/createInvoices_Illumina_NGS.py +++ /dev/null @@ -1,614 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Copyright 2013 ETH Zuerich, CISD - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author Manuel Kohler - -@description: -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -@attention: -Runs under Jython - -@note: - -''' - -import os -import re -import sys -import logging -from datetime import * -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from java.util import TreeMap -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption -from ch.systemsx.cisd.openbis.generic.shared.dto import NewRoleAssignment - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -# This list is imply used to keep the order of elements of the 'columnHeadersMap' -columnHeadersList = ["EXTERNAL_SAMPLE_NAME", "BARCODE", "INDEX2", "CONTACT_PERSON_NAME", - "BIOLOGICAL_SAMPLE_ARRIVED", "PREPARED_BY", "KIT", "QC_AT_DBSSE", - "CELL_PLASTICITY_SYSTEMSX", "PRICE", "NOTES"] - -columnHeadersMap = {"EXTERNAL_SAMPLE_NAME": "Sample Name", - "BARCODE": "Index", - "INDEX2": "Index2", - "PREPARED_BY" : "Prepared by", - "KIT" : "Kit", - "QC_AT_DBSSE" : "QC at D-BSSE", - "CONTACT_PERSON_NAME" : "Contact Person", - "NOTES" : "Notes", - "BIOLOGICAL_SAMPLE_ARRIVED": "Received", - "CELL_PLASTICITY_SYSTEMSX": "Cell Plasticity", - "PRICE" : "Price"} - -SAMPLETYPE = 'SAMPLETYPE' -EXTERNAL_SAMPLE_NAME = 'EXTERNAL_SAMPLE_NAME' -RUN_FOLDER_NAME = 'RUN_FOLDER_NAME' - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - - -class openbisRow (): - ''' - Represents a single row in an Excel file with the relevant properties, - code and pi are for internal organization - ''' - def __init__(self): - self.code = 'code' - self.pi = 'PRINCIPAL_INVESTIGATOR_NAME' - self.externalSampleName = 'EXTERNAL_SAMPLE_NAME' - self.index1 = 'INDEX1' - self.index2 = 'INDEX2' - self.preparedBy = 'PREPARED_BY' - self.kit = 'KIT' - self.qcAtBsse = 'QC_AT_DBSSE' - self.contactPersonName = 'CONTACT_PERSON_NAME' - self.notes = 'NOTES' - self.biologicalSampleArrived = 'BIOLOGICAL_SAMPLE_ARRIVED' - self.cellPlasticitySystemsX = '' - self.price = '' - - def __str__(self): - return "code: %s, pi: %s, externalSampleName: %s, index1: %s, index2: %s, preparedBy: %s, kit: %s," \ - " qcAtBsse: %s, contactPersonName: %s, notes: %s, biologicalSampleArrived: %s," \ - " cellPlasticitySystemsX: %s, price: %s" \ - % (self.code, self.pi, self.externalSampleName, self.index1, self.index2, self.preparedBy, self.kit, - self.qcAtBsse, self.contactPersonName, self.notes, self.biologicalSampleArrived, - self.cellPlasticitySystemsX, self.price) - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d-%B-%Y") - -def setFont(wb, configDict, fontSize=10): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(configDict["defaultFonts"]) - font.setItalic(False) - font.setStrikeout(False) - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - -def getVocabulary(service, vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - -def writeExcel(myoptions, configDict, service, piName, piDict, - piSpace, flowCellProperties, flowcell, logger, - listOfCodeList, listOfPropertyDicts, format="xls"): - - ''' - Writes out all data to an Excel file - ''' - myRows = uniqueRow() - sequencerVocabulary = getVocabulary(service, "SEQUENCER") - setOfFlowcells = set () - - def getValueOrEmptyString (key, myDict): - if key in myDict: - return myDict[key] - else: - return '' - - def writeHeader(): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(configDict["facilityName"] + ", " + configDict["facilityInstitution"]) - row.getCell(0).setCellStyle(setFont(wb, configDict, 10)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, configDict, 10)) - - def createRow(key="", value="", rowNumber=0, fontSize=10): - ''' - ''' - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, configDict, fontSize)) - row.getCell(1).setCellStyle(setFont(wb, configDict, fontSize)) - return row - - def writeFooter(service, sheet): - footer = sheet.getFooter() - footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(configDict["facilityNameShort"]) - # 3/2 = 150 percent magnification when opening the workbook - sheet.setZoom(3, 2) - - writeHeader() - createRow("Principal Investigator", piName.replace("_", " ")) - createRow("Data Space", piSpace) - createRow("Run Folder Name", getValueOrEmptyString(RUN_FOLDER_NAME, flowCellProperties)) - createRow() - - myColumns = uniqueColumn() - - sampleHeader = sheet.createRow(myRows.getNextRow()) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flow Cell:Lane") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - for c in columnHeadersList: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(columnHeadersMap[c]) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - listofLanes = piDict[piName] - listofLanes.sort() - logger.debug(listofLanes) - - for lane in listofLanes: - singleSampleColumns = uniqueColumn() - - sampleCodeForInvoicing = [] - - for code in listOfCodeList[lane-1]: - logger.info ('Processing: ' + code) - sampleProperties = listOfPropertyDicts[lane-1][code] - - if (sampleProperties[SAMPLETYPE] == configDict['masterTypeName']): - newRow.biologicalSampleArrived = getValueOrEmptyString(newRow.biologicalSampleArrived, sampleProperties) - newRow.contactPersonName = getValueOrEmptyString(newRow.contactPersonName, sampleProperties) - newRow.pi = sanitizeString(getValueOrEmptyString(newRow.pi, sampleProperties)) - - if (newRow.pi != piName): - logger.info('This is a shared lane.Lane PI and sample PI are not the same. We do not write ' - 'the row to the Excel file') - continue - - logger.info('Excel Sheet line: ') - logger.info(newRow) - - rowN = sheet.createRow(myRows.getNextRow()) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(flowcell + ":" + str(lane)) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - #Code Sample Name Index Index2 Contact Person Received Prepared by Kit QC at D-BSSE Cell Plasticity Price Notes - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.code) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.externalSampleName) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.index1) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.index2) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.contactPersonName) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.biologicalSampleArrived) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.preparedBy) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.kit) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.qcAtBsse) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.cellPlasticitySystemsX) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.price) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(newRow.notes) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configDict, 10)) - - # if the LIBRARY has no External Name we try to take the one from the RAW sample - if (sampleProperties[SAMPLETYPE] == configDict['rawTypeName']): - if not newRow.externalSampleName: - newRow.externalSampleName = 'Raw Sample Name: ' + getValueOrEmptyString(EXTERNAL_SAMPLE_NAME, sampleProperties) - - if (sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']): - newRow = openbisRow() - sampleCodeForInvoicing.append(code) - - newRow.code = code - newRow.externalSampleName = getValueOrEmptyString(newRow.externalSampleName, sampleProperties) - newRow.index1 = getValueOrEmptyString(newRow.index1, sampleProperties) - newRow.index2 = getValueOrEmptyString(newRow.index2, sampleProperties) - newRow.preparedBy = getValueOrEmptyString(newRow.preparedBy, sampleProperties) - newRow.kit = getValueOrEmptyString(newRow.kit, sampleProperties) - newRow.qcAtBsse = getValueOrEmptyString(newRow.qcAtBsse, sampleProperties) - newRow.notes = getValueOrEmptyString(newRow.notes, sampleProperties) - - singleSampleColumns = uniqueColumn() - - createRow() - createRow("Flow Cell Details", "", 0, 14) - - createRow("Flow Cell", flowcell) - for property in flowCellProperties: - if (property == "SEQUENCER"): - val = sequencerVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - - createRow(property, val) - createRow() - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - sheet.getPrintSetup().setLandscape(True) - - writeFooter(service, sheet) - - # sanitizeString(piName) + datetime.now().strftime("_%d_%m_%Y.") + format - # Write the output to a file - fileName = myoptions.outdir + configDict["facilityNameShort"] + "_" + flowcell + "_" + \ - sanitizeString(piName) + "." + format - fileOut = FileOutputStream(fileName) - # need this print for use as an openBIS webapp - print fileName - - wb.write(fileOut); - fileOut.close(); - - return sampleCodeForInvoicing - -def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createInvoices' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseConfigurationFile(propertyFile='etc/service.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - EXCEL = 'EXCEL' - - logger.info('Reading config file') - configDict = {} - - configParameters = parseConfigurationFile() - configDict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configDict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configDict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configDict['mailList'] = configParameters.get(GENERAL, 'mailList') - configDict['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configDict['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configDict['separator'] = configParameters.get(GENERAL, 'separator') - configDict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configDict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configDict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configDict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configDict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configDict['pIPropertyName'] = configParameters.get(OPENBIS, 'pIPropertyName') - configDict['invoiceName'] = configParameters.get(OPENBIS, 'invoiceName') - configDict['sampleCodePrefix'] = configParameters.get(OPENBIS, 'sampleCodePrefix') - - configDict['illuminaFlowLaneTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowLaneTypeName') - configDict['libraryPoolTypeName'] = configParameters.get(OPENBIS, 'libraryPoolTypeName') - configDict['libraryTypeName'] = configParameters.get(OPENBIS, 'libraryTypeName') - configDict['rawTypeName'] = configParameters.get(OPENBIS, 'rawTypeName') - configDict['masterTypeName'] = configParameters.get(OPENBIS, 'masterTypeName') - - configDict['defaultFonts'] = configParameters.get(EXCEL, 'defaultFonts') - - return configDict - -def login(logger, configDict): - logger.info('Logging into ' + configDict['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - return service - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - - - -def getLaneAncestors(service, lane, logger): - ''' - Gets all ancestors and corresponding properties of a sample - ''' - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - dList = service.searchForSamples(sc, fetchOptions) - - def recursiveSamples(list, codeList, propertyDict): - ''' - Recursively walks through the sample tree and write the sample codes - to a list and the properties into a dictionary. The sample code is - the key, the properties are the values - ''' - - for element in list: - elementCode = element.getCode() - codeList.append(elementCode) - elementProperties = element.getProperties() - - tmpDict = {} - - for eP in elementProperties: - tmpDict[eP] = elementProperties[eP] - - tmpDict[SAMPLETYPE] = element.getSampleTypeCode() - tmpDict['SPACE'] = element.getSpaceCode() - propertyDict[elementCode] = tmpDict - - elementParents = element.getParents() - - if (elementParents.size() > 0): - recursiveSamples(elementParents, codeList, propertyDict) - - codeList = [] - propertyDict = {} - - recursiveSamples(dList, codeList, propertyDict) - - logger.debug(codeList) - logger.debug(propertyDict) - - return codeList, propertyDict - - -def getFLowcellData(service, configDict, flowcell, logger): - - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - fcList = service.searchForSamples(sc, fetchOptions) - - try: - assert fcList.size() == 1 - except AssertionError: - print (str(fcList.size()) + ' flow cells found which match.') - exit(1) - - for p in fcList: - flowCellProperties = p.getProperties() - - numberOfLanes = int(flowCellProperties['LANECOUNT']) - - piDict = {} - spaceDict = {} - invoiceDict = {} - listOfCodeList = [] - listOfPropertyDicts = [] - - for lane in range(1, numberOfLanes + 1): - myLane = flowcell + ":" + str(lane) - codeList, propertyDict = getLaneAncestors(service, myLane, logger) - listOfCodeList.append(codeList) - listOfPropertyDicts.append(propertyDict) - - for code in codeList: - sampleProperties = propertyDict[code] - logger.debug ('Processing ' + code) - - if (sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']): - invoiceProperty = sampleProperties[configDict['invoiceName']] - # if sample got created via Excel upload, the property could be not set, which is represented by None - if (invoiceProperty is None): - invoiceProperty = 'false' - sentInvoice = {'true': True, 'false': False}.get(invoiceProperty.lower()) - - if (sampleProperties[SAMPLETYPE] == configDict['masterTypeName']): - pi = sanitizeString(sampleProperties[configDict['pIPropertyName']]) - logger.debug("PI for " + code + ": " + pi) - logger.debug("Invoice sent for " + code + ": " + str(sentInvoice)) - - if piDict.has_key(pi): - piDict[pi].append(lane) - # Making the lanes unique - piDict[pi] = list(set(piDict[pi])) - else: - piDict[pi] = [lane] - - if not sentInvoice: - if invoiceDict.has_key(pi): - invoiceDict[pi].append(lane) - # Making the lanes unique - invoiceDict[pi] = list(set(invoiceDict[pi])) - else: - invoiceDict[pi] = [lane] - - spaceDict[pi] = sampleProperties['SPACE'] - - logger.debug(spaceDict) - - logger.info("Found the following PIs on the lanes: ") - logger.info(piDict) - logger.info("Found the following PIs with non-invoiced samples : ") - logger.info(invoiceDict) - - # simply sort the hashmap - treeMap = TreeMap (flowCellProperties) - return piDict, treeMap, spaceDict, invoiceDict, listOfCodeList, listOfPropertyDicts - - -''' -Main script -''' - -def main(): - - # for now setting the format by hand - format = "xlsx" - magicString = "@Invoice@" - - logger = setUpLogger('log/') - logger.info('Started Creation Invoices...') - - myoptions = parseOptions(logger) - configDict = readConfig(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - service = login(logger, configDict) - flowcellName = myoptions.flowcell - piDict, flowCellProperties, spaceDict, invoiceDict, listOfCodeList, listOfPropertyDicts =\ - getFLowcellData(service, configDict, flowcellName, logger) - - piSampleCodeDict = {} - - for piName in piDict: - # create an Excel file for each PI - sampleCodeForInvoicing = writeExcel(myoptions, configDict, service, piName, piDict, - spaceDict[piName], flowCellProperties, flowcellName, logger, - listOfCodeList, listOfPropertyDicts, format) - - piSampleCodeDict[piName] = sampleCodeForInvoicing - - for invoicePi in invoiceDict: - tmpString = magicString + invoicePi - for samplecode in piSampleCodeDict[invoicePi]: - tmpString = tmpString + '#' + samplecode - print tmpString - - service.logout() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet.py b/deep_sequencing_unit/source/Jython/createSampleSheet.py deleted file mode 100644 index 4165e800ac8..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet.py +++ /dev/null @@ -1,702 +0,0 @@ -''' -@copyright: -Copyright 2014 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def createDemultiplexCommands(myoptions, configMap, laneIndexDict, endType, cycles, lane, - myFileName, indexRead1Length, indexRead2Length): - ''' - Builds up a command line for the demultiplexing of a single flow lane - ''' - - newline = lineending[myoptions.lineending] - indexlength = laneIndexDict[lane][0] - if laneIndexDict[lane][1] == 'DUALINDEX': - basesMask = 'Y' + cycles + COMMA + 'I' + str(indexlength / 2) + 'n' + COMMA + 'I' + \ - str(indexlength / 2) + 'n' - else: - basesMask = 'Y' + cycles + COMMA + 'I' + str(indexlength) + (indexRead1Length - indexlength + 1)*'n' - if endType == 'PAIRED_END': - basesMask = basesMask + COMMA + 'Y' + cycles - return ([' '.join([configMap['configureBclToFastqPath'], configMap['failedReads'], - configMap['clusterCount'], configMap['clusterCountNumber'], - configMap['outputDir'], '../../../Unaligned_' + str(lane), configMap['sampleSheetName'], - myFileName, configMap['baseMask'], basesMask, "--no-eamss", newline])]) - -def createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, - logger, myoptions): - ''' - Builds up a dictionary with all entries in the Sample Sheet - ''' - sampleSheetDict = {} - laneIndexDict = {} - # the illlumina pipeline uses always one base less than the sequencer is sequencing - DEMULTIPLEX_INDEX_LENGTH_PENALTY = -1 - - logger.debug (parentDict) - logger.debug(samplesPerLaneDict) - - # Making sure the header is always a the top of the file - sampleSheetDict[u'!'] = ([configMap['hiSeqHeader']]) - endType = flowCellDict[configMap['endType']] - cycles = flowCellDict[configMap['cycles']] - - index1Name = configMap['index1Name'] - index2Name = configMap['index2Name'] - - indexRead1Length = int(flowCellDict[configMap['index1Length']]) + DEMULTIPLEX_INDEX_LENGTH_PENALTY - try: - indexRead2Length = int(flowCellDict[configMap['index2Length']]) + DEMULTIPLEX_INDEX_LENGTH_PENALTY - except: - pass - - for key in parentDict.keys(): - index = '' - dualIndex = False - lane = parentDict[key]['LANE'][-1:] - - if index1Name in parentDict[key] and indexRead1Length > 0 and (parentDict[key])[index1Name] != 'NOINDEX': - index = parentDict[key][index1Name][0:indexRead1Length] - - if index2Name in parentDict[key] and indexRead2Length > 0 and (parentDict[key])[index2Name] != 'NOINDEX': - index = index + configMap['indexSeparator'] + parentDict[key][index2Name][0:indexRead2Length] - dualIndex = True - - # little hack to make the non-indexed control lane and non-indexed runs also part of - # the sample sheet - # eventually hide in a function - - if len(index) == 0: - # more than one samples in an non-indexed lane - if samplesPerLaneDict[lane] > 1: - # if it is not a PhiX and not a Pool Sample - if (parentDict[key]['NCBI_ORGANISM_TAXONOMY'] != '10847') and parentDict[key]['BARCODE_COMPLEXITY_CHECKER'] == 'No Pool': - # then just use this sample and skip the others if there are more - samplesPerLaneDict[lane] = 0 - index = ' ' - - # only one non-indexed sample in the lane - elif samplesPerLaneDict[lane] == 1: - index = ' ' - - - # Set flag if this lane is a control lane. has no influence on the result, but makes reading - # the demultiplex statistics easier - try: - if lane == flowCellDict[configMap['controlLane']]: - control = 'Y' - else: - control = 'N' - except: - control = 'N' - - if len(index) > 0: - sampleSheetDict[lane + '_' + key] = [flowCellName + COMMA - + lane + COMMA - + key + COMMA - + parentDict[key][configMap['ncbi']] + COMMA - + index + COMMA - + sanitizeString(parentDict[key][configMap['externalSampleName']]) + COMMA - + control + COMMA - + endType + '_' + cycles + COMMA - + configMap['facilityInstitution'] + COMMA - + key.split('_', 3)[-1] - ] - - sampleEndType = 'DUALINDEX' if dualIndex else 'SINGLEINDEX' - laneIndexDict[int(lane)] = [len(index), sampleEndType] - - sortedSampleSheetList = sampleSheetDict.keys() - sortedSampleSheetList.sort() - - # if single lane demultiplexing is activated - if myoptions.singlelane: - demultiplexCommandList = [] - for lane in range(1, int(flowCellDict[configMap['laneCount']]) + 1): - laneSeparatedList = [sample for sample in sortedSampleSheetList if sample[0] == str(lane)] - # Making sure the header is also included at the top - laneSeparatedList.insert(0, u'!') - logger.debug(laneSeparatedList) - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + str(lane) + '_' + \ - flowCellName + '.csv' - - demultiplexCommandList.append(createDemultiplexCommands(myoptions, configMap, laneIndexDict, - endType, cycles, lane, myFileName, indexRead1Length, indexRead2Length)) - SamplesheetFile = writeSampleSheet(myoptions, logger, sampleSheetDict, laneSeparatedList, - fileName=myFileName) - writeDemultiplexCommandList(logger, demultiplexCommandList, - fileName=myoptions.outdir + flowCellName + '_DemultiplexCommandList.txt') - pickleDemultiplexCommandList(logger, demultiplexCommandList, - fileName=myoptions.outdir + flowCellName + '_DemultiplexCommandList.pickle') - else: - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - writeSampleSheet(myoptions, logger, sampleSheetDict, sortedSampleSheetList, - fileName=myFileName) - return sampleSheetDict, myFileName - -def writeDemultiplexCommandList(logger, demultiplexCommandList, - fileName): - try: - with open(fileName, 'wb') as demuxFile: - for listElement in demultiplexCommandList: - demuxFile.write(*listElement) - - logger.info('Writing file ' + fileName) - print('Written ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - - -def writeSampleSheet(myoptions, logger, sampleSheetDict, sortedSampleSheetList, fileName): - ''' - Writes the given dictionary out to a csv file. The additional list is sorted and is used to write - the dictionary in a sorted order. - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'w') as sampleSheetFile: - for listElement in sortedSampleSheetList: - if myoptions.verbose: - print sampleSheetDict[listElement][0] - sampleSheetFile.write(sampleSheetDict[listElement][0] + newline) - - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - - - -def createMiSeqSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - sampleSheetDict = {} - headerList = [] - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%d.%m.%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + '') - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) -# if ('nextera' in (separator + parentDict.itervalues().next()['KIT'].lower())): -# headerList.append(configMap['nexteraAdapter']) -# if ('truseq' in (separator + parentDict.itervalues().next()['KIT'].lower())): -# headerList.append(configMap['truSeqAdapter']) - headerList.append('') - - miSeqDataSection = configMap['miSeqDataSection'].split(',') - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if configMap['index1Name'] not in parentDict[key]: - continue - - - index1 = parentDict[key][configMap['index1Name']] - index2 = parentDict[key][configMap['index2Name']] - - sampleSheetDict[lane + '_' + key] = [key + separator - + sanitizeString(parentDict[key][configMap['externalSampleName']]) + separator - + separator - + separator - + index1Vocabulary[index1] + separator - + index1 + separator - + index2Vocabulary[index2].split()[2] + separator - + index2 + separator - + separator - + key + '_' + flowCellName - ] - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - # take this variable from the FlowCellDict - - #flowCellName = foundFlowCell.getCode().split('_')[3][1:] - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - else: - flowCellName = flowCellName.split('_')[3][1:] - - flowCellDict = convertSampleToDict(foundFlowCell) - - logger.debug(flowCellDict) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - -# for hiseq in hiseqList: -# if hiseq in runFolderName: -# logger.info('Detected HiSeq run.') -# SampleSheetFile = createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, -# logger, myoptions) -# break - - sampleSheetDict, SampleSheetFile = createHiseqSampleSheet(parentDict, flowCellDict, samplesPerLaneDict, flowCellName, configMap, - logger, myoptions) - logger.debug(sampleSheetDict) -# for miseq in miseqList: -# if miseq in runFolderName: -# logger.info('Detected MiSeq run.') -# index1Vocabulary = getVocabulary(configMap['index1Name'], service) -# index2Vocabulary = getVocabulary(configMap['index2Name'], service) -# SampleSheetFile = createMiSeqSampleSheet(parentDict, flowCellDict, configMap, -# index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) -# break - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheetTest.py b/deep_sequencing_unit/source/Jython/createSampleSheetTest.py deleted file mode 100644 index 0d8b17b4555..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheetTest.py +++ /dev/null @@ -1,186 +0,0 @@ -import unittest -from createSampleSheet import * -from optparse import OptionParser - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def setUpParser(self): - '''is there a more elegant way to mock parser object, except the v3.3 - unitest.mock object library?''' - - self.parser = OptionParser() - self.parser.add_option('--verbose', dest='verbose') - self.parser.add_option('--lineending', dest='lineending') - self.parser.add_option('--maillist', dest='maillist') - self.parser.add_option('--singlelane', dest='singlelane') - self.parser.add_option('--flowcell', dest='flowcell') - self.parser.add_option('--outdir', dest='outdir') - self.parser.add_option('--debug', dest='debug') - self.parser.verbose = False - self.parser.lineending = 'linux' - self.parser.maillist = False - self.parser.singlelane = False - self.parser.flowcell = '140127_SN792_0312_AC36DWACXX' - self.parser.outdir = './' - self.parser.debug = True - return self.parser - -class TestCreateHiseqSampleSheet(unittest.TestCase): - ''' - There are three cases currently covered: - Case1: PhiX and one or more other non-barcoded samples in a lane -> only one sample in the Sample Sheet - Case2: PhiX and one ore more barcoded samples in a lane -> all samples but PhiX in the Sample Sheet - Case3: PhiX in a lane -> Phix in the Sample Sheet - - Also no Pools are allowed these are only relevant for the lab - ''' - - def setUp(self): - - self.parser = setUpParser(self) - self.logger = setUpLogger('log/') - self.configMap = {'illuminaFlowCellTypeName':'ILLUMINA_FLOW_CELL', 'facilityName':'Quantitative Genomics Facility', 'index1Length':'INDEXREAD', 'clusterCountNumber':'50000000', 'connectionTimeout':60000, 'facilityInstitution':'ETHZ_D-BSSE', 'index1Name':'BARCODE', 'configureBclToFastqPath':'/usr/local/bin/configureBclToFastq.pl', 'smptHost':'smtp0.ethz.ch', 'miSeqApplication':'FASTQ Only', 'ncbi':'NCBI_ORGANISM_TAXONOMY', 'failedReads':'--with-failed-reads', 'nexteraAdapter':'Adapter,CTGTCTCTTATACACATCT', 'cycles':'CYCLES_REQUESTED_BY_CUSTOMER', 'miSeqChemistry':'Default', 'outputDir':'--output-dir', 'openbisUserName':'tracker', 'miSeqWorkflow':'GenerateFASTQ', 'openbisPassword':"*hsh8Fs['h9#$%^&", 'index2Length':'INDEXREAD2', 'mailFrom':'SampleSheetCreator@miseq.bsse.ethz.ch', 'hiSeqHeader':'FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject', 'externalSampleName':'EXTERNAL_SAMPLE_NAME', 'SampleSheetFileName':'SampleSheet', 'clusterCount':'--fastq-cluster-count', 'index2Name':'INDEX2', 'mailList':'manuel.kohler@bsse.ethz.ch', 'miSeqNames':'M00721 M00100', 'endType':'END_TYPE', 'miSeqSettingsSection':'[Settings], Adapter', 'facilityNameShort':'QGF', 'baseMask':'--use-bases-mask', 'miSeqReadsSection':'[Reads]', 'laneCount':'LANECOUNT', 'openbisServer':'http://openbis-dsu.bsse.ethz.ch:8080', 'iemFileVersion':'4', 'miSeqHeaderSection':'[Header], IEMFileVersion, Investigator Name, Project Name,Experiment Name, Date, Workflow, Application, Assay, Description, Chemistry', 'controlLane':'CONTROL_LANE', 'indexSeparator':'-', 'separator':',', 'hiSeqNames':'SN792 SN100', 'sampleSheetName':'--sample-sheet'} - - self.flowCellDict = {u'CONTROL_LANE':u'5', u'RUNNINGTIME':u'7 days, 18:25:19', u'SEQUENCER_FINISHED':u'2014-02-04 07:40:26 +0100', u'ILLUMINA_PIPELINE_VERSION':u'1.17.21.3', u'END_TYPE':u'SINGLE_READ', u'FLOW_CELL_SEQUENCED_ON':u'2014-01-27 13:15:07 +0100', u'INDEXREAD2':u'0', u'SBS_KIT':u'TruSeq SBS Kit v3', u'FLOWCELLTYPE':u'HiSeq Flow Cell v3', u'SEQUENCER':u'SN792', u'TILECOUNT':u'16', u'LANECOUNT':u'8', 'Name':u'140127_SN792_0312_AC36DWACXX', u'SEQUENCER_RUN_TIME':u'7.768', u'CYCLES_REQUESTED_BY_CUSTOMER':u'151', u'INDEXREAD':u'7', u'SWATHCOUNT':u'3', u'SURFACECOUNT':u'2', 'Project':u'2014.01'} - self.parentDict = {u'BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'402', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'10.1', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:2', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.65', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_34', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'363', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.1', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:7', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.57', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_38', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_19990_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'OK', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'DNA_CONCENTRATION_OF_LIBRARY':u'2', u'EXTERNAL_SAMPLE_NAME':u'Pool201_293', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'UL_EB_MISEQ':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u'0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_6':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:6', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'383', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 18.5', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'6.5', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:3', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 26.11', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_35', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 16.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.5', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 3.1'}, u'BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'385', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.9', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:4', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 39.56', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_36', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 18.0', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.0'}, u'BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'581', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 48.4', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'23.4', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG':u'2000', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE':u'GTGAAAC', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u' 61.96', u'CONCENTRATION_ORIGINAL_ILLUMINA':u'38.3', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME':u'293', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'UL_EB_MISEQ':u' 46.8', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.6', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_STOCK':u'50', u'UL_DNA_MISEQ':u' 3.2'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_7':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:7', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_8':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:8', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_2':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:2', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'375', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.5', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'3', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CREATED_ON_CS':u'2014-01-08 12:00:00 +0100', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:1', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 38.97', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in, this pool as test on SR50 first', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_33', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'UL_EB_MISEQ':u' 17.9', u'KIT':u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.1'}, u'BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5':{u'QC_AT_DBSSE':u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'564', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 48.9', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CONCENTRATION_PREPARED_ILLUMINA':u'33.3', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG':u'2000', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'KIT_PREPARED':u'2013-12-09 12:00:00 +0100', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'2', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'END_TYPE':u'SINGLE_READ', u'BARCODE':u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:5', u'PREPARED_BY':u'Ina', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'NM_DNA':u' 90.83', u'CONCENTRATION_ORIGINAL_ILLUMINA':u'58.2', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME':u'201', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-05 12:00:00 +0100', u'UL_EB_MISEQ':u' 47.8', u'KIT':u'NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.1', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_STOCK':u'50', u'UL_DNA_MISEQ':u' 2.2'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_3':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:3', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'373', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.2', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'12.2', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:6', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 50.32', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_37', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'KIT':u'NONE', u'UL_EB_MISEQ':u' 18.4', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 0.8', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 1.6'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_4':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:4', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16028_140127_SN792_0312_AC36DWACXX_1':{u'QC_AT_DBSSE':u'false', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u'0', u'FLOW_CELL_PROPERTIES':u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'24', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'ina.nissen@bsse.ethz.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:1', u'LOT':u'9306315', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Ina Nissen', u'NM_DNA':u'0', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'PRINCIPAL_INVESTIGATOR_NAME':u'Christian Beisel', u'AFFILIATION':u'OTHER', u'EXTERNAL_SAMPLE_NAME':u'PhiX', u'KIT':u'NONE', u'UL_EB_MISEQ':u'0', u'UL_DNA':u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS':u'0', u'SAMPLE_KIND':u'GENOMIC_DNA', u'UL_DNA_MISEQ':u'0'}, u'BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8':{u'QC_AT_DBSSE':u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA':u'361', u'UNIQUE_BARCODES':u'OK', u'UL_EB':u' 19.0', u'FLOW_CELL_PROPERTIES':u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 151\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA':u'9.6', u'CELL_PLASTICITY_SYSTEMSX':u'false', u'NCBI_ORGANISM_TAXONOMY':u'481459', u'CONCENTRATION_FLOWLANE':u'12', u'LIBRARY_PROCESSING_SUCCESSFUL':u'false', u'HOW_OFTEN_SEQUENCED':u'1', u'CYCLES':u'157', u'BAREBACKED':u'false', u'SEQUENCING_APPLICATION':u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION':u'CBOT', u'END_TYPE':u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER':u'No Pool', u'CONTACT_PERSON_EMAIL':u'marius.roesti@unibas.ch', u'INVOICE':u'false', 'LANE':u'140127_SN792_0312_AC36DWACXX:8', u'CLUSTER_GENERATION_KIT_VERSION':u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY':u'Marius', u'LIBRARY_PROCESSING_FAILED':u'false', u'CONTACT_PERSON_NAME':u'Marius R\xf6sti', u'REQUIRED_LANES':u'1', u'NM_DNA':u' 40.91', u'CYCLES_REQUESTED_BY_CUSTOMER':u'150', u'LIBRARY_PROCESSING_POSSIBLE':u'false', u'NOTES':u'10-15% Phix spike-in', u'PRINCIPAL_INVESTIGATOR_NAME':u'Walter Salzburger', u'NANO_DROP':u'CONCND3300', u'AFFILIATION':u'UNIVERSITY_BASEL', u'SBS_SEQUENCING_KIT_VERSION':u'SBS_HS_V3', u'EXTERNAL_SAMPLE_NAME':u'Ga_lib_39', u'BIOLOGICAL_SAMPLE_ARRIVED':u'2013-12-06 12:00:00 +0100', u'KIT':u'NONE', u'UL_EB_MISEQ':u' 18.0', u'PRINCIPAL_INVESTIGATOR_EMAIL':u'walter.salzburger@unibas.ch', u'UL_DNA':u' 1.0', u'NUMBER_OF_ATTACHMENTS':u'1', u'SAMPLE_KIND':u'FRAGMENTED_GENOMIC_DNA', u'CS_PROTOCOL_VERSION':u'v8', u'UL_STOCK':u'20', u'UL_DNA_MISEQ':u' 2.0'}} - self.samplesPerLaneDict = {u'8':2, u'1':2, u'7':2, u'5':3, u'2':2, u'6':2, u'3':2, u'4':2} - self.flowCellName = 'C36DWACXX' - - self.flowCellDict2 = {u'RUNNINGTIME': u'1 day, 16:14:28', u'SEQUENCER_FINISHED': u'2014-02-21 06:23:44 +0100', u'ILLUMINA_PIPELINE_VERSION': u'1.18.42', u'END_TYPE': u'PAIRED_END', u'FLOW_CELL_SEQUENCED_ON': u'2014-02-19 14:09:16 +0100', u'INDEXREAD2': u'8', u'SBS_KIT': u'MS2048060-500V2', u'SEQUENCER': u'M01761', u'TILECOUNT': u'14', u'LANECOUNT': u'1', 'Name': u'140219_M01761_0057_000000000-A825W', u'SEQUENCER_RUN_TIME': u'1.677', u'CYCLES_REQUESTED_BY_CUSTOMER': u'251', u'INDEXREAD': u'8', u'SWATHCOUNT': u'1', u'SURFACECOUNT': u'2', 'Project': u'2014.02'} - self.parentDict2 = {u'BSSE_QGF_20267_140219_M01761_0057_000000000_A825W_1': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'AFFILIATION': u'UNIVERSITY_BASEL', u'EXTERNAL_SAMPLE_NAME': u'PAL MiSeq 22', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-02-14 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_14958_140219_M01761_0057_000000000_A825W_1': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'32', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'ina.nissen@bsse.ethz.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Ina Nissen', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Christian Beisel', u'AFFILIATION': u'BSSE', u'EXTERNAL_SAMPLE_NAME': u'PhiX', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'TATCCTCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CTCTCTAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01665', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTCTCTAT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAGGCATG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01664', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGTACTAG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01660', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AAGGAGTA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'AGGCAGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01661', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'GTAAGGAG', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAAGGCGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01659', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTAAGCCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GTAGAGGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01670', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'CTAAGCCT', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TCCTGAGC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01662', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AAGGAGTA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'AAGAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01669', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'AGAGTAGA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAGAGAGG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01666', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGAGGCTG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01668', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'TAGATCGC', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GGACTCCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01663', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1': {u'HOW_OFTEN_SEQUENCED': u'1', u'INDEX2': u'ACTGCATA', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.18.42\nSequencer : QGF MiSeq (Yoda)\nRun type: PAIRED_END\nNumber of cycles: 251\n\nKit : MS2048060-500V2', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GCTACGCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Julia.Feldmann@unibas.ch', u'INVOICE': u'false', 'LANE': u'140219_M01761_0057_000000000-A825W:1', u'NCBI_ORGANISM_TAXONOMY': u'1773', u'EXTERNAL_SAMPLE_NAME': u'G01667', u'CONTACT_PERSON_NAME': u'Julia Feldmann', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'Sebastien.Gagneux@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Sebastien Gagneux', u'SAMPLE_KIND': u'GENOMIC_DNA', u'AFFILIATION': u'UNIVERSITY_BASEL', u'UL_DNA_MISEQ': u'0'}} - self.samplesPerLaneDict2 = {u'1': 14} - self.flowCellName2 = '000000000-A825W' - - self.flowCellDict3 = {u'CONTROL_LANE': u'5', u'RUNNINGTIME': u'2 days, 11:29:33', u'SEQUENCER_FINISHED': u'2014-01-26 23:07:19 +0100', u'ILLUMINA_PIPELINE_VERSION': u'1.17.21.3', u'END_TYPE': u'SINGLE_READ', u'FLOW_CELL_SEQUENCED_ON': u'2014-01-24 11:37:46 +0100', u'INDEXREAD2': u'0', u'SBS_KIT': u'TruSeq SBS Kit v3', u'FLOWCELLTYPE': u'HiSeq Flow Cell v3', u'SEQUENCER': u'SN792', u'TILECOUNT': u'16', u'LANECOUNT': u'8', 'Name': u'140124_SN792_0311_AC36GVACXX', u'SEQUENCER_RUN_TIME': u'2.479', u'CYCLES_REQUESTED_BY_CUSTOMER': u'51', u'INDEXREAD': u'7', u'SWATHCOUNT': u'3', u'SURFACECOUNT': u'2', 'Project': u'2014.01'} - self.parentDict3 = {u'BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAAAAG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14_G12.336 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'5_G08.792 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 2.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.26', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'24_fox-1 asd-1 3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' -6.0', u'NM_DNA': u' 2.50', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 8.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 16.0'}, u'BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'159', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.1', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'15_wt (N2) 3 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 16.1', u'NM_DNA': u' 20.32', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 3.9'}, u'BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'870', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.7', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GATCAGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.23', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'2_Dcar_Grengiols', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'UL_EB_MISEQ': u' 16.7', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'903', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.9', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GTGGCCT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 23.68', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'3_Dcar_Gibidumsee', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.6', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.4'}, u'BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GAAACC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'15_G12.336 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.4', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'2_wt L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7': {u'QC_AT_DBSSE': u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'189', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'13', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'2', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'arnau.vinavilaseca@unibas.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:7', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Arnau', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Arnau Vina Vilaseca', u'REQUIRED_LANES': u'2', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mihaela Zavolan', u'NANO_DROP': u'CONCND3300', u'BARCODES': u'these are 12 samples pooled together with the True seq universal adaptor and personal internal barcode\n\nthe samples should run in two lanes.\n\nlet me know if any questions\n\nArnau', u'AFFILIATION': u'BIOCENTER_BASEL', u'EXTERNAL_SAMPLE_NAME': u'Ina-PseudoUridination', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-01-13 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mihaela.zavolan@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'CS_PROTOCOL_VERSION': u'v8', u'SAMPLE_KIND': u'SMALL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'22Ab', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'7_G09.245 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'3_G11.806 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'159', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 3.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'12_Q L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' -3.8', u'NM_DNA': u' 2.90', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 6.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 13.8'}, u'BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'21_fox-1 3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'26Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'775', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'14.8', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'ATTCCTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 29.38', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'6_Dcar_Niedergampel', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 17.3', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 2.7'}, u'BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'16Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'6_G09.245 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TAGCTTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'10_G11.838 TA2', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'10847', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'24', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'ina.nissen@bsse.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:5', u'LOT': u'9306315', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Ina Nissen', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Christian Beisel', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'PhiX', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'christian.beisel@bsse.ethz.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'8_G11.838 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6': {u'QC_AT_DBSSE': u'false', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'189', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'13', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'2', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'arnau.vinavilaseca@unibas.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:6', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Arnau', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Arnau Vina Vilaseca', u'REQUIRED_LANES': u'2', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mihaela Zavolan', u'NANO_DROP': u'CONCND3300', u'BARCODES': u'these are 12 samples pooled together with the True seq universal adaptor and personal internal barcode\n\nthe samples should run in two lanes.\n\nlet me know if any questions\n\nArnau', u'AFFILIATION': u'BIOCENTER_BASEL', u'EXTERNAL_SAMPLE_NAME': u'Ina-PseudoUridination', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2014-01-13 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mihaela.zavolan@unibas.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'CS_PROTOCOL_VERSION': u'v8', u'SAMPLE_KIND': u'SMALL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'147', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.7', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.84', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'17_asd-1 2 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.3', u'NM_DNA': u' 29.72', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.3', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.7'}, u'BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'2_G11.806 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 6.2', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.55', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'11_Q L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 2.4', u'NM_DNA': u' 5.26', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 3.8', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 7.6'}, u'BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'153', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'3.9', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'16_asd-1 1 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.0', u'NM_DNA': u' 39.22', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.0'}, u'BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'4.89', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'7_58 80 L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.3', u'NM_DNA': u' 46.44', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 0.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 1.7'}, u'BSSE_QGF_19925_140124_SN792_0311_AC36GVACXX_2': {u'QC_AT_DBSSE': u'true', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'PREPARED_BY': u'Deni', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'REQUIRED_LANES': u'1', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'58', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool 1(1-12)', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-17 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'8', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'CS_PROTOCOL_VERSION': u'v8', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 7.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.01', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'22_fox-1 asd-1 1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 5.8', u'NM_DNA': u' 9.59', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.1', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 4.2'}, u'BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'14An', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'AGTTCCG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'37Ny', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GATCAGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'9_G11.838 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 5.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.49', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'13_wt (N2) 1 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 1.5', u'NM_DNA': u' 4.71', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.5'}, u'BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'1000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'11_G09.258 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 5.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.5', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'AGTCAAC', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'23_fox-1 asd-1 2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 1.5', u'NM_DNA': u' 4.72', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.5'}, u'BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'37Br', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19938_140124_SN792_0311_AC36GVACXX_3': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-23 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Deni', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool 2 (13-24)', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-17 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'NONE', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'CS_PROTOCOL_VERSION': u'v8', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20026_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'CONCENTRATION_FLOWLANE': u'12', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'CLUSTER_STATION': u'CBOT', u'END_TYPE': u'SINGLE_READ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CREATED_ON_CS': u'2014-01-24 12:00:00 +0100', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'CLUSTER_GENERATION_KIT_VERSION': u'TRUSEQ_CBOT_HS_V3', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'REQUIRED_LANES': u'1', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'50', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'Test', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'Pool_Exome 23.01.14', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'2', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'200', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.1', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'5.91', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GGCTACA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'9_58 80 L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 18.2', u'NM_DNA': u' 45.46', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 0.9', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 1.8'}, u'BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'16Ab', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'770', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 17.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'9.4', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 18.78', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'1_Dcar_Unterstalden', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 15.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 2.1', u'NUMBER_OF_ATTACHMENTS': u'1', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 4.3'}, u'BSSE_QGF_20034_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u'0', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'DNA_CONCENTRATION_OF_LIBRARY': u'2', u'EXTERNAL_SAMPLE_NAME': u'Pool_Set2_Simone', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'1', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.9', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACAGTGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'5_mir-58 L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.1', u'NM_DNA': u' 27.88', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'6_mir-58 L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'1_G11.806 NO', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'UL_EB_MISEQ': u'0', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 19.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'3.99', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TTAGGCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'3_wt L3', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.9', u'NM_DNA': u' 38.37', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.1'}, u'BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.5', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'2.83', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'4_mir-58 L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 17.1', u'NM_DNA': u' 27.21', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.5', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CAGATCA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'19_fox-1 1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'740', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'11.6', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'GTTTCGG', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.12', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'4_Dcar_Simplonpass', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Sample got sequenced more than once. Please check the flow lane properties for detailed description!', u'STARTING_AMOUNT_OF_SAMPLE_IN_NG': u'2000', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'4', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'BARCODE': u'TGACCAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'Christine.Fritz@usz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:4', u'PREPARED_BY': u'Ina', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fritz Christine', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Peter Wild', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'4_G08.792 TA1', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-10-29 12:00:00 +0100', u'KIT': u'AGILENT_SURESELECT_ENRICHMENTSYSTEM', u'UL_EB_MISEQ': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'peter.wild@usz.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_20045_140124_SN792_0311_AC36GVACXX_8': {u'QC_AT_DBSSE': u'false', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'27434', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'RNA_SEQ', u'BARCODE_COMPLEXITY_CHECKER': u'OK', u'CONTACT_PERSON_EMAIL': u'minwu@ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:8', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Min Wu', u'NM_DNA': u'0', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'NOTES': u'TruSeq Strande mRNA sample Prep Kit', u'PRINCIPAL_INVESTIGATOR_NAME': u'Mathias K\xf6lliker', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'Pool1_Min Wu_TruSeq Str.', u'UL_EB_MISEQ': u'0', u'UL_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'mathias.koelliker@unibas.ch', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'TOTAL_RNA', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3': {u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u'0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'GCCAATA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'18_asd-1 3 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u'0', u'NM_DNA': u'0', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u'0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u'0'}, u'BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'161', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 8.6', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.45', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'20_fox-1 2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 7.1', u'NM_DNA': u' 13.86', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.4', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 2.9'}, u'BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 8.3', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.22', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ATCACGA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'1_wt L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 6.5', u'NM_DNA': u' 11.51', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 1.7', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 3.5'}, u'BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'163', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 7.8', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.97', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CTTGTAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'10_Q L1', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 5.6', u'NM_DNA': u' 9.16', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 2.2', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 4.4'}, u'BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1': {u'QC_AT_DBSSE': u'true', u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'870', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 18.4', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'13.8', u'CELL_PLASTICITY_SYSTEMSX': u'false', u'NCBI_ORGANISM_TAXONOMY': u'3569', u'LIBRARY_PROCESSING_SUCCESSFUL': u'false', u'HOW_OFTEN_SEQUENCED': u'1', u'BAREBACKED': u'false', u'SEQUENCING_APPLICATION': u'GENOMIC_DNA_SEQ', u'END_TYPE': u'PAIRED_END', u'BARCODE': u'CGTACGT', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'simone.fior@env.ethz.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:1', u'PREPARED_BY': u'Simone', u'LIBRARY_PROCESSING_FAILED': u'false', u'CONTACT_PERSON_NAME': u'Fior Simone', u'NM_DNA': u' 24.40', u'CYCLES_REQUESTED_BY_CUSTOMER': u'100', u'LIBRARY_PROCESSING_POSSIBLE': u'false', u'PRINCIPAL_INVESTIGATOR_NAME': u'Alexander Widmer', u'NANO_DROP': u'CONCND3300', u'AFFILIATION': u'OTHER', u'EXTERNAL_SAMPLE_NAME': u'5_Dcar_Faldumalp', u'BIOLOGICAL_SAMPLE_ARRIVED': u'2013-12-16 12:00:00 +0100', u'KIT': u'NONE', u'UL_EB_MISEQ': u' 16.7', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'alex.widmer@env.ethz.ch', u'UL_DNA': u' 1.6', u'NUMBER_OF_ATTACHMENTS': u'0', u'SAMPLE_KIND': u'GENOMIC_DNA', u'UL_STOCK': u'20', u'UL_DNA_MISEQ': u' 3.3'}, u'BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'162', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 16.9', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'1.38', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'ACTTGAA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:2', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'8_58 80 L2', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 13.9', u'NM_DNA': u' 13.11', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 3.1', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'20', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 6.1'}, u'BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3': {u'FRAGMENT_SIZE_PREPARED_ILLUMINA': u'160', u'HOW_OFTEN_SEQUENCED': u'1', u'UNIQUE_BARCODES': u'OK', u'UL_EB': u' 6.0', u'FLOW_CELL_PROPERTIES': u'Illumina RTA Version: 1.17.21.3\nSequencer : QGF HiSeq2000 (Rua)\nRun type: SINGLE_READ\nNumber of cycles: 51\nFLOWCELLTYPE: HiSeq Flow Cell v3\nKit : TruSeq SBS Kit v3', u'CONCENTRATION_PREPARED_ILLUMINA': u'0.52', u'SEQUENCING_APPLICATION': u'SMALL_RNA_SEQ', u'BARCODE': u'CGATGTA', u'BARCODE_COMPLEXITY_CHECKER': u'No Pool', u'CONTACT_PERSON_EMAIL': u'deni.subasic@imls.uzh.ch', u'INVOICE': u'false', 'LANE': u'140124_SN792_0311_AC36GVACXX:3', u'NCBI_ORGANISM_TAXONOMY': u'9606', u'EXTERNAL_SAMPLE_NAME': u'14_wt (N2) 2 (OLD)', u'CONTACT_PERSON_NAME': u'Deni Subasic', u'UL_EB_MISEQ': u' 2.0', u'NM_DNA': u' 5.00', u'PRINCIPAL_INVESTIGATOR_EMAIL': u'michael.hengartner@imls.uzh.ch', u'UL_DNA': u' 4.0', u'NUMBER_OF_ATTACHMENTS': u'0', u'PRINCIPAL_INVESTIGATOR_NAME': u'Michael Hengartner', u'SAMPLE_KIND': u'PROCESSED_DNA_LIBRARY', u'UL_STOCK': u'10', u'AFFILIATION': u'OTHER', u'UL_DNA_MISEQ': u' 8.0'}} - self.samplesPerLaneDict3 = {u'8': 9, u'1': 7, u'5': 1, u'7': 1, u'2': 13, u'6': 1, u'3': 13, u'4': 14} - self.flowCellName3 = 'C36GVACXX' - - def test_createHiseqSampleSheet_PhiX_and_NoIndex (self): - ''' - Case1: we have Phix and a non-barcoded sample in the same lane - Only one sample is allowed per lane - ''' - - sampleSheetDict1, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict, self.flowCellDict, - self.samplesPerLaneDict, self.flowCellName, self.configMap, self.logger, self.parser) - - d1 = {u'6_BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6': [u'C36DWACXX,6,BSSE_QGF_16255_140127_SN792_0312_AC36DWACXX_6,481459, ,Ga_lib_37,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_6'], - u'5_BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5': [u'C36DWACXX,5,BSSE_QGF_19988_140127_SN792_0312_AC36DWACXX_5,481459,ACAGTG,201,Y,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_5'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'4_BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4': [u'C36DWACXX,4,BSSE_QGF_16254_140127_SN792_0312_AC36DWACXX_4,481459, ,Ga_lib_36,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_4'], - u'7_BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7': [u'C36DWACXX,7,BSSE_QGF_16256_140127_SN792_0312_AC36DWACXX_7,481459, ,Ga_lib_38,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_7'], - u'8_BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8': [u'C36DWACXX,8,BSSE_QGF_16257_140127_SN792_0312_AC36DWACXX_8,481459, ,Ga_lib_39,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_8'], - u'5_BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5': [u'C36DWACXX,5,BSSE_QGF_19989_140127_SN792_0312_AC36DWACXX_5,481459,GTGAAA,293,Y,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_5'], - u'1_BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1': [u'C36DWACXX,1,BSSE_QGF_16251_140127_SN792_0312_AC36DWACXX_1,481459, ,Ga_lib_33,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_1'], - u'2_BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2': [u'C36DWACXX,2,BSSE_QGF_16252_140127_SN792_0312_AC36DWACXX_2,481459, ,Ga_lib_34,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_2'], - u'3_BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3': [u'C36DWACXX,3,BSSE_QGF_16253_140127_SN792_0312_AC36DWACXX_3,481459, ,Ga_lib_35,N,SINGLE_READ_151,ETHZ_D-BSSE,140127_SN792_0312_AC36DWACXX_3']} - - if (sampleSheetDict1 != d1): - self.fail("Dictionaries do not match!") - - - def test_createHiseqSampleSheet_PhiX_plus_Index (self): - ''' - Case2: We have several indexed samples plus a PhiX in the lane - ''' - - sampleSheetDict2, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict2, self.flowCellDict2, - self.samplesPerLaneDict2, self.flowCellName2, self.configMap, self.logger, self.parser) - - d2 = {u'1_BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20262_140219_M01761_0057_000000000_A825W_1,1773,CAGAGAG-AGAGTAG,G01666,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20258_140219_M01761_0057_000000000_A825W_1,1773,TCCTGAG-CTAAGCC,G01662,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20255_140219_M01761_0057_000000000_A825W_1,1773,TAAGGCG-GTAAGGA,G01659,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20259_140219_M01761_0057_000000000_A825W_1,1773,GGACTCC-TAGATCG,G01663,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20266_140219_M01761_0057_000000000_A825W_1,1773,GTAGAGG-CTAAGCC,G01670,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'1_BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20263_140219_M01761_0057_000000000_A825W_1,1773,GCTACGC-ACTGCAT,G01667,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20261_140219_M01761_0057_000000000_A825W_1,1773,CTCTCTA-TATCCTC,G01665,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20264_140219_M01761_0057_000000000_A825W_1,1773,CGAGGCT-ACTGCAT,G01668,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20257_140219_M01761_0057_000000000_A825W_1,1773,AGGCAGA-AAGGAGT,G01661,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20265_140219_M01761_0057_000000000_A825W_1,1773,AAGAGGC-AAGGAGT,G01669,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20256_140219_M01761_0057_000000000_A825W_1,1773,CGTACTA-ACTGCAT,G01660,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1'], - u'1_BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1': [u'000000000-A825W,1,BSSE_QGF_20260_140219_M01761_0057_000000000_A825W_1,1773,TAGGCAT-CTCTCTA,G01664,N,PAIRED_END_251,ETHZ_D-BSSE,140219_M01761_0057_000000000_A825W_1']} - - if (sampleSheetDict2 != d2): - self.fail("Dictionaries do not match!") - - - def test_createHiseqSampleSheet_Lane5_PhiX (self): - ''' - Case3: "Normal" use case with Lane #5 as a PhiX Control lane - ''' - sampleSheetDict3, testFile = sampleSheetFile = createHiseqSampleSheet(self.parentDict3, self.flowCellDict3, - self.samplesPerLaneDict3, self.flowCellName3, self.configMap, self.logger, self.parser) - - d3 = {u'4_BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20018_140124_SN792_0311_AC36GVACXX_4,9606,ACTTGA,8_G11_838_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'5_BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5': [u'C36GVACXX,5,BSSE_QGF_16028_140124_SN792_0311_AC36GVACXX_5,10847, ,PhiX,Y,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_5'], - u'4_BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20014_140124_SN792_0311_AC36GVACXX_4,9606,TGACCA,4_G08_792_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'3_BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19933_140124_SN792_0311_AC36GVACXX_3,9606,ACTTGA,20_fox_1_2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20041_140124_SN792_0311_AC36GVACXX_8,27434,CAGATC,16Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'6_BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6': [u'C36GVACXX,6,BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_6,9606, ,Ina_PseudoUridination,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_6'], - u'2_BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19918_140124_SN792_0311_AC36GVACXX_2,9606,GCCAAT,6_mir_58_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19916_140124_SN792_0311_AC36GVACXX_2,9606,TGACCA,4_mir_58_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19927_140124_SN792_0311_AC36GVACXX_3,9606,CGATGT,14_wt_N2_2_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19913_140124_SN792_0311_AC36GVACXX_2,9606,ATCACG,1_wt_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19929_140124_SN792_0311_AC36GVACXX_3,9606,TGACCA,16_asd_1_1_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20037_140124_SN792_0311_AC36GVACXX_8,27434,CGATGT,14An,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'4_BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20025_140124_SN792_0311_AC36GVACXX_4,9606,GAAACC,15_G12_336_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20020_140124_SN792_0311_AC36GVACXX_4,9606,TAGCTT,10_G11_838_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20016_140124_SN792_0311_AC36GVACXX_4,9606,GCCAAT,6_G09_245_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'7_BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7': [u'C36GVACXX,7,BSSE_QGF_19956_140124_SN792_0311_AC36GVACXX_7,9606, ,Ina_PseudoUridination,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_7'], - u'2_BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19922_140124_SN792_0311_AC36GVACXX_2,9606,CTTGTA,10_Q_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'1_BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20033_140124_SN792_0311_AC36GVACXX_1,3569,ATTCCT,6_Dcar_Niedergampel,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20017_140124_SN792_0311_AC36GVACXX_4,9606,CAGATC,7_G09_245_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'1_BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20030_140124_SN792_0311_AC36GVACXX_1,3569,GTGGCC,3_Dcar_Gibidumsee,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'8_BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20043_140124_SN792_0311_AC36GVACXX_8,27434,AGTCAA,14Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'3_BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19926_140124_SN792_0311_AC36GVACXX_3,9606,ATCACG,13_wt_N2_1_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'1_BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20029_140124_SN792_0311_AC36GVACXX_1,3569,GATCAG,2_Dcar_Grengiols,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'3_BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19936_140124_SN792_0311_AC36GVACXX_3,9606,AGTCAA,23_fox_1_asd_1_2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19935_140124_SN792_0311_AC36GVACXX_3,9606,CTTGTA,22_fox_1_asd_1_1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19921_140124_SN792_0311_AC36GVACXX_2,9606,GGCTAC,9_58_80_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'8_BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20038_140124_SN792_0311_AC36GVACXX_8,27434,TGACCA,16Ab,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'8_BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20044_140124_SN792_0311_AC36GVACXX_8,27434,AGTTCC,37Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'4_BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20012_140124_SN792_0311_AC36GVACXX_4,9606,CGATGT,2_G11_806_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'!': ['FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject'], - u'2_BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19919_140124_SN792_0311_AC36GVACXX_2,9606,CAGATC,7_58_80_L1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19928_140124_SN792_0311_AC36GVACXX_3,9606,TTAGGC,15_wt_N2_3_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19932_140124_SN792_0311_AC36GVACXX_3,9606,CAGATC,19_fox_1_1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20039_140124_SN792_0311_AC36GVACXX_8,27434,ACAGTG,22Ab,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'2_BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19917_140124_SN792_0311_AC36GVACXX_2,9606,ACAGTG,5_mir_58_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'4_BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20024_140124_SN792_0311_AC36GVACXX_4,9606,CAAAAG,14_G12_336_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20019_140124_SN792_0311_AC36GVACXX_4,9606,GATCAG,9_G11_838_TA1,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'1_BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20031_140124_SN792_0311_AC36GVACXX_1,3569,GTTTCG,4_Dcar_Simplonpass,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20011_140124_SN792_0311_AC36GVACXX_4,9606,ATCACG,1_G11_806_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'4_BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20021_140124_SN792_0311_AC36GVACXX_4,9606,GGCTAC,11_G09_258_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'2_BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19924_140124_SN792_0311_AC36GVACXX_2,9606,AGTTCC,12_Q_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19923_140124_SN792_0311_AC36GVACXX_2,9606,AGTCAA,11_Q_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'2_BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19914_140124_SN792_0311_AC36GVACXX_2,9606,CGATGT,2_wt_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'3_BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19931_140124_SN792_0311_AC36GVACXX_3,9606,GCCAAT,18_asd_1_3_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'1_BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20032_140124_SN792_0311_AC36GVACXX_1,3569,CGTACG,5_Dcar_Faldumalp,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'4_BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20013_140124_SN792_0311_AC36GVACXX_4,9606,TTAGGC,3_G11_806_TA2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'3_BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19934_140124_SN792_0311_AC36GVACXX_3,9606,GGCTAC,21_fox_1_3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'3_BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19937_140124_SN792_0311_AC36GVACXX_3,9606,AGTTCC,24_fox_1_asd_1_3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'2_BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19915_140124_SN792_0311_AC36GVACXX_2,9606,TTAGGC,3_wt_L3,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'4_BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4': [u'C36GVACXX,4,BSSE_QGF_20015_140124_SN792_0311_AC36GVACXX_4,9606,ACAGTG,5_G08_792_NO,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_4'], - u'2_BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2': [u'C36GVACXX,2,BSSE_QGF_19920_140124_SN792_0311_AC36GVACXX_2,9606,ACTTGA,8_58_80_L2,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_2'], - u'1_BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1': [u'C36GVACXX,1,BSSE_QGF_20028_140124_SN792_0311_AC36GVACXX_1,3569,TTAGGC,1_Dcar_Unterstalden,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_1'], - u'8_BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20040_140124_SN792_0311_AC36GVACXX_8,27434,GCCAAT,37Br,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8'], - u'3_BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3': [u'C36GVACXX,3,BSSE_QGF_19930_140124_SN792_0311_AC36GVACXX_3,9606,ACAGTG,17_asd_1_2_OLD_,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_3'], - u'8_BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8': [u'C36GVACXX,8,BSSE_QGF_20042_140124_SN792_0311_AC36GVACXX_8,27434,CTTGTA,26Ny,N,SINGLE_READ_51,ETHZ_D-BSSE,140124_SN792_0311_AC36GVACXX_8']} - - if (sampleSheetDict3 != d3): - self.fail("Dictionaries do not match!") - - def tearDown(self): - pass - -suite = unittest.TestLoader().loadTestsFromTestCase(TestCreateHiseqSampleSheet) -unittest.TextTestRunner(verbosity=2).run(suite) \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py b/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py deleted file mode 100644 index 327c19822c2..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS.py +++ /dev/null @@ -1,507 +0,0 @@ -''' -@copyright: -Copyright 2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -import operator -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' -SAMPLETYPE = 'SAMPLETYPE' - -def getLaneAncestors(service, lane, logger): - ''' - Gets all ancestors and corresponding properties of a sample - ''' - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - dList = service.searchForSamples(sc, fetchOptions) - - def recursiveSamples(list, codeList, propertyDict): - ''' - Recursively walks through the sample tree and write the sample codes - to a list and the properties into a dictionary. The sample code is - the key, the properties are the values - ''' - - for element in list: - elementCode = element.getCode() - codeList.append(elementCode) - elementProperties = element.getProperties() - - tmpDict = {} - - for eP in elementProperties: - tmpDict[eP] = elementProperties[eP] - - tmpDict[SAMPLETYPE] = element.getSampleTypeCode() - propertyDict[elementCode] = tmpDict - - elementParents = element.getParents() - - if (elementParents.size() > 0): - recursiveSamples(elementParents, codeList, propertyDict) - - codeList = [] - propertyDict = {} - - recursiveSamples(dList, codeList, propertyDict) - - logger.info(codeList) - logger.info(propertyDict) - - return codeList, propertyDict - - -def login(configDict, logger): - logger.info('Logging into ' + configDict['openbisServer']) - try: - service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - except BaseException: - print ('Could not connect to ' + configDict['openbisServer'] + '. Please check if the server ' + - 'address is OK, the firewall is not blocking the communication, or openBIS is down.') - - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(logger, propertyFile='etc/createSampleSheet_Illumina_NGS.properties'): - ''' - Parses the given config files and returns the values - ''' - logger.info('Reading config file ' + propertyFile) - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - configDict = {} - - configParameters = parseConfigurationFile(logger) - - configDict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configDict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configDict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configDict['sampleSheetFileName'] = configParameters.get(GENERAL, 'sampleSheetFileName') - configDict['separator'] = configParameters.get(GENERAL, 'separator') - configDict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configDict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configDict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configDict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configDict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configDict['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - - configDict['illuminaFlowLaneTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowLaneTypeName') - configDict['libraryPoolTypeName'] = configParameters.get(OPENBIS, 'libraryPoolTypeName') - configDict['libraryTypeName'] = configParameters.get(OPENBIS, 'libraryTypeName') - configDict['rawTypeName'] = configParameters.get(OPENBIS, 'rawTypeName') - configDict['masterTypeName'] = configParameters.get(OPENBIS, 'masterTypeName') - configDict['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configDict['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configDict['operator'] = configParameters.get(OPENBIS, 'operator') - configDict['endType'] = configParameters.get(OPENBIS, 'endType') - configDict['lengthIndex1'] = configParameters.get(OPENBIS, 'lengthIndex1') - configDict['lengthIndex2'] = configParameters.get(OPENBIS, 'lengthIndex2') - - configDict['endType'] = configParameters.get(OPENBIS, 'endType') - configDict['cycles'] = configParameters.get(OPENBIS, 'cycles') - configDict['runFolderName'] = configParameters.get(OPENBIS, 'runFolderName') - configDict['ncbiOrganismTaxonomy'] = configParameters.get(OPENBIS, 'ncbiOrganismTaxonomy') - configDict['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - - configDict['phixNcbiCode'] = configParameters.getint(OPENBIS, 'phixNcbiCode') - - configDict['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configDict['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - return configDict - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(logger, containedSamples, service): - ''' - Takes a java.util.ArrayList of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a dictionary of the properties - ''' - laneParentDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - propertyDict['SAMPLE_TYPE'] = parent.getSampleTypeCode() - myKey = sanitizeString(lane.getCode() + '_' + parentCode) - laneParentDict[myKey] = propertyDict - - logger.info('Found ' + str(len(laneParentDict)) + ' samples on the flow cell.') - return laneParentDict - - -def convertSampleToDict(foundFlowCell, configDict): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - flowCellDict['CODE'] = foundFlowCell.getCode() - return flowCellDict - -def writeSampleSheet(configDict, flowCellName, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given list of class sampleSheetLine to a csv file - ''' - newline = lineending[myoptions.lineending] - myFile = fileName + '_' + flowCellName + '.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - sampleSheetFile.write(configDict['hiSeqHeader'] + newline) - for laneElement in sortedSampleSheetList: - for indexElement in laneElement: - if myoptions.verbose: - print indexElement - sampleSheetFile.write(indexElement.__str__() + newline) - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeSampleSheetPerLane(configDict, flowCellName, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given list of class sampleSheetLine to multiple csv files - ''' - newline = lineending[myoptions.lineending] - - for laneElement in sortedSampleSheetList: - lane = sortedSampleSheetList.index(laneElement) + 1 - myFile = fileName + '_' + flowCellName + '_' + str(lane) +'.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - sampleSheetFile.write(configDict['hiSeqHeader'] + newline) - for indexElement in laneElement: - if myoptions.verbose: - print indexElement - sampleSheetFile.write(indexElement.__str__() + newline) - - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - - -class sampleSheetLine: - ''' - Represents one line in a Illumina Sample Sheet - ''' - - def __init__(self, fcId='', lane=0, sampleId='', sampleRef='', index='', description='', - control='', recipe='', operator='', sampleProject=''): - self.fcId = fcId - self.lane = lane - self.sampleId = sampleId - self.sampleRef = sampleRef - self.index = index - self.description = description - self.control = control - self.recipe = recipe - self.operator = operator - self.sampleProject = sampleProject - - def __repr__(self): - return self.__str__() - - def __str__(self): - return str(self.fcId) + COMMA + str(self.lane) + COMMA + str(self.sampleId) + COMMA + \ - str(self.sampleRef) + COMMA + str(self.index) + COMMA + str(self.description) + COMMA + \ - str(self.control) + COMMA + str(self.recipe) + COMMA + str(self.operator) + COMMA + \ - str(self.sampleProject) - -def main(): - ''' - Main script - ''' - demuxPenalty = -1 - print datetime.now() - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configDict = readConfig(logger) - service = login(configDict, logger) - - foundFlowCell, containedSamples = getFlowCell(configDict['illuminaFlowCellTypeName'], flowCellName, service, logger) - flowCellName = foundFlowCell.getCode() - flowCellDict = convertSampleToDict(foundFlowCell, configDict) - - index1ReadLength = int(flowCellDict[configDict['lengthIndex1']]) + demuxPenalty - indexRead2Length = int(flowCellDict[configDict['lengthIndex2']]) + demuxPenalty - - laneParentDict = getContainedSampleProperties(logger, containedSamples, service) - - sortedParentList = laneParentDict.keys() - sortedParentList.sort() - - sampleSheetList = [] - - for laneKey in sortedParentList: - lane = laneParentDict[laneKey]['LANE'] - logger.info('Processing Lane '+ lane) - codeList, propertyDict = getLaneAncestors(service, lane, logger) - - ssLine = sampleSheetLine (operator=configDict['facilityInstitution']) - ssLineList = [] - - for code in codeList: - sampleProperties = propertyDict[code] - - # Precedence of the EXTERNAL_SAMPLE_NAME property is: - # RAW_SAMPLE -> LIBRARY -> LIBRARY_POOL - try: - ssLine.description = sanitizeString(sampleProperties[configDict['externalSampleName']]) - except: - pass - - if sampleProperties[SAMPLETYPE] == configDict['libraryTypeName']: - - index = '' - - if configDict['index1Name'] in sampleProperties and index1ReadLength > 0: - index = sampleProperties[configDict['index1Name']][0:index1ReadLength] - - if configDict['index2Name'] in sampleProperties and indexRead2Length > 0: - index = index + configDict['indexSeparator'] + sampleProperties[configDict['index2Name']][0:indexRead2Length] - - ssLine.fcId = flowCellName - ssLine.lane = lane[-1] - ssLine.sampleId = code + '_' + flowCellDict[configDict['runFolderName']] + '_' + ssLine.lane - ssLine.index = index - - if sampleProperties[SAMPLETYPE] == configDict['masterTypeName']: - ssLine.sampleRef = sampleProperties[configDict['ncbiOrganismTaxonomy']] - - # Check if PhiX Control - if int(ssLine.sampleRef) == configDict['phixNcbiCode']: - ssLine.control = 'Y' - else: - ssLine.control = 'N' - - ssLine.recipe = flowCellDict[configDict['endType']] + '_' + flowCellDict[configDict['cycles']] - ssLine.sampleProject = flowCellDict[configDict['runFolderName']] + '_' + ssLine.lane - - ssLineList.append(ssLine) - ssLine = sampleSheetLine (operator=configDict['facilityInstitution']) - - sampleSheetList.append(ssLineList) - - if myoptions.singlelane: - writeSampleSheetPerLane (configDict, flowCellName, sampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configDict['sampleSheetFileName']) - else: - writeSampleSheet(configDict, flowCellName, sampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configDict['sampleSheetFileName']) - - logout(service, logger) - print datetime.now() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py b/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py deleted file mode 100644 index a6f6db94500..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_Illumina_NGS_Test.py +++ /dev/null @@ -1,45 +0,0 @@ -import unittest -import re -from createSampleSheet_Illumina_NGS import * - -class TestsanitizeString(unittest.TestCase): - - def testDefault(self): - self.assertEqual(sanitizeString('abc#a$v%c^D&P-'), 'abc_a_v_c_D_P_') - - def testOnlySpecialChars(self): - self.assertEqual(sanitizeString('@#$%^&*('), '_') - - -class TestGetFlowCell(unittest.TestCase): - - def setUp(self): - self.logger = setUpLogger('log/') - configDict = readConfig(self.logger) - self.service = OpenbisServiceFacadeFactory.tryCreate(configDict['openbisUserName'], - configDict['openbisPassword'], - configDict['openbisServer'], - configDict['connectionTimeout']) - print('Ran SetUp...') - - - def testGetFlowCell (self): - - myCode = 'D1W0VACXX' - foundFlowCell, containedSamples = getFlowCell ('ILLUMINA_FLOW_CELL', myCode, self.service, self.logger) - - self.assertEqual(foundFlowCell.getCode(), myCode) - self.assertEqual(containedSamples.size(), 8) - - fcProp = foundFlowCell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'SN792') - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - -def main(): - unittest.main() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py deleted file mode 100644 index a3b321c76f3..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.py +++ /dev/null @@ -1,786 +0,0 @@ -''' -@copyright: -Copyright 2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (bcl2fastq) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -import os -import logging -import re -import sys -import string -import smtplib -import argparse -from ConfigParser import SafeConfigParser -from datetime import * -from collections import OrderedDict - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' -CSV = ".csv" - - -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED = \ - ('Illumina HiSeq 4000', 'Illumina HiSeq 3000', 'Illumina HiSeq 2500', 'Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def login(logger, config_dict): - logger.info('Logging into ' + config_dict['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(config_dict['openbisUserName'], - config_dict['openbisPassword'], - config_dict['openbisServer'], - config_dict['connectionTimeout']) - return service - - -def logout (service, logger): - service.logout() - logger.info('Logged out') - - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'create_sample_sheet_dict' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = argparse.ArgumentParser(version='%prog 1.0', description='Process some integers.') - parser.add_argument('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_argument('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients') - parser.add_argument('-l', '--lineending', - dest='lineending', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_argument('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_argument('-s', '--singlelane', - dest='singlelane', - default=True, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_argument('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_argument('--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - args = parser.parse_args() - - if args.outdir[-1] <> '/': - args.outdir = args.outdir + '/' - - if args.flowcell is None: - parser.print_help() - exit(-1) - return args - - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - config_dict = {} - - configParameters = parseConfigurationFile() - config_dict['facilityName'] = configParameters.get(GENERAL, 'facilityName') - config_dict['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - config_dict['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - config_dict['mailList'] = configParameters.get(GENERAL, 'mailList') - config_dict['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - config_dict['smptHost'] = configParameters.get(GENERAL, 'smptHost') - config_dict['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - config_dict['separator'] = configParameters.get(GENERAL, 'separator') - config_dict['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - config_dict['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - config_dict['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - config_dict['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - config_dict['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - config_dict['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - config_dict['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - config_dict['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - config_dict['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - config_dict['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - config_dict['endType'] = configParameters.get(OPENBIS, 'endType') - config_dict['cycles'] = configParameters.get(OPENBIS, 'cycles') - config_dict['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - config_dict['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - config_dict['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - config_dict['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - config_dict['kit'] = configParameters.get(OPENBIS, 'kit') - config_dict['10XSampleType'] = configParameters.get(OPENBIS, '10XSampleType') - config_dict['10XIndexSet'] = configParameters.get(OPENBIS, '10XIndexSet') - config_dict['recovered_cells'] = configParameters.get(OPENBIS, 'recovered_cells') - - config_dict['headerSection'] = configParameters.get(ILLUMINA, 'headerSection') - config_dict['readsSection'] = configParameters.get(ILLUMINA, 'readsSection') - config_dict['settingsSection'] = configParameters.get(ILLUMINA, 'settingsSection') - config_dict['dataSectionSingleRead'] = configParameters.get(ILLUMINA, 'dataSectionSingleRead') - config_dict['dataSectionDualRead'] = configParameters.get(ILLUMINA, 'dataSectionDualRead') - config_dict['workflow'] = configParameters.get(ILLUMINA, 'workflow') - config_dict['application'] = configParameters.get(ILLUMINA, 'application') - config_dict['chemistry'] = configParameters.get(ILLUMINA, 'chemistry') - - config_dict['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - config_dict['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - config_dict['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - config_dict['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - config_dict['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - config_dict['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - config_dict['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - config_dict['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - config_dict['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - config_dict['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - config_dict['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return config_dict - - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - - -def sanitize_string(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_vocabulary(vocabulary_code, service): - """ - Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - """ - - terms = [] - vocabularies = service.listVocabularies() - vocabulary_dict = {} - for vocabulary in vocabularies: - if vocabulary.getCode() == vocabulary_code: - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabulary_dict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabulary_code) -# print(vocabulary_dict) - return vocabulary_dict - - -def send_email(emails, flowCellName, config_dict, logger, subject, body, files=""): - """ - Send out an email to the specified recipients - """ - COMMASPACE = ', ' - emails_list = emails.split() - - msg = MIMEMultipart() - msg['From'] = config_dict['mailFrom'] - msg['To'] = COMMASPACE.join(emails_list) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = subject - - msg.attach(MIMEText(body)) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(config_dict['smptHost']) - smtp.sendmail(config_dict['mailFrom'], emails_list, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(emails_list)) - - -def get_flowcell (illuminaFlowCellTypeName, flowCellName, service, logger): - """ - Getting the the matching FlowCell - """ - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_parents(sampleName, service): - """ - Returns a list of parents of a sample - """ - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - - -def get_lane_sample_properties(lane, service, config_dict): - parentDict = {} - parents = get_parents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - pass - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitize_string(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict - - - -def get_contained_sample_properties(contained_samples, service, config_dict): - """ - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - """ - parentDict = {} - samplesPerLaneDict = {} - barcodesPerLaneDict = {} - - for lane in contained_samples: - parents = get_parents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - pass -# print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - plain_lane = lane.getCode().split(':')[-1] - - try: - if barcodesPerLaneDict.has_key(plain_lane): - barcodesPerLaneDict[plain_lane].append(propertyDict[config_dict['index1Name']]) - else: - barcodesPerLaneDict[plain_lane] = [propertyDict[config_dict['index1Name']]] - except: - pass - - try: - if barcodesPerLaneDict.has_key(plain_lane): - barcodesPerLaneDict[plain_lane].append(propertyDict[config_dict['10XIndexSet']]) - else: - barcodesPerLaneDict[plain_lane] = [propertyDict[config_dict['10XIndexSet']]] - except: - pass - - myKey = sanitize_string(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict, barcodesPerLaneDict - - -def transform_sample_to_dict(foundFlowCell): - """ - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - """ - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def write_sample_sheet_single_lane(model, ordered_sample_sheet_dict, flowCellDict, index_length_dict, - parentDict, config_dict, myoptions, logger, csv_file): - - newline = lineending[myoptions.lineending] - - if (model is Sequencers.NEXTSEQ_500): - lane_number = 2 - else: - lane_number = int(flowCellDict[config_dict['laneCount']]) + 1 - - for lane in range(1, lane_number): - header_list = create_header_section (model, config_dict, parentDict, flowCellDict, index_length_dict, lane) - per_lane_dict = [ordered_sample_sheet_dict[key] for key in ordered_sample_sheet_dict.keys() if int(key[0]) == lane] - csv_file_path = myoptions.outdir + csv_file + "_" + str(lane) + CSV - try: - with open(csv_file_path, 'wb') as sample_sheet_file: - for header_element in header_list: - sample_sheet_file.write(header_element + newline) - if myoptions.verbose: - print(header_element + newline) - for sample in per_lane_dict: - sample_sheet_file.write(str(sample[0]) + newline) - if myoptions.verbose: - print(str(sample[0]) + newline) - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - -def write_marker_file(flowCellDict, myoptions): - marker_file_path = myoptions.outdir + ".10x_run_" + flowCellDict['Name'] - with open(marker_file_path, 'wb') as marker_file: - for flowcell_prop in flowCellDict: - marker_file.write(flowcell_prop) - - -def create_header_section (model, config_dict, parentDict, flowCellDict, index_length_dict, lane): - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["", ""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A", "TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["", ""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A", "TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A", "TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["", ""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["", ""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["", ""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A", "TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["", ""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A", "TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["", ""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["", ""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["", ""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["", ""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - separator = config_dict['separator'] - header_list = [] - - len_index1 = index_length_dict[int(lane)][0] - len_index2 = index_length_dict[int(lane)][1] - - # here we take the first sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[config_dict['kit']]][1] - except: -# print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - - header_section = config_dict['headerSection'].split(separator) - header_section.reverse() - header_list = [header_section.pop().strip()] - header_list.append(header_section.pop().strip() + separator + config_dict['iemFileVersion']) - header_list.append(header_section.pop().strip() + separator + config_dict['facilityInstitution']) - header_list.append(header_section.pop().strip() + separator + config_dict['facilityName']) - header_list.append(header_section.pop().strip() + separator + flowCellDict['Name']) - header_list.append(header_section.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - header_list.append(header_section.pop().strip() + separator + config_dict['workflow']) - header_list.append(header_section.pop().strip() + separator + config_dict['application']) - header_list.append(header_section.pop().strip() + separator + assay) - header_list.append(header_section.pop().strip() + separator + flowCellDict[config_dict['endType']] + '_' + flowCellDict[config_dict['cycles']]) - header_list.append(header_section.pop().strip() + separator + config_dict['chemistry']) -# if config_dict['10XIndexSet']: -# header_list.append(config_dict['recovered_cells']) - header_list.append('') - - reads_section = config_dict['readsSection'].split(separator) - reads_section.reverse() - header_list.append(reads_section.pop()) - header_list.append(flowCellDict[config_dict['cycles']]) - if (flowCellDict[config_dict['endType']] == 'PAIRED_END'): - header_list.append(flowCellDict[config_dict['cycles']]) - header_list.append('') - - settings_section = config_dict['settingsSection'].split(separator) - settings_section.reverse() - header_list.append(settings_section.pop()) -# if ('nextera' in assay.lower()): -# header_list.append(config_dict['nexteraAdapter']) -# if ('truseq' in assay.lower()): -# header_list.append(config_dict['truSeqAdapter1']) -# header_list.append(config_dict['truSeqAdapter2']) - header_list.append('') - - if int(flowCellDict['INDEXREAD2']) > 0 and len_index2 > 0: - SeqDataSection = config_dict['dataSectionDualRead'].split(',') - else: - SeqDataSection = config_dict['dataSectionSingleRead'].split(',') - - SeqDataSection.reverse() - header_list.append(SeqDataSection.pop()) - - if model in Sequencers.NEXTSEQ_500: - # leaving out the 'Lane', as there are four but treat them as one - header_list.append(','.join(SeqDataSection.pop().strip().split()[1:])) - else: - header_list.append(','.join(SeqDataSection.pop().strip().split())) - - return header_list - - -def verify_index_length (parentDict, flowCellDict, config_dict, logger): - - index_length_dict = {} - verified_per_lane_dict = [] - - flowcell_len_index1 = int(flowCellDict['INDEXREAD']) - flowcell_len_index2 = int(flowCellDict['INDEXREAD2']) - - logger.info("Flowcell has index length [" + str(flowcell_len_index1) + ", " + str(flowcell_len_index2) + "]") - - for lane in range(1, int(flowCellDict['LANECOUNT']) + 1): - index1_set = set () - index2_set = set () - index1_length = 0 - index2_length = 0 - - logger.info("Lane: " + str(lane)) - per_lane_list = [parentDict[key] for key in parentDict.keys() if int(key[-1]) == lane] - - for sample in per_lane_list: - # If no index then just skip this sample - if (config_dict['index1Name'] not in sample) or (sample[config_dict['index1Name']] == 'NOINDEX'): - continue - index1 = sample[config_dict['index1Name']] - index2 = "" - if config_dict['index2Name'] in sample: - index2 = sample[config_dict['index2Name']] - - index1_set.add(len(index1)) - if index2: - index2_set.add(len(index2)) - else: - index2_set.add(0) - - # adding the index length of the flow cell to make sure that dual-indexed - # samples also work on a single-indexed run - index1_set.add(flowcell_len_index1) - index2_set.add(flowcell_len_index2) - - if index1_set: - index1_length = min(index1_set) - if index2_set: - index2_length = min(index2_set) - - index_length_dict[lane] = [index1_length, index2_length] - logger.info("Index1 Length Set: " + str(index1_set)) - logger.info("Index2 Length Set: " + str(index2_set)) - logger.info("Final length of index1 " + str(index1_length)) - logger.info("Final length of index2 " + str(index2_length)) - # print("Lane " + str(lane) + " [" + str(index1_length) + "," + str(index2_length) + "]") - - return index_length_dict - - -def create_sample_sheet_dict(service, barcodesPerLaneDict, containedSamples, samplesPerLaneDict, model, parentDict, index_length_dict, flowCellDict, - config_dict, index1Vocabulary, index2Vocabulary, flowCellName, logger): - - sampleSheetDict = {} - _10_run = False - separator = config_dict['separator'] - - for lane in containedSamples: - lane_sample_properties = get_lane_sample_properties(lane, service, config_dict) - lane_int = lane.getCode().split(':')[-1] - single_index_set = False - - try: - logger.info(barcodesPerLaneDict[lane_int]) - except: - print("No index found for lane " + str(lane_int) + ". Using the first sample which is not phix.") - for key in lane_sample_properties.keys(): - if lane_sample_properties[key][u'NCBI_ORGANISM_TAXONOMY'] != u'10847' and not single_index_set: - index1 = "" - lane_string = "" - if model in HISEQ_LIST or model in Sequencers.MISEQ: - lane_string = lane_int + separator - - line = separator.join([lane_string + key, key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]), "", "", "", "", key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - single_index_set = True - - - for key in lane_sample_properties.keys(): - - # If no index or 'NOINDEX' assigned then just skip this sample - if ((config_dict['index1Name'] not in lane_sample_properties[key] or lane_sample_properties[key][config_dict['index1Name']] == 'NOINDEX') and - config_dict['10XIndexSet'] not in lane_sample_properties[key]): - continue - - index1 = "" - index2 = "" - - if config_dict['index1Name'] in lane_sample_properties[key]: - index1 = lane_sample_properties[key][config_dict['index1Name']] - len_index1 = index_length_dict[int(lane_int)][0] - - if config_dict['10XIndexSet'] in lane_sample_properties[key]: - index1 = lane_sample_properties[key][config_dict['10XIndexSet']] - # Do not modify the index length, as these are index sets provided by 10x - len_index1 = len(index1) - _10_run = True - - if config_dict['index2Name'] in lane_sample_properties[key]: - index2 = lane_sample_properties[key][config_dict['index2Name']] - # Not needed, won't use it any more - indexNumber = index2Vocabulary[lane_sample_properties[key][config_dict['index2Name']]].split()[2] - - # try: - # kit = lane_sample_properties[key][config_dict['kit']] - # prefix = kitsDict[kit][0] - # except: - # prefix = "" - - len_index2 = index_length_dict[int(lane_int)][1] - - lane_string = "" - if model in HISEQ_LIST or model in Sequencers.MISEQ: - lane_string = lane_int + separator - - if int(flowCellDict['INDEXREAD2']) > 0 and len_index2 > 0: - if model in Sequencers.NEXTSEQ_500: - index2_processed = get_reverse_complement(index2[0:len_index2]) - else: - index2_processed = index2 - - line = separator.join([lane_string + key, - key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2], - "", "", "", index1[0:len_index1], "", index2_processed, key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - - else: - line = separator.join([lane_string + key, key + '_' + sanitize_string(lane_sample_properties[key][config_dict['externalSampleName']]) + '_' + index1[0:len_index1], - "", "", "", index1[0:len_index1], key, ""]) - sampleSheetDict[lane_int + '_' + key] = [line] - - csv_file_name = config_dict['SampleSheetFileName'] + '_' + flowCellName - ordered_sample_sheet_dict = OrderedDict(sorted(sampleSheetDict.items(), key=lambda t: t[0])) - - return _10_run, ordered_sample_sheet_dict, csv_file_name - -''' -Main script -''' - -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - config_dict = readConfig(logger) - service = login(logger, config_dict) - - foundFlowCell, containedSamples = get_flowcell(config_dict['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict, barcodesPerLaneDict = get_contained_sample_properties(containedSamples, service, config_dict) - flowCellName = foundFlowCell.getCode() - flowCellDict = transform_sample_to_dict(foundFlowCell) - model = get_model(flowCellDict['RUN_NAME_FOLDER']) - if not myoptions.verbose: - print("Auto-detected: " + model) - logger.info("Auto-detected: " + model) - - index1Vocabulary = get_vocabulary(config_dict['index1Name'], service) - index2Vocabulary = get_vocabulary(config_dict['index2Name'], service) - index_length_dict = verify_index_length(parentDict, flowCellDict, config_dict, logger) - _10_run, ordered_sample_sheet_dict, csv_file_name = create_sample_sheet_dict(service, barcodesPerLaneDict, containedSamples, - samplesPerLaneDict, model, parentDict, index_length_dict, - flowCellDict, config_dict, index1Vocabulary, index2Vocabulary, - flowCellName, logger) - if len(ordered_sample_sheet_dict) < len(containedSamples): - subject = "Warning: Creation of Sample Sheet (" + flowCellName + ") failed. No indices found." - body = "Warning: No parents/libraries assigned to one of the flowlanes of " + flowCellName + \ - ". Either it is a non-indexed lane or the parents are not set.\n" + \ - "Check in the following map for missing lanes:\n" + str(ordered_sample_sheet_dict) - send_email(config_dict['mailList'], flowCellName, config_dict, logger, subject, body) - else: - write_sample_sheet_single_lane(model, ordered_sample_sheet_dict, flowCellDict, index_length_dict, - parentDict, config_dict, myoptions, logger, csv_file_name) - if _10_run: - write_marker_file(flowCellDict, myoptions) - - logout(service, logger) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh deleted file mode 100755 index 5c44c2ff891..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Create Sample Sheet for Illumina NGS -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JYTHON_FILE=createSampleSheet_bcl2fastq.py - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" - -LIB="lib" -# echo "Starting Sample Sheet Creator for openBIS Illumina NGS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -cp ${LIB}/commons-codec.jar:${LIB}/commons-httpclient.jar:${LIB}/commons-logging.jar:${LIB}/dss_client.jar:${LIB}/spring.jar:${LIB}/stream-supporting-httpinvoker.jar:${LIB}/jython27-2.7.0.jar org.python27.util.jython $JYTHON_FILE "$@" diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py b/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py deleted file mode 100644 index 772faceddad..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_bcl2fastq_Test.py +++ /dev/null @@ -1,575 +0,0 @@ -import unittest -import re -# import pytest -from createSampleSheet_bcl2fastq import * - -def getTodayDate(): - from datetime import date - d = date.today() - return d.strftime("%m/%d/%Y") - - -class test_sanitize_string(unittest.TestCase): - - - def testDefault(self): - self.assertEqual(sanitize_string('abc#a$v%c^D&P-'), 'abc_a_v_c_D_P_') - - - def testOnlySpecialChars(self): - self.assertEqual(sanitize_string('@#$%^&*('), '_') - - -class test_get_model(unittest.TestCase): - - - def test_HiseqX(self): - self.assertEqual(get_model('141121_ST-E00107_0356_AH00C3CCXX'), Sequencers.HISEQ_X) - - - def test_expectError(self): - self.assertNotEqual(get_model('150724_J00121_0017_AH2VYMBBXX'), Sequencers.NEXTSEQ_500) - - -class test_get_reverse_complement(unittest.TestCase): - - - def test_happyCase(self): - self.assertEqual(get_reverse_complement('ACTGAATTTT'), 'AAAATTCAGT', 'Reverse complement is faulty') - - - def test_failingCase(self): - self.assertNotEqual(get_reverse_complement('ACTG'), 'CAGA') - - - -class create_sample_sheet_C7GMNANXX(unittest.TestCase): - """ - HiSeq 2500, PAIRED_END, Dual Index - - """ - - def setUp(self): - self.myCode = 'C7GMNANXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 8) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'D00535') - self.assertEqual(self.flowCellDict['FLOWCELLTYPE'], 'HiSeq Flow Cell v4') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_34778_C7GMNANXX_1']['BARCODE'], 'GTCCGC') - self.assertEqual(self.samplesPerLaneDict['2'], 23) - - - def test_get_vocabulary(self): - self.assertEqual(self.index1Vocabulary['CACTCAA'], 'Illumina A032 CACTCAA') - self.assertEqual(self.index2Vocabulary['GTAAGGAG'],'Index2 (i5) 505 GTAAGGAG') - - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {6: [6, 0], 5: [6, 0], 7: [8, 8], 8: [8, 8], 3: [8, 0], 2: [6, 0], 1: [6, 0], 4: [8, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.ordered_sample_sheet_dict['5_BSSE_QGF_32303_C7GMNANXX_5'] = \ - [u'5,BSSE_QGF_32303_C7GMNANXX_5,BSSE_QGF_32303_C7GMNANXX_5_TR_EG_1_GGCTAC,,,SureSelectXT,GGCTAC,BSSE_QGF_32303_C7GMNANXX_5,'] - - self.ordered_sample_sheet_dict['5_BSSE_QGF_36788_C7GMNANXX_5'] = \ - [u'5,BSSE_QGF_36788_C7GMNANXX_5,BSSE_QGF_36788_C7GMNANXX_5_G_33_run2_TAAGGC,,,N701,TAAGGC,BSSE_QGF_36788_C7GMNANXX_5,'] - - self.ordered_sample_sheet_dict['BSSE_QGF_32281_C7GMNANXX_8']= \ - [u'8,BSSE_QGF_32281_C7GMNANXX_8,BSSE_QGF_32281_C7GMNANXX_8_F2_18_3_P162Nextera_TAGGCATG_CTATTAAG,,,N706,TAGGCATG,518,CTATTAAG,BSSE_QGF_32281_C7GMNANXX_8,'] - - - def test_create_header_section(self): - - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 5) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', - 'Project Name,Genomics Facility Basel', u'Experiment Name,C7GMNANXX', - 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_126', 'Chemistry,Default', '', '[Reads]', - u'126', u'126', '', '[Settings]', '', '[Data]', - 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 8) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,C7GMNANXX', 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_126', 'Chemistry,Default', '', '[Reads]', u'126', u'126', '', - '[Settings]', '', '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description']) - - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - - - - - -class create_sample_sheet_C7P5KANXX(unittest.TestCase): - """ - HiSeq 2500, SINGLE_READ, Dual Index - - """ - - - def setUp(self): - self.myCode = 'C7P5KANXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 8) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'D00404') - self.assertEqual(self.flowCellDict['FLOWCELLTYPE'], 'HiSeq Flow Cell v4') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_36781_C7P5KANXX_8']['BARCODE'], 'CTTGTAA') - self.assertEqual(self.parentDict['BSSE_QGF_36779_C7P5KANXX_8']['NCBI_ORGANISM_TAXONOMY'], '10090') - self.assertEqual(self.samplesPerLaneDict['8'], 6) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {6: [8, 8], 5: [8, 8], 7: [8, 8], 8: [7, 7], 3: [8, 8], 2: [8, 8], 1: [8, 8], 4: [8, 8]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'8_BSSE_QGF_36781_C7P5KANXX_8': [u'8,BSSE_QGF_36781_C7P5KANXX_8,BSSE_QGF_36781_C7P5KANXX_8_Ribomethseq_mousecerebellum_comparison_CTTGTAA_NOINDEX,,,,CTTGTAA,,NOINDEX,BSSE_QGF_36781_C7P5KANXX_8,'], - u'8_BSSE_QGF_36780_C7P5KANXX_8': [u'8,BSSE_QGF_36780_C7P5KANXX_8,BSSE_QGF_36780_C7P5KANXX_8_Ribomethseq_HEK_comparison_GCCAATA_NOINDEX,,,,GCCAATA,,NOINDEX,BSSE_QGF_36780_C7P5KANXX_8,'], - u'8_BSSE_QGF_36552_C7P5KANXX_8': [u'8,BSSE_QGF_36552_C7P5KANXX_8,BSSE_QGF_36552_C7P5KANXX_8_CLIP_444_1_TGACCAA_NOINDEX,,,,TGACCAA,,NOINDEX,BSSE_QGF_36552_C7P5KANXX_8,'], - u'8_BSSE_QGF_36779_C7P5KANXX_8': [u'8,BSSE_QGF_36779_C7P5KANXX_8,BSSE_QGF_36779_C7P5KANXX_8_HITS_CLIP_Fibrillarin_mouseNeurons_2_CAGATCA_NOINDEX,,,,CAGATCA,,NOINDEX,BSSE_QGF_36779_C7P5KANXX_8,']}) - - - def test_create_header_section(self): - self.date = getTodayDate() - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, 5) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', - 'Project Name,Genomics Facility Basel', u'Experiment Name,C7P5KANXX', - 'Date,'+ self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_51', 'Chemistry,Default', '', - '[Reads]', u'51', '', '[Settings]', '', '[Data]', - 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,I5_Index_ID,index2,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -class create_sample_sheet_HJWC3BGXX(unittest.TestCase): - """ - NextSeq, SINGLE_READ, Single index - """ - - - def setUp(self): - self.myCode = 'HJWC3BGXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 1) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'NS500318') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '2.4.6') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_37091_HJWC3BGXX_1']['BARCODE'], 'AGTCAAC') - self.assertEqual(self.parentDict['BSSE_QGF_37100_HJWC3BGXX_1']['NCBI_ORGANISM_TAXONOMY'], '9606') - self.assertEqual(self.samplesPerLaneDict['1'], 18) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict, {3: [6, 0], 2: [6, 0], 1: [6, 0], 4: [6, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_37098_HJWC3BGXX_1': [u'BSSE_QGF_37098_HJWC3BGXX_1,BSSE_QGF_37098_HJWC3BGXX_1_TB_358_PQR_2_0_GTTTCG,,,,GTTTCG,BSSE_QGF_37098_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37093_HJWC3BGXX_1': [u'BSSE_QGF_37093_HJWC3BGXX_1,BSSE_QGF_37093_HJWC3BGXX_1_TB_356_PQR_1_0_ATGTCA,,,,ATGTCA,BSSE_QGF_37093_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37094_HJWC3BGXX_1': [u'BSSE_QGF_37094_HJWC3BGXX_1,BSSE_QGF_37094_HJWC3BGXX_1_TB_357_BKM_1_0_CCGTCC,,,,CCGTCC,BSSE_QGF_37094_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37095_HJWC3BGXX_1': [u'BSSE_QGF_37095_HJWC3BGXX_1,BSSE_QGF_37095_HJWC3BGXX_1_TB_356_MTD_1_0_GTCCGC,,,,GTCCGC,BSSE_QGF_37095_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37087_HJWC3BGXX_1': [u'BSSE_QGF_37087_HJWC3BGXX_1,BSSE_QGF_37087_HJWC3BGXX_1_TB_355_DMSO1_GATCAG,,,,GATCAG,BSSE_QGF_37087_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37096_HJWC3BGXX_1': [u'BSSE_QGF_37096_HJWC3BGXX_1,BSSE_QGF_37096_HJWC3BGXX_1_TB_358_GDC_1_0_GTGAAA,,,,GTGAAA,BSSE_QGF_37096_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37092_HJWC3BGXX_1': [u'BSSE_QGF_37092_HJWC3BGXX_1,BSSE_QGF_37092_HJWC3BGXX_1_TB_357_COL_0_05_AGTTCC,,,,AGTTCC,BSSE_QGF_37092_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37088_HJWC3BGXX_1': [u'BSSE_QGF_37088_HJWC3BGXX_1,BSSE_QGF_37088_HJWC3BGXX_1_TB_355_PQR_0_5_TAGCTT,,,,TAGCTT,BSSE_QGF_37088_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37089_HJWC3BGXX_1': [u'BSSE_QGF_37089_HJWC3BGXX_1,BSSE_QGF_37089_HJWC3BGXX_1_TB_359_BKM_0_5_1_GGCTAC,,,,GGCTAC,BSSE_QGF_37089_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37101_HJWC3BGXX_1': [u'BSSE_QGF_37101_HJWC3BGXX_1,BSSE_QGF_37101_HJWC3BGXX_1_TB_357_GDC_2_0_ACTGAT,,,,ACTGAT,BSSE_QGF_37101_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37090_HJWC3BGXX_1': [u'BSSE_QGF_37090_HJWC3BGXX_1,BSSE_QGF_37090_HJWC3BGXX_1_TB_358_MTD_0_5_CTTGTA,,,,CTTGTA,BSSE_QGF_37090_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37099_HJWC3BGXX_1': [u'BSSE_QGF_37099_HJWC3BGXX_1,BSSE_QGF_37099_HJWC3BGXX_1_TB_360_BKM_2_0_1_CGTACG,,,,CGTACG,BSSE_QGF_37099_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37091_HJWC3BGXX_1': [u'BSSE_QGF_37091_HJWC3BGXX_1,BSSE_QGF_37091_HJWC3BGXX_1_TB_358_GDC_0_5_AGTCAA,,,,AGTCAA,BSSE_QGF_37091_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37102_HJWC3BGXX_1': [u'BSSE_QGF_37102_HJWC3BGXX_1,BSSE_QGF_37102_HJWC3BGXX_1_TB_361_COL_0_2_1_ATTCCT,,,,ATTCCT,BSSE_QGF_37102_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37100_HJWC3BGXX_1': [u'BSSE_QGF_37100_HJWC3BGXX_1,BSSE_QGF_37100_HJWC3BGXX_1_TB_357_MTD_2_0_GAGTGG,,,,GAGTGG,BSSE_QGF_37100_HJWC3BGXX_1,'], - u'1_BSSE_QGF_37097_HJWC3BGXX_1': [u'BSSE_QGF_37097_HJWC3BGXX_1,BSSE_QGF_37097_HJWC3BGXX_1_TB_358_COL_0_1_GTGGCC,,,,GTGGCC,BSSE_QGF_37097_HJWC3BGXX_1,']}) - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,HJWC3BGXX', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_81', 'Chemistry,Default', '', '[Reads]', u'81', '', '[Settings]', '', - '[Data]', 'Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -class create_sample_sheet_000000000_AH5W3(unittest.TestCase): - """ - MiSeq, PAIRED_END, Single Index - """ - - - def setUp(self): - self.myCode = '000000000-AH5W3' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'true'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 1) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], 'M01761') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '1.18.54') - - - def test_get_contained_sample_properties(self): - self.assertEqual(self.parentDict['BSSE_QGF_36763_000000000_AH5W3_1']['BARCODE'], 'ATGTCAG') - self.assertEqual(self.parentDict['BSSE_QGF_36761_000000000_AH5W3_1']['NCBI_ORGANISM_TAXONOMY'], '10090') - self.assertEqual(self.samplesPerLaneDict['1'], 10) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict,{1: [6, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_36763_000000000_AH5W3_1': [u'1,BSSE_QGF_36763_000000000_AH5W3_1,BSSE_QGF_36763_000000000_AH5W3_1_H7_PRE_Idx_15_ATGTCA,,,,ATGTCA,BSSE_QGF_36763_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36765_000000000_AH5W3_1': [u'1,BSSE_QGF_36765_000000000_AH5W3_1,BSSE_QGF_36765_000000000_AH5W3_1_H8_NBC_Idx_16_CCGTCC,,,,CCGTCC,BSSE_QGF_36765_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36768_000000000_AH5W3_1': [u'1,BSSE_QGF_36768_000000000_AH5W3_1,BSSE_QGF_36768_000000000_AH5W3_1_H8_BMPC_Idx_19_GTGAAA,,,,GTGAAA,BSSE_QGF_36768_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36767_000000000_AH5W3_1': [u'1,BSSE_QGF_36767_000000000_AH5W3_1,BSSE_QGF_36767_000000000_AH5W3_1_H8_PRE_Idx_20_GTGGCC,,,,GTGGCC,BSSE_QGF_36767_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36766_000000000_AH5W3_1': [u'1,BSSE_QGF_36766_000000000_AH5W3_1,BSSE_QGF_36766_000000000_AH5W3_1_H8_SPC_Idx_18_GTCCGC,,,,GTCCGC,BSSE_QGF_36766_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36761_000000000_AH5W3_1': [u'1,BSSE_QGF_36761_000000000_AH5W3_1,BSSE_QGF_36761_000000000_AH5W3_1_H7_NBC_Idx_12_CTTGTA,,,,CTTGTA,BSSE_QGF_36761_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36762_000000000_AH5W3_1': [u'1,BSSE_QGF_36762_000000000_AH5W3_1,BSSE_QGF_36762_000000000_AH5W3_1_H7_SPC_Idx_13_AGTCAA,,,,AGTCAA,BSSE_QGF_36762_000000000_AH5W3_1,'], - u'1_BSSE_QGF_36764_000000000_AH5W3_1': [u'1,BSSE_QGF_36764_000000000_AH5W3_1,BSSE_QGF_36764_000000000_AH5W3_1_H7_BMPC_Idx_14_AGTTCC,,,,AGTTCC,BSSE_QGF_36764_000000000_AH5W3_1,']}) - - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,000000000-AH5W3', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,PAIRED_END_301', 'Chemistry,Default', '', '[Reads]', u'301', u'301', '', '[Settings]', '', - '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - - -class create_sample_sheet_H32NFBCXX(unittest.TestCase): - """ - HiSeq 2500 Rapid Run with no indices - """ - - - def setUp(self): - self.myCode = 'H32NFBCXX' - self.logger = setUpLogger('log/') - self.config_dict = readConfig(self.logger) - - import argparse - import shlex - parser = argparse.ArgumentParser() - - parser.add_argument('--flowcell') - parser.add_argument('--lineending') - parser.add_argument('--outdir') - parser.add_argument('--verbose') - - cmd_string = ['--flowcell', self.myCode, '--lineending', 'win32', '--outdir', '../../targets/playground', '--verbose', 'false'] - self.options = parser.parse_args(cmd_string) - - self.service = OpenbisServiceFacadeFactory.tryCreate(self.config_dict['openbisUserName'], - self.config_dict['openbisPassword'], - self.config_dict['openbisServer'], - self.config_dict['connectionTimeout']) - - self.flowcell, self.containedSamples = get_flowcell('ILLUMINA_FLOW_CELL', - self.myCode, self.service, self.logger) - self.flowCellDict = transform_sample_to_dict(self.flowcell) - self.parentDict, self.samplesPerLaneDict, self.barcodesPerLaneDict = get_contained_sample_properties( - self.containedSamples, self.service, self.config_dict) - self.flowCellName = self.flowcell.getCode() - self.index1Vocabulary = get_vocabulary(self.config_dict['index1Name'], self.service) - self.index2Vocabulary = get_vocabulary(self.config_dict['index2Name'], self.service) - self.index_length_dict = verify_index_length(self.parentDict, self.flowCellDict, self.config_dict, self.logger) - - - def test_get_flowCell (self): - self.assertEqual(self.flowcell.getCode(), self.myCode) - self.assertEqual(self.containedSamples.size(), 2) - - fcProp = self.flowcell.getProperties() - self.assertEqual(fcProp['SEQUENCER'], u'D00535') - self.assertEqual(self.flowCellDict['ILLUMINA_PIPELINE_VERSION'], '1.18.64') - - - def test_get_contained_sample_properties(self): - self.assertNotIn(self.parentDict['BSSE_QGF_29352_H32NFBCXX_1'],['BARCODE']) -# self.assertEqual(self.parentDict['BSSE_QGF_29352_H32NFBCXX_1']['NCBI_ORGANISM_TAXONOMY'], '32644') -# self.assertEqual(self.samplesPerLaneDict['1'], 2) - - def test_verify_index_length(self): - self.assertDictEqual(self.index_length_dict,{1: [7, 0], 2:[7, 0]}) - - - def test_create_sample_sheet_dict(self): - - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - self.assertDictEqual(self.ordered_sample_sheet_dict, - {u'1_BSSE_QGF_29352_H32NFBCXX_1': [u'1,BSSE_QGF_29352_H32NFBCXX_1,BSSE_QGF_29352_H32NFBCXX_1_Lib_Amph_4,,,,,BSSE_QGF_29352_H32NFBCXX_1,'], - u'2_BSSE_QGF_29352_H32NFBCXX_2': [u'2,BSSE_QGF_29352_H32NFBCXX_2,BSSE_QGF_29352_H32NFBCXX_2_Lib_Amph_4,,,,,BSSE_QGF_29352_H32NFBCXX_2,']}) - - def test_create_header_section(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - lane = 1 - self.date = getTodayDate() - self.create_header_section = create_header_section(self.model, self.config_dict, self.parentDict, self.flowCellDict, self.index_length_dict, lane) - self.assertListEqual(self.create_header_section, ['[Header]', 'IEMFileVersion,4', 'Investigator Name,ETHZ_D-BSSE', 'Project Name,Genomics Facility Basel', - u'Experiment Name,H32NFBCXX', 'Date,' + self.date, 'Workflow,GenerateFASTQ', 'Application,FASTQ Only', - 'Assay,', u'Description,SINGLE_READ_201', 'Chemistry,Default', '', '[Reads]', u'201', '', '[Settings]', '', - '[Data]', 'Lane,Sample_ID,Sample_Name,Sample_Plate,Sample_Well,I7_Index_ID,index,Sample_Project,Description']) - - def test_write_sample_sheet_single_lane(self): - self.model = get_model(self.flowCellDict['RUN_NAME_FOLDER']) - - self.ordered_sample_sheet_dict, self.csv_file_name = create_sample_sheet_dict(self.service, self.barcodesPerLaneDict, self.containedSamples, self.samplesPerLaneDict, self.model, self.parentDict, - self.index_length_dict, self.flowCellDict, self.config_dict, self.index1Vocabulary, - self.index2Vocabulary, self.flowCellName, self.logger) - - write_sample_sheet_single_lane(self.model, self.ordered_sample_sheet_dict, self.flowCellDict, self.index_length_dict, - self.parentDict, self.config_dict, self.options, self.logger, self.csv_file_name) - - def tearDown(self): - self.service.logout() - self.logger.info('Logged out') - - -def main(): - unittest.main() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py deleted file mode 100644 index 558b4a74816..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_miseq.py +++ /dev/null @@ -1,589 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - configMap['kit'] = configParameters.get(OPENBIS, 'kit') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionSingleRead') - configMap['miSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionDualRead') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - configMap['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def createMiSeqSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A","TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A","TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A","TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["",""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A","TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["",""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["",""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["",""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - sampleSheetDict = {} - headerList = [] - - # here we take the fisrat sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[configMap['kit']]][1] - except: - print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - pass - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + assay) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) - if ('nextera' in assay.lower()): - headerList.append(configMap['nexteraAdapter']) - if ('truseq' in assay.lower()): - headerList.append(configMap['truSeqAdapter1']) - headerList.append(configMap['truSeqAdapter2']) - headerList.append('') - - if int(flowCellDict['INDEXREAD2']) > 0: - miSeqDataSection = configMap['miSeqDataSectionDualRead'].split(',') - else: - miSeqDataSection = configMap['miSeqDataSectionSingleRead'].split(',') - - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if configMap['index1Name'] not in parentDict[key]: - continue - index1 = parentDict[key][configMap['index1Name']] - - if configMap['index2Name'] in parentDict[key]: - index2 = parentDict[key][configMap['index2Name']] - indexNumber = index2Vocabulary[parentDict[key][configMap['index2Name']]].split()[2] - - try: - kit = parentDict[key][configMap['kit']] - prefix = kitsDict[kit][0] - except: - print "Missing Kit on " + str(key) - prefix = "" - - len_index1 = int(flowCellDict['INDEXREAD']) - len_index2 = int(flowCellDict['INDEXREAD2']) - - if int(flowCellDict['INDEXREAD2']) > 0: - sampleSheetDict[lane + '_' + key] = [key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + prefix + indexNumber + separator - + get_reverse_complement(index2[0:len_index2]) + separator - + key + separator - ] - else: - sampleSheetDict[lane + '_' + key] = [key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + key + separator - ] - - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - elif len(flowCellName) > 12: - flowCellName = flowCellName.split('_')[3][1:] - else: - pass - - flowCellDict = convertSampleToDict(foundFlowCell) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - - index1Vocabulary = getVocabulary(configMap['index1Name'], service) - index2Vocabulary = getVocabulary(configMap['index2Name'], service) - SampleSheetFile = createMiSeqSampleSheet(parentDict, flowCellDict, configMap, - index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py b/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py deleted file mode 100644 index fa1517dbac0..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_nextseq.py +++ /dev/null @@ -1,596 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from email.MIMEMultipart import MIMEMultipart -from email.MIMEBase import MIMEBase -from email.MIMEText import MIMEText -from email.Utils import COMMASPACE, formatdate -from email import Encoders - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-m', '--mailist', - dest='maillist', - default=False, - action='store_true', - help='Generated Sample Sheet will be addtionally sent as email to the defined list of recipients', - metavar='<maillist>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='win32', - help='Specify end of line separator: win32, linux, mac. Default: win32' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-s', '--singlelane', - dest='singlelane', - default=False, - action='store_true', - help='Creates a single Sample Sheet for each lane. Default: False') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(propertyFile='etc/createSampleSheet.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['SampleSheetFileName'] = configParameters.get(GENERAL, 'SampleSheetFileName') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['index1Length'] = configParameters.get(OPENBIS, 'index1Length') - configMap['index2Length'] = configParameters.get(OPENBIS, 'index2Length') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['cycles'] = configParameters.get(OPENBIS, 'cycles') - configMap['controlLane'] = configParameters.get(OPENBIS, 'controlLane') - configMap['ncbi'] = configParameters.get(OPENBIS, 'ncbi') - configMap['externalSampleName'] = configParameters.get(OPENBIS, 'externalSampleName') - configMap['laneCount'] = configParameters.get(OPENBIS, 'laneCount') - configMap['kit'] = configParameters.get(OPENBIS, 'kit') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['miSeqNames'] = configParameters.get(ILLUMINA, 'miSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - configMap['miSeqHeaderSection'] = configParameters.get(ILLUMINA, 'miSeqHeaderSection') - configMap['miSeqReadsSection'] = configParameters.get(ILLUMINA, 'miSeqReadsSection') - configMap['miSeqSettingsSection'] = configParameters.get(ILLUMINA, 'miSeqSettingsSection') - configMap['miSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionSingleRead') - configMap['miSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'miSeqDataSectionDualRead') - configMap['miSeqWorkflow'] = configParameters.get(ILLUMINA, 'miSeqWorkflow') - configMap['miSeqApplication'] = configParameters.get(ILLUMINA, 'miSeqApplication') - configMap['miSeqChemistry'] = configParameters.get(ILLUMINA, 'miSeqChemistry') - - configMap['nextSeqDataSectionSingleRead'] = configParameters.get(ILLUMINA, 'nextSeqDataSectionSingleRead') - configMap['nextSeqDataSectionDualRead'] = configParameters.get(ILLUMINA, 'nextSeqDataSectionDualRead') - - configMap['truSeqAdapter1'] = configParameters.get(ILLUMINA, 'truSeqAdapter1') - configMap['truSeqAdapter2'] = configParameters.get(ILLUMINA, 'truSeqAdapter2') - configMap['nexteraAdapter'] = configParameters.get(ILLUMINA, 'nexteraAdapter') - configMap['iemFileVersion'] = configParameters.get(ILLUMINA, 'iemFileVersion') - - configMap['configureBclToFastqPath'] = configParameters.get(ILLUMINA, 'configureBclToFastqPath') - configMap['failedReads'] = configParameters.get(ILLUMINA, 'failedReads') - configMap['clusterCount'] = configParameters.get(ILLUMINA, 'clusterCount') - configMap['clusterCountNumber'] = configParameters.get(ILLUMINA, 'clusterCountNumber') - configMap['outputDir'] = configParameters.get(ILLUMINA, 'outputDir') - configMap['sampleSheetName'] = configParameters.get(ILLUMINA, 'sampleSheetName') - configMap['baseMask'] = configParameters.get(ILLUMINA, 'baseMask') - - return configMap - -def getDate(): - d = datetime.now() - return d.strftime('%A, %d of %B %Y') - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode, service): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def sendMail(emails, files, flowCellName, configMap, logger): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ', ' - listofEmails = emails.split() - - msg = MIMEMultipart() - msg['From'] = configMap['mailFrom'] - msg['To'] = COMMASPACE.join(listofEmails) - msg['Date'] = formatdate(localtime=True) - msg['Subject'] = 'Generated Sample Sheet for flowcell ' + flowCellName - - msg.attach(MIMEText('Sample Sheet for ' + flowCellName + ' attached.')) - - for f in files: - part = MIMEBase('application', 'octet-stream') - part.set_payload(open(f, 'rb').read()) - Encoders.encode_base64(part) - part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(f)) - msg.attach(part) - - smtp = smtplib.SMTP(configMap['smptHost']) - smtp.sendmail(configMap['mailFrom'], listofEmails, msg.as_string()) - smtp.close() - logger.info('Sent email to ' + COMMASPACE.join(listofEmails)) - - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow lanes found which match.') - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(containedSamples, service): - - # TODO: update description and function name - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - - Additionally a dictionary with the lane (key) and the number of samples (value) is returned - ''' - parentDict = {} - samplesPerLaneDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - try: - assert parents.size() >= 1 - except AssertionError: - print (str(parents.size()) + ' parents found for lane ' + lane.getCode()) - - samplesPerLaneDict[lane.getCode()[-1]] = len(parents) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - parentDict[myKey] = propertyDict - - return parentDict, samplesPerLaneDict - - -def convertSampleToDict(foundFlowCell): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Project'] = foundFlowCell.getExperimentIdentifierOrNull().split('/')[-1] - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - return flowCellDict - - -def pickleDemultiplexCommandList(logger, demultiplexCommandList, fileName): - import pickle - - try: - with open(fileName, 'w') as pickleDemux: - pickle.dump(demultiplexCommandList, pickleDemux) - logger.info('Writing file ' + fileName) - except IOError, err: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, myoptions, logger, fileName): - ''' - Writes the given dictionary to a csv file. The order does not matter. As the header is not fixed - we first need to write the headerList in the file. This is specific to MiSeq - ''' - newline = lineending[myoptions.lineending] - try: - with open(fileName, 'wb') as sampleSheetFile: - for listElement in headerList: - if myoptions.verbose: - print listElement - sampleSheetFile.write(listElement + newline) - for sample in sampleSheetDict: - if myoptions.verbose: - print sampleSheetDict[sample][0] - sampleSheetFile.write(sampleSheetDict[sample][0] + newline) - - logger.info('Writing file ' + fileName) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - return fileName - -def get_reverse_complement(sequence): - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement = '' - for nucleotide in reversed(sequence): - reverse_complement += lookup_table[nucleotide] - return reverse_complement - - -def createSampleSheet(parentDict, flowCellDict, configMap, index1Vocabulary, index2Vocabulary, - flowCellName, logger, myoptions): - ''' - ''' - - kitsDict = {"CHIP_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQ_RNA_SAMPLEPREPKIT_V2_ILLUMINA" : ["A","TruSeq LT"], - "NEXTERA_XT_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["S", "Nextera XT"], - "TRUSEQ_CHIP_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "MRNA_SEQ_SAMPLE_PREP" : ["",""], - "TRUSEQRNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1" : ["A","TruSeq LT"], - "NEBNEXT_CHIP-SEQ_LIBRARY_PREP_REAGENT_SET" : ["A","TruSeq LT"], - "RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "NEXTERA_DNA_SAMPLE_PREPARATION_KIT_ILLUMINA" : ["N", "Nextera"], - "GENOMICDNA_SAMPLE_PREP" : ["",""], - "AGILENT_SURESELECTXT_AUTOMATEDLIBRARYPREP" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT" : ["A","TruSeq LT"], - "NEXTERA_DNA_SAMPLE_PREP_KITS" : ["N", "Nextera"], - "AGILENT_SURESELECT_ENRICHMENTSYSTEM" : ["",""], - "TRUSEQ_DNA_SAMPLE_PREP_KIT_V2" : ["A","TruSeq LT"], - "AGILENT_SURESELECT_HUMAN_ALL_EXON_V5_UTRS" : ["",""], - "POLYA_SCRIPTSEQ_MRNA-SEQ_KIT" : ["",""], - "AGILENT_SURESELECTXT2_MOUSE_ALL_EXON" : ["",""], - "PAIRED_END_DNA_SAMPLE_PREP" : ["",""], - "NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW" : ["N", "Nextera"] - } - - sampleSheetDict = {} - headerList = [] - - # here we take the fisrat sample to determine the Sample Prep Kit - try: - assay = kitsDict [parentDict.itervalues().next()[configMap['kit']]][1] - except: - print "No Kit set for sample. Will not set the assay value in the sample sheet" - assay = "" - pass - - separator = configMap['separator'] - - miSeqHeaderSection = configMap['miSeqHeaderSection'].split(separator) - miSeqHeaderSection.reverse() - headerList = [miSeqHeaderSection.pop().strip()] - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['iemFileVersion']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityInstitution']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['facilityName']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict['Name']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + datetime.now().strftime('%m/%d/%Y')) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqWorkflow']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqApplication']) - headerList.append(miSeqHeaderSection.pop().strip() + separator + assay) - headerList.append(miSeqHeaderSection.pop().strip() + separator + flowCellDict[configMap['endType']] + '_' + flowCellDict[configMap['cycles']]) - headerList.append(miSeqHeaderSection.pop().strip() + separator + configMap['miSeqChemistry']) - headerList.append('') - - miSeqReadsSection = configMap['miSeqReadsSection'].split(separator) - miSeqReadsSection.reverse() - headerList.append(miSeqReadsSection.pop()) - headerList.append(flowCellDict[configMap['cycles']]) - if (flowCellDict[configMap['endType']] == 'PAIRED_END'): - headerList.append(flowCellDict[configMap['cycles']]) - headerList.append('') - - miSeqSettingsSection = configMap['miSeqSettingsSection'].split(separator) - miSeqSettingsSection.reverse() - headerList.append(miSeqSettingsSection.pop()) - if ('nextera' in assay.lower()): - headerList.append(configMap['nexteraAdapter']) - if ('truseq' in assay.lower()): - headerList.append(configMap['truSeqAdapter1']) - headerList.append(configMap['truSeqAdapter2']) - headerList.append('') - - if int(flowCellDict['INDEXREAD2']) > 0: - miSeqDataSection = configMap['nextSeqDataSectionDualRead'].split(',') - else: - miSeqDataSection = configMap['nextSeqDataSectionSingleRead'].split(',') - - miSeqDataSection.reverse() - headerList.append(miSeqDataSection.pop()) - headerList.append(','.join(miSeqDataSection.pop().strip().split())) - - for key in parentDict.keys(): - lane = parentDict[key]['LANE'][-1:] - # If no index then just skip this sample - if (configMap['index1Name'] not in parentDict[key]) or (parentDict[key][configMap['index1Name']] == 'NOINDEX'): - continue - index1 = parentDict[key][configMap['index1Name']] - - if configMap['index2Name'] in parentDict[key]: - index2 = parentDict[key][configMap['index2Name']] - indexNumber = index2Vocabulary[parentDict[key][configMap['index2Name']]].split()[2] - - try: - kit = parentDict[key][configMap['kit']] - prefix = kitsDict[kit][0] - except: - print "Missing Kit on " + str(key) - prefix = "" - - len_index1 = int(flowCellDict['INDEXREAD']) - len_index2 = int(flowCellDict['INDEXREAD2']) - - if int(flowCellDict['INDEXREAD2']) > 0: - sampleSheetDict[lane + '_' + key] = [ - lane + separator - + key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + '_' + index2[0:len_index2] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + prefix + indexNumber + separator - + get_reverse_complement(index2[0:len_index2]) + separator - + key + separator - ] - else: - sampleSheetDict[lane + '_' + key] = [ - lane + separator - + key + separator - + key + '_' + sanitizeString(parentDict[key][configMap['externalSampleName']]) + '_' + index1[0:len_index1] + separator - + separator - + separator - + index1Vocabulary[index1].split()[1] + separator - + index1[0:len_index1] + separator - + key + separator - ] - - myFileName = myoptions.outdir + configMap['SampleSheetFileName'] + '_' + \ - flowCellName + '.csv' - - sampleSheetFile = writeMiSeqSampleSheet(sampleSheetDict, headerList, flowCellName, - myoptions, logger, fileName=myFileName) - return sampleSheetFile - -''' -Main script -''' -def main (): - - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(logger, configMap) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, - service, logger) - parentDict, samplesPerLaneDict = getContainedSampleProperties(containedSamples, service) - logger.info('Found ' + str(len(parentDict)) + ' samples on the flow cell ' + flowCellName) - - flowCellName = foundFlowCell.getCode() - if '-' in flowCellName: - flowCellName = flowCellName.split('_')[3] - elif len(flowCellName) > 12: - flowCellName = flowCellName.split('_')[3][1:] - else: - pass - - flowCellDict = convertSampleToDict(foundFlowCell) - - hiseqList = configMap['hiSeqNames'].split() - miseqList = configMap['miSeqNames'].split() - - runFolderName = flowCellDict['Name'] - - index1Vocabulary = getVocabulary(configMap['index1Name'], service) - index2Vocabulary = getVocabulary(configMap['index2Name'], service) - SampleSheetFile = createSampleSheet(parentDict, flowCellDict, configMap, - index1Vocabulary, index2Vocabulary, flowCellName, logger, myoptions) - - if myoptions.maillist: - sendMail(configMap['mailList'], [SampleSheetFile], flowCellName, configMap, logger) - - logout(service, logger) - - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py b/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py deleted file mode 100644 index a6da0077a0a..00000000000 --- a/deep_sequencing_unit/source/Jython/createSampleSheet_nov.py +++ /dev/null @@ -1,409 +0,0 @@ -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the 'License'); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an 'AS IS' BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler - -@description: -Creates the SampleSheet.csv out of values from openBIS for Demultiplexing -used in the Illumina pipeline (configureBclToFastq.pl) - -@attention: -Runs under Jython - -@note: -Takes into account to replace special characters with an underscore so that the Illumina script -does not fail - -HiSeq Header Description -======================== -Column Header Description -FCID Flow cell ID -Lane Positive integer, indicating the lane number (1-8) -SampleID ID of the sample -SampleRef The reference used for alignment for the sample -Index Index sequences. Multiple index reads are separated by a hyphen (for example, ACCAGTAA-GGACATGA). -Description Description of the sample -Control Y indicates this lane is a control lane, N means sample -Recipe Recipe used during sequencing -Operator Name or ID of the operator -SampleProject The project the sample belongs to -''' - -from __future__ import with_statement -import os -import logging -import re -import sys -import string -import smtplib -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from datetime import * - -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet - -lineending = {'win32':'\r\n', 'linux':'\n', 'mac':'\r'} -COMMA = ',' - -def login(configMap, logger): - logger.info('Logging into ' + configMap['openbisServer']) - try: - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - except: - raise ('Could not connect to ' + configMap['openbisServer'] + '. Please check if the server ' + - 'address is OK, the firewall is not blocking the communication or openBIS is down.') - - return service - -def logout (service, logger): - service.logout() - logger.info('Logged out') - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createSampleSheet' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-l', '--lineending', - dest='lineending', - type='choice', - action='store', - choices=['win32', 'linux', 'mac'], - default='linux', - help='Specify end of line separator: win32, linux, mac. Default: linux' , - metavar='<lineending>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - parser.add_option('-v', '--verbose', - dest='verbose', - default=False, - action='store_true', - help='Write Sample Sheet to stout. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - -def parseConfigurationFile(logger, propertyFile='etc/createSampleSheet_nov.properties'): - ''' - Parses the given config files and returns the values - ''' - logger.info('Reading config file ' + propertyFile) - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - ILLUMINA = 'ILLUMINA' - - configMap = {} - - configParameters = parseConfigurationFile(logger) - - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['sampleSheetFileName'] = configParameters.get(GENERAL, 'sampleSheetFileName') - configMap['lanePrefix'] = configParameters.get(GENERAL, 'lanePrefix') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['illuminaFlowCellTypeName'] = configParameters.get(OPENBIS, 'illuminaFlowCellTypeName') - configMap['index1Name'] = configParameters.get(OPENBIS, 'index1Name') - configMap['index2Name'] = configParameters.get(OPENBIS, 'index2Name') - configMap['species'] = configParameters.get(OPENBIS, 'species') - configMap['sampleName'] = configParameters.get(OPENBIS, 'sampleName') - configMap['operator'] = configParameters.get(OPENBIS, 'operator') - configMap['endType'] = configParameters.get(OPENBIS, 'endType') - configMap['readLength'] = configParameters.get(OPENBIS, 'readLength') - configMap['lengthIndex1'] = configParameters.get(OPENBIS, 'lengthIndex1') - configMap['lengthIndex2'] = configParameters.get(OPENBIS, 'lengthIndex2') - configMap['gaNumber'] = configParameters.get(OPENBIS, 'gaNumber') - - configMap['hiSeqNames'] = configParameters.get(ILLUMINA, 'hiSeqNames') - configMap['hiSeqHeader'] = configParameters.get(ILLUMINA, 'hiSeqHeader') - - return configMap - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary terms and vocabulary labels of a vocabulary in a dictionary - specified by the parameter vocabularyCode - ''' - terms = [] - vocabularies = service.listVocabularies() - vocabularyDict = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - if terms: - for term in terms: - vocabularyDict[term.getCode()] = term.getLabel() - else: - print ('No vocabulary found for ' + vocabularyCode) - return vocabularyDict - -def getFlowCell (illuminaFlowCellTypeName, flowCellName, service, logger): - ''' - Getting the the matching FlowCell - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, illuminaFlowCellTypeName)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSample = service.searchForSamples(sc) - try: - assert foundSample.size() == 1 - except AssertionError: - print (str(foundSample.size()) + ' flow cells found which match.') - exit(1) - - logger.info('Found ' + foundSample[0].getCode() + ' in openBIS') - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = service.searchForSamples(sampleSc) - - return foundSample[0], foundContainedSamples - - -def getParents(sampleName, service): - ''' - Returns a list of parents of a sample - ''' - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSample = service.searchForSamples(sc) - - # set the criteria for getting the parents when providing the child name - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleChildCriteria(sc)) - foundParentSamples = service.searchForSamples(sampleSc) - - return foundParentSamples - -def getContainedSampleProperties(logger, containedSamples, service): - ''' - Takes a list of contained samples, retrieves the parents and their properties and returns it - as a dictionary. The key is the sample name, the value is a list of the properties - ''' - laneParentDict = {} - - for lane in containedSamples: - parents = getParents (lane.getCode(), service) - - for parent in parents: - parentCode = parent.getCode() - parentProperties = parent.getProperties() - - propertyDict = {} - for property in parentProperties: - propertyDict[property] = parentProperties.get(property) - - propertyDict['LANE'] = lane.getCode() - propertyDict['SAMPLE_TYPE'] = parent.getSampleTypeCode() - myKey = sanitizeString(parentCode + '_' + lane.getCode()) - laneParentDict[myKey] = propertyDict - - logger.info('Found ' + str(len(laneParentDict)) + ' samples on the flow cell.') - return laneParentDict - - -def convertSampleToDict(foundFlowCell, configMap): - ''' - converts <type 'ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample'> to a python dict - ''' - flowCellDict = {} - fcProperties = foundFlowCell.getProperties() - for property in fcProperties: - flowCellDict[property] = fcProperties.get(property) - flowCellDict['Name'] = foundFlowCell.getIdentifier().split('/')[-1] - flowCellDict['CODE'] = foundFlowCell.getCode() - return flowCellDict - -def getIndex(indx1, indx2, index1ReadLength, indexRead2Length, properties, configMap): - if indx1 in properties and index1ReadLength > 0: - index = properties[indx1][0:index1ReadLength] - else: - index = '' - if indx2 in properties and indexRead2Length > 0: - index = index + configMap['indexSeparator'] + properties[indx2][0:index1ReadLength] - return index - - -def getSampleProperties(parentsKey, service, logger): - for sample in parentsKey: - sampleProperties = sample.getProperties() - logger.debug(sample.getSampleTypeCode() + ' ' + sample.getCode()) - parentSamples = getParents(sample.getCode(), service) - for parentSample in parentSamples: - logger.debug(parentSample.getSampleTypeCode() + ' ' + parentSample.getCode()) - parentSampleProperties = parentSample.getProperties() - - return parentSample, parentSampleProperties - - -def createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties, library): - sampleSheetDict[lane + '_' + sample.getCode()] = [ - flowCellName + COMMA + lane + COMMA + library.getCode() + COMMA + - sampleProperties[configMap['species']] + COMMA + index + COMMA + - sanitizeString(sampleProperties[configMap['sampleName']]) + COMMA + control + COMMA + - end_type + '_' + cycles + COMMA + flowCellOperator + COMMA + gaNumber] - -def createHiseqSampleSheet(laneParentDict, flowCellDict, configMap, service, logger, myoptions): - ''' - Builds up a dictionary with all entries in the Sample Sheet - ''' - control = 'N' - # the illlumina pipeline uses always one base less than the sequencer is sequencing - demultiplexIndexLengthPenalty = 0 - - sampleSheetDict = {} - # Making sure this is on the top of the Sample Sheet - sampleSheetDict[u'!'] = ([configMap['hiSeqHeader']]) - - indx1 = configMap['index1Name'] - indx2 = configMap['index2Name'] - - flowCellName = flowCellDict['CODE'] - flowCellOperator = flowCellDict[configMap['operator']] - end_type = flowCellDict[configMap['endType']] - cycles = flowCellDict[configMap['readLength']] - index1ReadLength = int(flowCellDict[configMap['lengthIndex1']]) + demultiplexIndexLengthPenalty - indexRead2Length = int(flowCellDict[configMap['lengthIndex2']]) + demultiplexIndexLengthPenalty - - for key in laneParentDict.keys(): - lane = laneParentDict[key]['LANE'][-1:] - properties = laneParentDict[key] - sampleName = laneParentDict[key]['LIBRARYID'] - - # already Library with index - if indx1 in properties: - gaNumber = laneParentDict[key][configMap['gaNumber']] - index = getIndex(indx1, indx2, index1ReadLength, indexRead2Length, properties, configMap) - sample, sampleProperties = getSampleProperties(getParents(sampleName, service), service, logger) - - createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties) - else: - for library in getParents(sampleName, service): - libraryProperties = library.getProperties() - gaNumber = libraryProperties[configMap['gaNumber']] - if not gaNumber: - logger.warning('No GA number found for ' + library.getCode()) - index = getIndex(indx1, indx2, index1ReadLength, indexRead2Length, libraryProperties, configMap) - if not index: - logger.warning('No index found for ' + library.getCode()) - sample, sampleProperties = getSampleProperties(getParents(library.getCode(), service), service, logger) - - createSampleSheetDict(configMap, control, sampleSheetDict, flowCellName, flowCellOperator, - end_type, cycles, lane, gaNumber, index, sample, sampleProperties, library) - - logger.debug(sampleSheetDict) - sortedSampleSheetList = sampleSheetDict.keys() - sortedSampleSheetList.sort() - writeSampleSheet(flowCellName, sampleSheetDict, sortedSampleSheetList, myoptions, logger, fileName=myoptions.outdir + - configMap['sampleSheetFileName']) - -def writeSampleSheet(flowCellName, sampleSheetDict, sortedSampleSheetList, myoptions, logger, fileName): - ''' - Write the given dictionary to a csv file - ''' - newline = lineending[myoptions.lineending] - myFile = fileName + '_' + flowCellName + '.csv' - try: - with open(myFile, 'w') as sampleSheetFile: - for listElement in sortedSampleSheetList: - if myoptions.verbose: - print sampleSheetDict[listElement][0] - sampleSheetFile.write(sampleSheetDict[listElement][0] + newline) - - logger.info('Writing file ' + myFile) - - except IOError: - logger.error('File error: ' + str(err)) - print ('File error: ' + str(err)) - - -def main(): - ''' - Main script - ''' - logger = setUpLogger('log/') - logger.info('Started Creation of Sample Sheet...') - - myoptions = parseOptions(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - flowCellName = myoptions.flowcell - configMap = readConfig(logger) - service = login(configMap, logger) - - foundFlowCell, containedSamples = getFlowCell(configMap['illuminaFlowCellTypeName'], flowCellName, service, logger) - flowCellName = foundFlowCell.getCode() - flowCellDict = convertSampleToDict(foundFlowCell, configMap) - - laneParentDict = getContainedSampleProperties(logger, containedSamples, service) - createHiseqSampleSheet(laneParentDict, flowCellDict, configMap, service, logger, myoptions) - - logout(service, logger) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py b/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py deleted file mode 100644 index 804dcceef72..00000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.py +++ /dev/null @@ -1,403 +0,0 @@ -''' - Copyright 2012 ETH Zuerich, CISD - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ''' - -''' -@author Manuel Kohler - -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -''' - -import os -import re -import sys -from datetime import * -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -facilityName = "Quantitative Genomics Facility" -facilityInstitution = "D-BSSE, ETHZ" -facilityNameShort = "QGF" -subHeader = "Detailed Sample Overview" -PRINCIPAL_INVESTIGATOR = "Principal Investigator" -CONTACT_PERSON = "Contact person" -FLOW_CELL_ID = "Flow Cell ID" -defaultFonts = "Calibri" - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -columnHeaders = ["EXTERNAL_SAMPLE_NAME", "BARCODE", "BIOLOGICAL_SAMPLE_ARRIVED", "KIT_PREPARED", - "KIT", "FRAGMENT_SIZE_PREPARED_ILLUMINA", "CONCENTRATION_PREPARED_ILLUMINA", - "NOTES", "PRICE"] - -columnHeadersMap = {"EXTERNAL_SAMPLE_NAME": "Sample Name", - "BARCODE": "Index", - "BIOLOGICAL_SAMPLE_ARRIVED": "Received", - "PREPARED_BY" : "Prepared by", - "FRAGMENT_SIZE_PREPARED_ILLUMINA" : "Frag Size", - "CONCENTRATION_PREPARED_ILLUMINA" : "Conc", - "NOTES" : "Notes", - "PRICE" : "Price"} - -fcPropertyList = ["SEQUENCER", "FLOW_CELL_SEQUENCED_ON", "END_TYPE", "ILLUMINA_PIPELINE_VERSION", - "CYCLES_REQUESTED_BY_CUSTOMER", "FLOWCELLTYPE", "SBS_KIT"] - -dataSetFileNameEntitySeparator = ":" - -outputPath = "/local0/openbis/invoices" - -invoicePropertyName = "INVOICE" -pIPropertyName = "PRINCIPAL_INVESTIGATOR_NAME" -contactPersonNamePropertyName = "CONTACT_PERSON_NAME" - -''' -class invoiceDataSet: - def __init__(self): - self.code = '' - self.externalSampleName = '' - self.sampleID = '' - self.biologicalSampleArrived = '' - self.preparedBy = '' - self.preparedDate = '' - self.kitUsed = '' - self.fragmentSizePrepared = '' - self.concentrationPrepared = '' - self.dataTransferred = '' - self.price = '' - - - def setDefaultHeader(self): - code = "Sample code" - externalSampleName = "External Sample Name" - sampleID = "Internal #" - biologicalSampleArrived = "Received" - preparedBy = "Prepared by" - preparedDate = "Prepared on" - kitUsed = "Kit used" - fragmentSizePrepared = "Fragment size prepared in bp" - concentrationPrepared = "concentration prepared in ul/ng" - dataTransferred = "Data transferred" - price = "Price excl. VAT" -''' - -class flowCell: - def __init__(self): - self.id = '' - self.sequencer = '' - self.flowCellSequencedOn = '' - self.endType = '' - self.illuminaPipelineVersion = '' - self.cyclesRequestedByCustomer = '' - self.flowCellType = '' - self.sbsKit = '' - - - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d of %B %Y") - -def setFont(wb, fontSize = 10): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(defaultFonts) - font.setItalic(False) - font.setStrikeout(False) - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - - -def getVocabulary(vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - - -def getNonbilledSamples (sampleType): - '''Getting all samples where no Invoice was sent - @param param: Sample Type which we are looking for - ''' - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, sampleType)); - sc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(invoicePropertyName, "false")); - foundSamples = service.searchForSamples(sc) - return foundSamples - -def groupByPi (sampleList): - principalInvestigatorDict = {} - - for sample in sampleList: - pI = sample.getProperties().get(pIPropertyName) - if principalInvestigatorDict.has_key(pI): - principalInvestigatorDict[pI].append(sample) - else: - principalInvestigatorDict[pI] = [sample] - return principalInvestigatorDict - -def groupByContactPerson (sampleList): - groupedByPersonDict = {} - - for sample in sampleList: - contact = sample.getProperties().get(contactPersonNamePropertyName) - if groupedByPersonDict.has_key(contact): - groupedByPersonDict[contact].append(sample) - else: - groupedByPersonDict[contact] = [sample] - return groupedByPersonDict - -def getContainer(sample): - - flowcell = None - - parentSearchCriteria = SearchCriteria() - # define Parent - parentSearchCriteria.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample.getCode())) - childrenSearchCriteria = SearchCriteria() - # we look for children with this parent - childrenSearchCriteria.addSubCriteria(SearchSubCriteria.createSampleParentCriteria(parentSearchCriteria)) - children = service.searchForSamples(childrenSearchCriteria) - - for child in children: - child = child.getCode() - try: - containerName, lane = child.split(dataSetFileNameEntitySeparator) - except: - # No container - containerName = "" - lane = "" - - if containerName <> "": - containerSearch = SearchCriteria() - containerSearch.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, containerName)) - containerList = service.searchForSamples(containerSearch) - - for container in containerList: - flowcell = flowCell () - flowcell.id = containerName - '''flowcell.sequencer = container.getProperties().get("SEQUENCER") - flowcell.flowCellSequencedOn = container.getProperties().get("FLOW_CELL_SEQUENCED_ON") - flowcell.endType = container.getProperties().get("END_TYPE") - flowcell.illuminaPipelineVersion = container.getProperties().get("ILLUMINA_PIPELINE_VERSION") - flowcell.cyclesRequestedByCustomer = container.getProperties().get("CYCLES_REQUESTED_BY_CUSTOMER") - flowcell.flowCellType = container.getProperties().get("FLOWCELLTYPE") - flowcell.sbsKit = container.getProperties().get("SBS_KIT") ''' - return flowcell - -def writeExcel(piName, groupedByPersonDict, format = "xls"): - ''' - ''' - - myRows = uniqueRow() - kitVocabulary = getVocabulary("KIT") - setOfFlowcells = set () - - def writeHeader(): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(facilityName + ", " + facilityInstitution) - row.getCell(0).setCellStyle(setFont(wb, 14)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, 10)) - - - def createRow(key = "", value = "", rowNumber = 0, fontSize = 10): - ''' - ''' - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, fontSize)) - row.getCell(1).setCellStyle(setFont(wb, fontSize)) - return row - - def writeFooter(sheet): - footer = sheet.getFooter() - footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(facilityNameShort) - # 3/2 = 150 percent magnification when opening the workbook - sheet.setZoom(3, 2) - - writeHeader() - createRow(PRINCIPAL_INVESTIGATOR, piName) - contactrow = myRows.setRow(myRows.getNextRow()) - - for contactPerson in groupedByPersonDict: - myColumns = uniqueColumn() - createRow(CONTACT_PERSON, contactPerson, 0, 14) - - sampleList = groupedByPersonDict[contactPerson] - - sampleHeader = sheet.createRow(myRows.getNextRow()) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flow Cell") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - for c in columnHeaders: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(c) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - for singleSample in sampleList: - singleSampleColumns = uniqueColumn() - fc = getContainer(singleSample) - - rowN = sheet.createRow(myRows.getNextRow()) - contactrow += 3 - - code = singleSample.getCode() - if fc is not None: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(fc.id) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - setOfFlowcells.add(fc.id) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(code) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - for column in columnHeaders: - if column == "KIT": - if singleSample.getProperties().get(column) is not None: - val = kitVocabulary[singleSample.getProperties().get(column)] - else: - val = singleSample.getProperties().get(column) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(val) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, 10)) - - createRow() - - - createRow("Flow Cell Details", "", 0, 14) - - for FC in setOfFlowcells: - containerSearch = SearchCriteria() - containerSearch.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, FC)) - containerList = service.searchForSamples(containerSearch) - - print (len(containerList)) - - for container in containerList: - #index = containerList.index(container) - #createRow("Number",index+1) - createRow(FLOW_CELL_ID, FC) - for property in fcPropertyList: - createRow(property, container.getProperties().get(property)) - createRow() - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - sheet.getPrintSetup().setLandscape(True) - - writeFooter(sheet) - - # Write the output to a file - fileOut = FileOutputStream(outputPath + "/" + facilityNameShort + "_" + piName.replace(" ", "_") + - datetime.now().strftime("_%d_%m_%Y.") + format) - wb.write(fileOut); - fileOut.close(); - -def progressBar(toolbar_width = 40): - ''' - ''' - # setup toolbar - sys.stdout.write("[%s]" % (" " * toolbar_width)) - sys.stdout.flush() - sys.stdout.write("\b" * (toolbar_width + 1)) # return to start of line, after '[' - - -''' -Main script -''' - -# for now setting the format by hand -format = "xlsx" - -service = OpenbisServiceFacadeFactory.tryCreate("openBISUsername", "password", "https://my-openbis.bsse.ethz.ch:8443", 5000) - -foundSamples = getNonbilledSamples("ILLUMINA_SEQUENCING") -groupByPiDict = groupByPi(foundSamples) - -print "Found " + str(len(groupByPiDict)) + " Principal Investigators" - -progressBar(len(groupByPiDict)) - -for principalInvestigator in groupByPiDict: - groupedByPersonDict = groupByContactPerson(groupByPiDict[principalInvestigator]) - # create an Excel file for each PI - writeExcel(principalInvestigator, groupedByPersonDict, format) - sys.stdout.write("*") - sys.stdout.flush() -sys.stdout.write("\n") - -service.logout() -print("DONE") diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh b/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh deleted file mode 100755 index 28e4b125993..00000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices.sh +++ /dev/null @@ -1,4 +0,0 @@ -LIB=lib/ -CLASSPATH=lib/ -cd lib -java -cp dss_client.jar:jython.jar:stream-supporting-httpinvoker.jar:spring.jar:commons-logging.jar:commons-httpclient.jar:commons-codec.jar:commons-lang.jar:log5j.jar:poi-3.7-20101029.jar:poi-ooxml-3.7-20101029.jar:poi-ooxml-schemas-3.7-20101029.jar org.python.util.jython ../create_QGF_Invoices.py diff --git a/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py b/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py deleted file mode 100644 index 125add0755a..00000000000 --- a/deep_sequencing_unit/source/Jython/create_QGF_Invoices_simplified.py +++ /dev/null @@ -1,629 +0,0 @@ -# -*- coding: utf-8 -*- -''' -Copyright 2016 ETH Zuerich, CISD - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author Manuel Kohler - -@description: -Creates Excel-based invoices for the Quantitative Genomics Facility, -D-BSSE, ETH Zurich - -@attention: -Runs under Jython - -@note: - -''' - -import os -import re -import sys -import logging -import collections -from datetime import * -from ConfigParser import SafeConfigParser -from optparse import OptionParser -from java.io import FileOutputStream -from org.apache.poi.hssf.usermodel import HSSFWorkbook -from org.apache.poi.hssf.usermodel import HeaderFooter -from org.apache.poi.poifs.filesystem import POIFSFileSystem -from org.apache.poi.xssf.usermodel import XSSFWorkbook -from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria -from java.util import EnumSet -from java.util import TreeMap -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - -excelFormats = {"xls": "HSSFWorkbook()" , "xlsx": "XSSFWorkbook()"} - -column_headers_tuple = (("EXTERNAL_SAMPLE_NAME", "Sample Name"), - ("BARCODE", "Index"), - ("INDEX2", "Index2"), - ("PREPARED_BY", "Prepared by"), - ("KIT", "Kit"), - ("QC_AT_DBSSE", "QC at D-BSSE"), - ("CONTACT_PERSON_NAME", "Contact Person"), - ("NOTES", "Notes"), - ("BIOLOGICAL_SAMPLE_ARRIVED", "Received") - ) - -# Keep the order of the tuples -column_headers_dict = collections.OrderedDict(column_headers_tuple) - -class uniqueRow(): - ''' - Little helper class which ensures the unique use of a row - ''' - def __init__(self): - self.row = -1 - - def getNextRow (self): - self.row += 1 - return self.row - - def setRow(self, rowNumber): - self.row = rowNumber - return self.row - -class uniqueColumn(): - ''' - Little helper class which ensures the unique use of a column - ''' - def __init__(self): - self.column = -1 - - def getCurrentColumn(self): - return self.column - - def getNextColumn (self): - self.column += 1 - return self.column - - def setColumn(self, columnNumber): - self.column = columnNumber - return self.column - -def getDate(): - d = datetime.now() - return d.strftime("%A, %d-%B-%Y") - - -def setFont(wb, configMap, fontSize=10, boldness=False, underline=False): - font = wb.createFont() - font.setFontHeightInPoints(fontSize) - font.setFontName(configMap["defaultFonts"]) - font.setItalic(False) - font.setStrikeout(False) - font.setBold(boldness) - if underline: - font.setUnderline(font.U_SINGLE); - # Fonts are set into a style so create a new one to use. - style = wb.createCellStyle() - style.setFont(font) - return style - - -def getVocabulary(service, vocabularyCode): - ''' Returns the vocabulary term and vocabulary label of a vocabulary specified by the parameter - vocabularyCode in a map''' - - vocabularies = service.listVocabularies() - vocabularyMap = {} - for vocabulary in vocabularies: - if (vocabulary.getCode() == vocabularyCode): - terms = vocabulary.getTerms() - for term in terms: - vocabularyMap[term.getCode()] = term.getLabel() - return vocabularyMap - - -def identify_sequencer(sequencer_code): - sequencer_map = {"M": "MiSeq", "N": "NextSeq"} - if (sequencer_code[0] in sequencer_map): - return sequencer_map[sequencer_code[0]] - else: - return "HiSeq" - - -def merge_two_dicts(x, y): - '''Given two dicts, merge them into a new dict as a shallow copy.''' - z = x.copy() - z.update(y) - return z - - -def camel_case_string(string): - full_name = "" - for split in string.split("_"): - full_name += split[0].upper() + split[1:] + " " - return full_name.strip() - - -def writeHeader(sheet, myRows, wb, configMap, piName, piSpace): - # Write header - row = sheet.createRow(myRows.getNextRow()) - row.createCell(0).setCellValue(configMap["facilityName"] + ", " + configMap["facilityInstitution"]) - row.getCell(0).setCellStyle(setFont(wb, configMap, 10, True)) - row1 = sheet.createRow(myRows.getNextRow()) - row1.createCell(0).setCellValue(getDate()) - row1.getCell(0).setCellStyle(setFont(wb, configMap, 10, True)) - - createRow(configMap, wb, sheet, myRows, "Principal Investigator", camel_case_string(piName), 0, 10, True, columnspace=1) - createRow(configMap, wb, sheet, myRows,"Data Space", piSpace, 0, 10, True, columnspace=1) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows,"Samples", "", 0, 10, True, True) - - -def createRow(configMap, wb, sheet, myRows, key="", value="", rowNumber=0, fontSize=10, boldness=False, underline=False, columnspace=0): - if rowNumber == 0: - row = sheet.createRow(myRows.getNextRow()) - else: - row = rowNumber - row.createCell(0).setCellValue(key) - row.createCell(1+columnspace).setCellValue(value) - row.getCell(0).setCellStyle(setFont(wb, configMap, fontSize, boldness, underline)) - row.getCell(1+columnspace).setCellStyle(setFont(wb, configMap, fontSize, boldness, underline)) - return row - - -def writeXLSHeader (configMap, service, sheet): - header = sheet.getHeader() - header.setCenter(configMap["facilityName"] + "\n" + datetime.now().strftime("%d-%B-%Y")) - - -def writeXLSFooter(service, sheet): - footer = sheet.getFooter() - footer.setCenter( "Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages() ) - #footer.setRight("generated on " + datetime.now().strftime("%H:%M - %d.%m.%Y")) - - -def write_flowcell_details(configMap, flowCellProperties, myRows, sequencerVocabulary, runModeVocabulary, flowcell, wb, sheet, createRow): - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows, "Flow Cell Details", "", 0, 14, columnspace=1) - createRow(configMap, wb, sheet, myRows, "Flow Cell", flowcell, columnspace=1) - for property in flowCellProperties: - if (property == "SEQUENCER"): - val = sequencerVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - if (property == "RUN_MODE"): - val = runModeVocabulary[flowCellProperties[property]] - else: - val = flowCellProperties[property] - createRow(configMap, wb, sheet, myRows, property, val, columnspace=1) - - createRow(configMap, wb, sheet, myRows) - - - -def write_samples(configMap, myRows, wb, sheet, setFont, sample, sampleValues, working_column_headers_dict, lane, write_lane=False): - - singleSampleColumns = uniqueColumn() - rowN = sheet.createRow(myRows.getNextRow()) - - if write_lane: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(str(sampleValues['LANE'])) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(configMap['sampleCodePrefix'] + sample.split("_")[1]) - else: - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(configMap['sampleCodePrefix'] + sample) - - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - for code, label in working_column_headers_dict.iteritems(): - if (code == 'BIOLOGICAL_SAMPLE_ARRIVED'): - try: - value = sampleValues[code].split(" ")[0] - except: - value = "" - else: - try: - value = sampleValues[code] - except: - value = "" - rowN.createCell(singleSampleColumns.getNextColumn()).setCellValue(value) - rowN.getCell(singleSampleColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10)) - - return value - - -def filter_on_nonexisting_columns(regular_samples, check_empty_columns_dict): - for key, value_dict in sorted(regular_samples.iteritems()): - for code, count in check_empty_columns_dict.iteritems(): - if code in value_dict: - check_empty_columns_dict[code] = check_empty_columns_dict[code] + 1 - - return check_empty_columns_dict - - - -def write_intermediate_section(configMap, flowCellProperties, myRows, wb, sheet): - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - sequencer = identify_sequencer(flowCellProperties["SEQUENCER"]) - createRow(configMap, wb, sheet, myRows, key=sequencer + " sequencing", value="", rowNumber=0, fontSize=10, boldness=True, underline=True, columnspace=0) - createRow(configMap, wb, sheet, myRows, "Run Folder Name", flowCellProperties["RUN_NAME_FOLDER"], 0, 10, True) - createRow(configMap, wb, sheet, myRows) - createRow(configMap, wb, sheet, myRows) - - - -def write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet, write_lane=False): - myColumns = uniqueColumn() - sampleHeader = sheet.createRow(myRows.getNextRow()) - - if write_lane: - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Flowcell:Lane") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue("Sample Code") - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - for code, label in working_column_headers_dict.iteritems(): - sampleHeader.createCell(myColumns.getNextColumn()).setCellValue(label) - sampleHeader.getCell(myColumns.getCurrentColumn()).setCellStyle(setFont(wb, configMap, 10, True)) - - - -def writeExcel(myoptions, configMap, service, piName, laneDict, sampleDict, piDict, - piSpace, flowCellProperties, flowcellName, logger,format="xls"): - ''' - Writes out all data to an Excel file - ''' - accumulated_pi_dict = {} - pool_samples = {} - regular_samples = {} - check_empty_columns_dict = {"INDEX2": 0, "NOTES": 0, "BIOLOGICAL_SAMPLE_ARRIVED": 0} - working_column_headers_dict = column_headers_dict.copy() - - myRows = uniqueRow() - sequencerVocabulary = getVocabulary(service, "SEQUENCER") - runModeVocabulary = getVocabulary(service, "RUN_MODE_VOCABULARY") - setOfFlowcells = set () - try: - # expecting the old running folder name - runDate, seqId, runningNumber, flowcell = flowCellProperties["RUN_NAME_FOLDER"].split("_") - flowcell = flowcell[1:] - except: - flowcell = flowcellName - - wb = (eval(excelFormats[format])) - createHelper = wb.getCreationHelper() - sheet = wb.createSheet(configMap["facilityNameShort"]) - # 4/3 = 133 percent magnification when opening the workbook - sheet.setZoom(4, 3) - - writeHeader(sheet, myRows, wb, configMap, piName, piSpace) - - listofLanes = piDict[piName] - listofLanes.sort() - logger.debug(listofLanes) - - for lane in listofLanes: - for sample_code in sampleDict[lane]: - sampleValues = sampleDict[lane][sample_code] - - # if there is a shared lane do not mix them - if (sanitizeString(sampleValues['PRINCIPAL_INVESTIGATOR_NAME']) != sanitizeString(piName)): - continue - - # Find the Pools: - try: - if sampleValues['BARCODE'] != 'NOINDEX': - regular_samples[sample_code] = sampleValues - else: - pool_samples[lane + "_" + sample_code] = sampleValues - except: - if sampleValues.has_key('10X_INDEX_SET'): - regular_samples[sample_code] = sampleValues - elif int(sampleValues['NCBI_ORGANISM_TAXONOMY']) != 10847: - pool_samples[lane + "_" + sample_code] = sampleValues - else: - regular_samples[sample_code] = sampleValues - - logger.debug("Found {0} samples.".format(len(regular_samples))) - logger.debug("Found {0} pools.".format(len(pool_samples))) - - merged_regular_pool = merge_two_dicts(regular_samples, pool_samples) - check_empty_columns_dict = filter_on_nonexisting_columns(merged_regular_pool, check_empty_columns_dict) - - for key, values in check_empty_columns_dict.iteritems(): - if values == 0: - logger.debug("Popped! " + key) - working_column_headers_dict.pop(key) - - logger.debug("check_empty_columns_dict: {0}".format(check_empty_columns_dict)) - - write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet) - for reg_sample in sorted(regular_samples): - value = write_samples(configMap, myRows, wb, sheet, setFont, reg_sample, regular_samples[reg_sample], working_column_headers_dict, lane) - - write_intermediate_section(configMap, flowCellProperties, myRows, wb, sheet) - - write_sample_column_header(configMap, working_column_headers_dict, myRows, wb, sheet, write_lane=True) - for pool in sorted(pool_samples): - value = write_samples(configMap, myRows, wb, sheet, setFont, pool, pool_samples[pool], working_column_headers_dict, lane, write_lane=True) - - write_flowcell_details(configMap, flowCellProperties, myRows, sequencerVocabulary, runModeVocabulary, flowcell, wb, sheet, createRow) - - # adjust width - for i in range(0, 20): - sheet.autoSizeColumn(i) - - # set layout to landscape - #sheet.getPrintSetup().setLandscape(True) - - #left_margin_inches = sheet.getMargin(sheet.LeftMargin) - #right_margin_inches = sheet.getMargin(sheet.RightMargin) - - sheet.setMargin(sheet.LeftMargin, 0.5) - sheet.setMargin(sheet.RightMargin, 0.5) - - writeXLSFooter(service, sheet) - writeXLSHeader(configMap, service, sheet) - - # sanitizeString(piName) + datetime.now().strftime("_%d_%m_%Y.") + format - # Write the output to a file - fileName = myoptions.outdir + configMap["facilityNameShort"] + "_" + flowcell + "_" + \ - sanitizeString(piName) + "." + format - fileOut = FileOutputStream(fileName) - # need this print for use as an openBIS webapp - print fileName - - wb.write(fileOut); - fileOut.close(); - - -def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString.strip()).lower() - - -def setUpLogger(logPath, logLevel=logging.INFO): - logFileName = 'createInvoices' - d = datetime.now() - logFileName = logFileName + '_' + d.strftime('%Y-%m-%d_%H_%M_%S') + '.log' - logging.basicConfig(filename=logPath + logFileName, - format='%(asctime)s [%(levelname)s] %(message)s', level=logLevel) - logger = logging.getLogger(logFileName) - return logger - - -def parseConfigurationFile(propertyFile='etc/service.properties'): - ''' - Parses the given config files and returns the values - ''' - config = SafeConfigParser() - config.read(propertyFile) - config.sections() - return config - -def readConfig(logger): - GENERAL = 'GENERAL' - OPENBIS = 'OPENBIS' - EXCEL = 'EXCEL' - - logger.info('Reading config file') - configMap = {} - - configParameters = parseConfigurationFile() - configMap['facilityName'] = configParameters.get(GENERAL, 'facilityName') - configMap['facilityNameShort'] = configParameters.get(GENERAL, 'facilityNameShort') - configMap['facilityInstitution'] = configParameters.get(GENERAL, 'facilityInstitution') - configMap['mailList'] = configParameters.get(GENERAL, 'mailList') - configMap['mailFrom'] = configParameters.get(GENERAL, 'mailFrom') - configMap['smptHost'] = configParameters.get(GENERAL, 'smptHost') - configMap['separator'] = configParameters.get(GENERAL, 'separator') - configMap['indexSeparator'] = configParameters.get(GENERAL, 'indexSeparator') - - configMap['openbisUserName'] = configParameters.get(OPENBIS, 'openbisUserName') - configMap['openbisPassword'] = configParameters.get(OPENBIS, 'openbisPassword', raw=True) - configMap['openbisServer'] = configParameters.get(OPENBIS, 'openbisServer') - configMap['connectionTimeout'] = configParameters.getint(OPENBIS, 'connectionTimeout') - configMap['pIPropertyName'] = configParameters.get(OPENBIS, 'pIPropertyName') - configMap['sampleCodePrefix'] = configParameters.get(OPENBIS, 'sampleCodePrefix') - - configMap['defaultFonts'] = configParameters.get(EXCEL, 'defaultFonts') - - return configMap - -def login(logger, configMap): - logger.info('Logging into ' + configMap['openbisServer']) - service = OpenbisServiceFacadeFactory.tryCreate(configMap['openbisUserName'], - configMap['openbisPassword'], - configMap['openbisServer'], - configMap['connectionTimeout']) - return service - -def parseOptions(logger): - logger.info('Parsing command line parameters') - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--flowcell', - dest='flowcell', - help='The flowcell which is used to create the SampleSheet.csv', - metavar='<flowcell>') - parser.add_option('-o', '--outdir', - dest='outdir', - default='./', - help='Specify the ouput directory. Default: ./' , - metavar='<outdir>') - parser.add_option('-d', '--debug', - dest='debug', - default=False, - action='store_true', - help='Verbose debug logging. Default: False') - - (options, args) = parser.parse_args() - - if options.outdir[-1] <> '/': - options.outdir = options.outdir + '/' - - if options.flowcell is None: - parser.print_help() - exit(-1) - return options - - -def getFLowcellData(service, configMap, flowcell, logger): - - laneCodeList = [] - fetchOptions = EnumSet.of(SampleFetchOption.ANCESTORS, SampleFetchOption.PROPERTIES) - - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - fcList = service.searchForSamples(sc, fetchOptions) - if not fcList: - print("No flowcell found with code: " + flowcell) - sys.exit() - - scContained = SearchCriteria() - scContained.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcell)); - - scContainedMain = SearchCriteria(); - scContainedMain.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(scContained)) - - containedSamples = service.searchForSamples(scContainedMain) - - for lane in containedSamples: - laneCode = lane.getCode() - laneCodeList.append(laneCode) - logger.debug("Found lane " + laneCode + " in flow cell") - logger.info("All lanes found: " + str(laneCodeList)) - - for p in fcList: - flowCellProperties = p.getProperties() - - numberOfLanes = int(flowCellProperties['LANECOUNT']) - - foundLaneNumber = containedSamples.size() - if (foundLaneNumber > numberOfLanes): - numberOfLanes = foundLaneNumber - logger.info("Found " + str(foundLaneNumber) + " lanes! This differs from the lane number " + - "registered in the flow cell. --> Lanes got splitted!") - - laneDict = {} - sampleDict = {} - piDict = {} - spaceDict = {} - invoiceDict = {} - - for lane in laneCodeList: - myLane = lane - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = service.searchForSamples(laneSc, fetchOptions) - logger.debug("Length of laneList for " + myLane + " is " + str(len(laneList))) - - for l in laneList: - laneProperties = l.getProperties() - laneDict[lane] = laneProperties - laneParents = l.getParents() - - s = {} - for samples in laneParents: - sampleCode = samples.getCode() - sampleProperties = samples.getProperties() - - sample_properties_dict={} - for key, value in sampleProperties.iteritems(): - sample_properties_dict[key] = value - - - sample_properties_dict["LANE"] = lane - s[sampleCode.split("-")[-1]] = sample_properties_dict - sampleDict[lane] = s - pi = sanitizeString(sample_properties_dict[configMap["pIPropertyName"]]) - try: - invoiceProperty = sample_properties_dict['INVOICE'] - except: - # Can happen when sample was registered via Excel, the boolean value is not set in the DB - logger.info("Sample {0} has no property 'Invoice'. Setting it to false".format(sampleCode)) - invoiceProperty = 'false' - # if sample got created via Excel upload, the property could be not set, which is represented by None - if (invoiceProperty is None): - invoiceProperty = 'false' - sentInvoice = {'true': True, 'false': False}.get(invoiceProperty.lower()) - logger.debug("PI for " + sampleCode + ": " + pi) - logger.debug("Invoice sent for " + sampleCode + ": " + str(sentInvoice)) - - if piDict.has_key(pi): - piDict[pi].append(lane) - # Making the lanes unique - piDict[pi] = list(set(piDict[pi])) - else: - piDict[pi] = [lane] - spaceDict[pi] = l.getSpaceCode() - - if not sentInvoice: - if invoiceDict.has_key(pi): - invoiceDict[pi].append(lane) - # Making the lanes unique - invoiceDict[pi] = list(set(invoiceDict[pi])) - else: - invoiceDict[pi] = [lane] - - - logger.debug(spaceDict) - - logger.info("Found the following PIs on the lanes: ") - logger.info(piDict) - logger.info("Found the following PIs with non-invoiced samples : ") - logger.info(invoiceDict) - - # simply sort the hashmap - treeMap = TreeMap (flowCellProperties) - return laneDict, sampleDict, piDict, treeMap, spaceDict, invoiceDict - - -''' -Main script -''' - -def main(): - - # for now setting the format by hand - format = "xlsx" - magicString = "@Invoice@" - - logger = setUpLogger('log/') - logger.info('Started Creation Invoices...') - - myoptions = parseOptions(logger) - configMap = readConfig(logger) - if myoptions.debug: - logger.setLevel(logging.DEBUG) - - service = login(logger, configMap) - flowcellName = myoptions.flowcell - laneDict, sampleDict, piDict, flowCellProperties, spaceDict, invoiceDict = getFLowcellData(service, configMap, flowcellName, logger) - - for piName in piDict: - # create an Excel file for each PI - writeExcel(myoptions, configMap, service, piName, laneDict, sampleDict, - piDict, spaceDict[piName], flowCellProperties, - flowcellName, logger, format) - - for invoicePi in invoiceDict: - print (magicString + invoicePi) - - service.logout() - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py b/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py deleted file mode 100644 index e39e569845f..00000000000 --- a/deep_sequencing_unit/source/Jython/duplicateBarcodeChecker.py +++ /dev/null @@ -1,104 +0,0 @@ -import smtplib -import string -import copy - -def sendMail(registratorEmail, indexStrings='', sampleIdentifier='', additionalText=''): - ''' - Send out an email to the specified recipients - ''' - COMMASPACE = ", " - - loe = ["manuel.kohler@bsse.ethz.ch"] - if registratorEmail and registratorEmail not in loe: - loe.append(registratorEmail) - - TO = COMMASPACE.join(loe) - SUBJECT = "WARNING! For pooled sample " + sampleIdentifier - FROM = "qgf@openbis-dsu.ethz.ch" - HOST = "smtp0.ethz.ch" - text = "Sample: "+ sampleIdentifier + "\nBarcode: " + indexStrings + "\n" + additionalText - BODY = string.join(( - "From: %s" % FROM, - "To: %s" % TO, - "Subject: %s" % SUBJECT , - "", - text - ), "\r\n") - server = smtplib.SMTP(HOST) - server.sendmail(FROM, [TO], BODY) - server.quit() - -def checkDuplicateBarcodes(): - ''' - 'parents' are a HashSet of SamplePropertyPE - ''' - VOCABULARY_INDEX1 = 'BARCODE' - VOCABULARY_INDEX2 = 'INDEX2' - - SUCCESS_MESSAGE="OK" - registratorEmail = entity.entityPE().registrator.email - poolName = entity.entityPE().sampleIdentifier - - listofIndices = [] - listofIndices2 = [] - returnString = " " - - for e in entity.entityPE().parents: - for s in e.properties: - - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX1: - index = s.getVocabularyTerm().code - listofIndices.append(index) - - if s.entityTypePropertyType.propertyType.simpleCode == VOCABULARY_INDEX2: - index = s.getVocabularyTerm().code - listofIndices2.append(index) - - sampleIdentifier = e.sampleIdentifier - - # if dual-indexed - if listofIndices2: - dualIndexList = [] - if len(listofIndices) != len(listofIndices2): - indices = "\nIndex1 :" + str(listofIndices) + "\nIndex2: " + str(listofIndices2) - returnString = "Dual indexing assignment is not complete for pool sample " + str(poolName) - sendMail(registratorEmail, indices , str(poolName), returnString) - return returnString - - # build up a list of dual indices - for l in range(len(listofIndices)): - try: - dualIndexList.insert(l, [listofIndices[l], listofIndices2[l]]) - except: - pass - - # copy, needed by the for loop - dualIndexListOrig = copy.deepcopy(dualIndexList) - - for dualIndex in dualIndexListOrig: - dualIndexList.remove(dualIndex) - if dualIndex in dualIndexList: - returnString = "WARNING! You assigned duplicate indices \n " + str(dualIndex) + \ - " in the dual-indexed pooled sample!" - sendMail(registratorEmail, str(dualIndex), str(poolName), returnString) - return returnString - else: - returnString = SUCCESS_MESSAGE - return returnString - - # else single index - else: - uniqueList=list(set(listofIndices)) - if len(listofIndices) != len(uniqueList): - for index in uniqueList: - listofIndices.remove(index) - returnString = "WARNING! You assigned duplicate indices \n " + str(listofIndices) + \ - " in the single-indexed pooled sample!" - sendMail(registratorEmail, str(listofIndices), str(poolName), returnString) - else: - returnString = SUCCESS_MESSAGE - return returnString - -def calculate(): - """Main script function. The result will be used as the value of appropriate dynamic property.""" - return checkDuplicateBarcodes() diff --git a/deep_sequencing_unit/source/Python/bam2wig.py b/deep_sequencing_unit/source/Python/bam2wig.py deleted file mode 100644 index be4d750b593..00000000000 --- a/deep_sequencing_unit/source/Python/bam2wig.py +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/env python -''' -Creates a Wiggle file out of a BAM file - -Prerequisites: -- BAM index file, create with 'samtools index <bamfile.bam>' -- BAM file must be sorted, sort with 'samtools sort <bamfile.bam> bamfile.sorted' - -Documentation says: 'If an index for a BAM file exists (.bai), it will be opened automatically. -Without an index random access to reads via fetch() and pileup() is disabled.' - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pysam egg -''' - -import sys, pysam - -#def bam2wig(): -# '''Usage: python bam2wig <bamfile>''' -# -# if sys.argv[1] == '': -# print(my_function.__doc__) -# sys.exit(1) -# else: -bamfile_name = sys.argv[1] -# -try: - with pysam.Samfile(bamfile_name, 'rb') as bamfile: - wigfile_name = bamfile_name.replace('.bam', '.wig') - wigfile = open(wigfile_name, 'w') - - header_full = 'track type=wiggle_0 name=' + wigfile_name - variable_wig = 'variableStep chrom=' - - print >> wigfile, header_full - print ('Number of genes: ') + str(bamfile.nreferences) - for gene_names in range(bamfile.nreferences): - try: - print (bamfile.getrname(gene_names)) - '''UCSC conformity''' - if bamfile.getrname(gene_names) == 'dmel_mitochondrion_genome': - print >> wigfile, variable_wig + "M" - else: - print >> wigfile, variable_wig + bamfile.getrname(gene_names) - for pile in bamfile.pileup(bamfile.getrname(gene_names)): - print >> wigfile, pile.pos + 1, pile.n - except ValueError as valerr: - print ('Value error ' + str(valerr)) -except IOError as err: - print (bam_file + 'not found! ' + str(err)) diff --git a/deep_sequencing_unit/source/Python/calculateCRC32.py b/deep_sequencing_unit/source/Python/calculateCRC32.py deleted file mode 100644 index a60eefe6b6e..00000000000 --- a/deep_sequencing_unit/source/Python/calculateCRC32.py +++ /dev/null @@ -1,56 +0,0 @@ -#! /usr/bin/env python -''' -@copyright: -Copyright 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the 'License'); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an 'AS IS' BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - @author: - Manuel Kohler - - @description: - Calulates the crc32 checksum of a file and returns it in a hexadecimal number -''' - -import zlib -from optparse import OptionParser - - -def parseOptions(): - parser = OptionParser(version='%prog 1.0') - parser.add_option('-f', '--file', dest='file', - help='File for calculation of crc32 checksum', - metavar='<file>') - - (options, args) = parser.parse_args() - if options.file is None: - parser.print_help() - exit(-1) - return options - - -def crc(fileName): - prev = 0 - for eachLine in open(fileName,"rb"): - prev = zlib.crc32(eachLine, prev) - return "%X"%(prev & 0xFFFFFFFF) - -def main(): - - myoptions = parseOptions() - value = crc(myoptions.file) - print(value) - -if __name__ == "__main__": - main() diff --git a/deep_sequencing_unit/source/Python/concatenatePdfs.py b/deep_sequencing_unit/source/Python/concatenatePdfs.py deleted file mode 100644 index 715ca5e670e..00000000000 --- a/deep_sequencing_unit/source/Python/concatenatePdfs.py +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/python -''' -Concatenates several pdfs in a given directory depending -on the lane number in the file name. -This number is defined as the last number in the file name -separated by '_' -The concatenated file will be named: -flow_cell + '_' + lane + '_quality.pdf' - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pdftk installation -''' - -import os -import fnmatch -import subprocess -from optparse import OptionParser - -PDFTK = '/usr/local/dsu/pdftk-1.41/pdftk/pdftk' -LANES = 8 - -class pdfList(list): - def __init__ (self, lane, pdfs=[]): - list.__init__([]) - self.lane = lane - self.extend(pdfs) - -def options(): - parser = OptionParser() - parser.add_option("-p", "--path", dest="path", action="store", type="string", - help="Path of the fastq files", metavar="PATH") - (options, args) = parser.parse_args() - return (options.path) - -def concatenatePdfs(file_list, lane): - # take the first list element as a reference for the final pdf name - flow_cell = '_'.join(file_list[0].split('_', 4)[0:4]) - print(flow_cell) - new_name = flow_cell + '_' + lane + '_quality.pdf' - args = [PDFTK, 'cat', 'output', new_name] - [args.insert(1, i) for i in file_list] - a = subprocess.Popen(args) - a.wait() - [os.remove(file) for file in file_list] - -def createPdfList (lane): - path = options() - # create pdf list depending on lane - ll = 'lane' + lane - vars()[ll] = pdfList(lane) - - for file in os.listdir(path): - if fnmatch.fnmatch(file, '*.pdf'): - for l in (file.split('_')[4]): - if (l == lane): - (vars()[ll]).append(file) - vars()[ll].sort() - return (vars()[ll]) - -def __main__(): - list_of_pdfs = [] - for i in range(1, LANES + 1): - l = createPdfList(str(i)) - list_of_pdfs.append(l) - - [concatenatePdfs(list_of_pdfs[i], list_of_pdfs[i].lane) for i in range(len(list_of_pdfs))] - print("DONE...") - -__main__() diff --git a/deep_sequencing_unit/source/Python/fastq_quality.py b/deep_sequencing_unit/source/Python/fastq_quality.py deleted file mode 100755 index 80064b84e5d..00000000000 --- a/deep_sequencing_unit/source/Python/fastq_quality.py +++ /dev/null @@ -1,42 +0,0 @@ -#!/links/application/dsu/Python-3.2/python - -''' -Docu -''' - -import subprocess -import shlex -import os -import fnmatch -import concurrent.futures - -rscriptPath = '/links/application/dsu/R-scripts' -pwd = os.getcwd() -pattern = '*.fastq.gz' -rscript = '/links/application/dsu/R-2.13.2/bin/Rscript' -concatenationScript='/links/application/dsu/bin/concatenate_pdfs.py' -maxConcurrentJobs=5 - -def run_me(fastqFile): - (path, file) = os.path.split(fastqFile) - os.chdir(path) - args = rscript + ' --vanilla ' + rscriptPath + '/' + 'fastq_quality.R ' + file - #print(args) - SplitArgs = shlex.split(args) - p = subprocess.Popen(SplitArgs) - p.wait() - #subprocess.Popen(concatenationScript) - -def findFiles (pattern): - matches = [] - for root, dirnames, filenames in os.walk(pwd): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - return matches - -def callR(): - matchingFiles = findFiles(pattern) - with concurrent.futures.ThreadPoolExecutor(max_workers=maxConcurrentJobs) as executor: - out = [executor.submit(run_me, lane) - for lane in matchingFiles] -callR() diff --git a/deep_sequencing_unit/source/Python/fastqc_plots.py b/deep_sequencing_unit/source/Python/fastqc_plots.py deleted file mode 100755 index 693e00b2b64..00000000000 --- a/deep_sequencing_unit/source/Python/fastqc_plots.py +++ /dev/null @@ -1,67 +0,0 @@ -#!/links/application/dsu/Python-3.2/python - -import subprocess -import collections -import os -import fnmatch -import concurrent.futures -import logging -from datetime import * - -fastqcBinary ='/links/application/dsu/FastQC/fastqc' -outDir = '../fastqc' -threads = '10' -cmdLine = [fastqcBinary, '--outdir', outDir, '--quiet', '--casava', '--nogroup', '--threads', threads] - -pwd = os.getcwd() -pattern = '*.fastq.gz' -maxConcurrentJobs=5 - -def setUpLogger(logPath): - d=datetime.now() - logFileName = '/fastqc_' + d.strftime("%Y-%m-%d_%H_%M_%S") + '.log' - logging.basicConfig(filename=logPath + logFileName, format='%(asctime)s %(message)s', level=logging.DEBUG) - -def run_me(path,files): - ''' - Builds up the final command and runs it using the subprocess module - ''' - os.chdir(path) - - filesToProcess = [] - for file in files: - filesToProcess.append(os.path.join(path, file)) - - logging.info('Processing '+ str(filesToProcess)) - - p = subprocess.Popen(cmdLine + filesToProcess) - p.wait() - -def findPaths (pattern): - ''' - Finds all files matching the given pattern and writes the result in a - dictionary with the path as the key and the list of files as the value - ''' - fileDict = {} - for root, dirnames, filenames in os.walk(pwd): - for filename in fnmatch.filter(filenames, pattern): - if (root in fileDict): - fileDict[root].append(filename) - else: - fileDict[root] = [filename] - return fileDict - -def callCommandLine(): - ''' - Calls a command line program with maxConcurrentJobs in parallel - ''' - matchingPaths = findPaths(pattern) - for path in matchingPaths.items(): - if (not os.path.isdir(outDir)): - os.makedirs(outDir) - - with concurrent.futures.ThreadPoolExecutor(max_workers=maxConcurrentJobs) as executor: - out = [executor.submit(run_me, path, files) - for path,files in matchingPaths.items()] - -callCommandLine() diff --git a/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py b/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py deleted file mode 100644 index 9c434a9bdcb..00000000000 --- a/deep_sequencing_unit/source/Python/filterOnQualityForFastqGzip.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python -''' -Usage: python filter_on_quality_for_gzip.py <fastqfile>o -Reqires bcltofastq converted gzipped fastq file which are generated -by the Illumina pipeline Casava 1.8+ - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: gzip -''' - -import gzip -import sys -import argparse - - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Counts the filtered and ' + - 'non-filtered read of a gzipped fastq file') - parser.add_argument('-i', '--input_file', dest='fastq_file', action='store', - required=True, help='Which fastq.gz file you want to process?') - parser.add_argument('-o', '--output', dest='output', action='store', default='fastq_stats', - type=str, help='Output file name') - parser.add_argument('-f', '--format', dest='format', action='store', default='txt', - type=str, choices=['txt', 'json', 'both'], help='Output format') - - args = parser.parse_args() - return(args) - -line_number = 1 -new_line = 1 -is_filtered = 0 - -def formatNumber(n): - return ('{:>20}'.format('{:,}'.format(n))) - -def calulatePercentage(v1, v2): - return round(100 * (v1 / (v1 + v2)), 2) - -args = parseCommandLine() - -with gzip.open(args.fastq_file, 'rb') as file: - for line in file: - if (line_number == new_line): - # fastq quadruples - new_line = line_number + 4 - l = line.decode('utf8') - #print(l.split(':')[7]) - if (l.split(':')[7] == 'Y'): - is_filtered += 1 - line_number += 1 - -unfiltered = ((line_number - 1) / 4) - is_filtered -print('File: ' + args.fastq_file) -print(str(formatNumber(int(unfiltered))) + ' number of non-filtered reads (GOOD)') -print(str(formatNumber(is_filtered)) + ' number of filtered reads (BAD)') -print(str(formatNumber(calulatePercentage(unfiltered, is_filtered))) + ' % of non-filtered reads (GOOD)') -print(str(formatNumber(calulatePercentage(is_filtered, unfiltered))) + ' % of filtered reads (BAD)') diff --git a/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py b/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py deleted file mode 100644 index 9194ecc999f..00000000000 --- a/deep_sequencing_unit/source/Python/filter_on_quality_for_gzip.py +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python -''' -Usage: python filter_on_quality_for_gzip.py <fastqfilei.gz> -Reqires bcltofastq converted gzipped fastq file which are generated -by the Illumina pipeline Casava 1.8+ - -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: gzip -''' - -import gzip -import sys -import argparse - - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Counts the filtered and ' + - 'non-filtered read of a gzipped fastq file') - parser.add_argument('-i', '--input_file', dest='fastq_file', action='store', - required=True, help='Which fastq.gz file you want to process?') - parser.add_argument('-o', '--output', dest='output', action='store', default='fastq_stats', - type=str, help='Output file name') - parser.add_argument('-f', '--format', dest='format', action='store', default='txt', - type=str, choices=['txt', 'json', 'both'], help='Output format') - - args = parser.parse_args() - return(args) - -line_number = 1 -new_line = 1 -is_filtered = 0 - -def formatNumber(n): - return ('{:>20}'.format('{:,}'.format(n))) - -def calulatePercentage(v1, v2): - return round(100 * (v1 / (v1 + v2)), 2) - -args = parseCommandLine() - -with gzip.open(args.fastq_file, 'rb') as file: - for line in file: - if (line_number == new_line): - # fastq quadruples - new_line = line_number + 4 - l = line.decode('utf8') - #print(l.split(':')[7]) - if (l.split(':')[7] == 'Y'): - is_filtered += 1 - line_number += 1 - -unfiltered = ((line_number - 1) / 4) - is_filtered -print('File: ' + args.fastq_file) -print(str(formatNumber(int(unfiltered))) + ' number of non-filtered reads (GOOD)') -print(str(formatNumber(is_filtered)) + ' number of filtered reads (BAD)') -print(str(formatNumber(calulatePercentage(unfiltered, is_filtered))) + ' % of non-filtered reads (GOOD)') -print(str(formatNumber(calulatePercentage(is_filtered, unfiltered))) + ' % of filtered reads (BAD)') diff --git a/deep_sequencing_unit/source/Python/rename_file.py b/deep_sequencing_unit/source/Python/rename_file.py deleted file mode 100644 index f47eefb4120..00000000000 --- a/deep_sequencing_unit/source/Python/rename_file.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/local/dsu/Python-3.2/python - -''' -Just a litlle helper function which can rename files given a regex and replace -this with another string - -''' - -import os -import re -import argparse - -def parseCommandLine(): - parser = argparse.ArgumentParser(description='Renames files and removes a given ' + - 'regex from the file name') - parser.add_argument('-d', '--directory', dest='dir', action='store', - required=True, help='Directory conatining the files') - parser.add_argument('-r', '--regex', dest='regular_expression', action='store', - required=True, type=str, help='Regex which should be removed from file name') - parser.add_argument('-w', '--with', dest='replacement', action='store', - required=True, type=str, help='replacement string') - - args = parser.parse_args() - return(args) - - -def ren(old, replace, replacement): - new = re.sub(replace, replacement, old) - if (new != old): - print ("rename: " + old + " to " + new) - os.rename(old, new) - else: - print(old + " left unchanged!") - -args = parseCommandLine() - -os.chdir(args.dir) -list_of_files = os.listdir(args.dir) -list_of_files.sort() -[ren(file, args.regular_expression, args.replacement) for file in list_of_files ] -print('*** ' + str(len(list_of_files)) + " files processed ***") diff --git a/deep_sequencing_unit/source/Python/solexaQa.py b/deep_sequencing_unit/source/Python/solexaQa.py deleted file mode 100644 index e95dd73616e..00000000000 --- a/deep_sequencing_unit/source/Python/solexaQa.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -''' -Python Wrapper for a perl based program. -Generates tile based quality graphics - -Output: pdf -@author: Manuel Kohler -@copyright: ETH Zurich -@precondition: Working pdftk and SolexaQA.pl binaries - -''' - -import subprocess -import shlex -import os -import sys -from optparse import OptionParser - -SCRIPT = "/usr/local/dsu/bin/SolexaQA/SolexaQA.pl" -PDFTK = '/usr/local/dsu/pdftk-1.41/pdftk/pdftk' - -parser = OptionParser() -parser.add_option("-p", "--path", dest="path", action="store", type="string", - help="Path of the fastq files", metavar="PATH") -parser.add_option("-v", dest="verbose", action="store_true", - help="tell me all") -(options, args) = parser.parse_args() -path = options.path -os.chdir(path) - -listdir = os.listdir(path) -for file in listdir: - if file.endswith('fastq'): - args = SCRIPT + " -sanger " + path + "/" + file - Newargs = shlex.split(args) - p = subprocess.Popen(Newargs) - p.wait() - #convert -page A4 ETHZ_BSSE_110204_62Y8YAAXX_7.fastq.png ETHZ_BSSE_110204_62Y8YAAXX_7.fastq_TileStatistics_A4.pdf - convert = ['convert', '-page', 'A4', file + '.png', file + '.png.pdf'] - c = subprocess.Popen(convert) - c.wait() - #rm *.matrix *.segments *.quality *.png - os.remove(file + '.matrix') - os.remove(file + '.segments') - os.remove(file + '.quality') - os.remove(file + '.png') - - files = file + '.segments.hist.pdf', file + '.quality.pdf', file + '.png.pdf' - assemble = [ PDFTK, 'cat', 'output', file.replace('.', '_', 1) + '_SolexaQA.pdf'] - [assemble.insert(1, i) for i in files] - a = subprocess.Popen(assemble) - a.wait() - [os.remove(f) for f in files] -print("Finished...") diff --git a/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R b/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R deleted file mode 100644 index 81c41ec7e0e..00000000000 --- a/deep_sequencing_unit/source/R/CreatePerCycleReadQuality.R +++ /dev/null @@ -1,12 +0,0 @@ -library(multicore) -library(ShortRead) -args <- commandArgs(TRUE) -reads <- readFastq(args[1]) -if (length(reads) > 1000000) { - reads <- sample(reads,1000000) # if more than a million reads, sample randomly -} -qual <- FastqQuality(quality(quality(reads))) # get quality scores -readM <- as(qual, "matrix") # convert scores to matrix -pdf(file=paste(args[1],"boxplot.pdf", sep="_")) # Save box plot as boxplot.pdf in current folder -boxplot(readM, outline = FALSE, main="Per Cycle Read Quality", sub=args[1], xlab="Cycle", ylab="Phred Quality", col="grey") -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/barcodeDistribution.R b/deep_sequencing_unit/source/R/barcodeDistribution.R deleted file mode 100644 index 33b7a9c2670..00000000000 --- a/deep_sequencing_unit/source/R/barcodeDistribution.R +++ /dev/null @@ -1,113 +0,0 @@ -library("ShortRead") - -# Collect arguments -args <- commandArgs(TRUE) -print(args) -path <- (args[1]) -flowcell <- (args[2]) -pattern <- (args[3]) -#flowcell <- "C3CFPACXX" -#path <- "/Users/kohleman/PycharmProjects/qgf/barcodeDistribution/testData" -#pattern <- 'lane4' -filenames <- list.files(path, pattern=pattern, full.names=TRUE) -totalIndexList <- "" - -plotTopIndices <- function (topIndices, xName="", path) { - - # Creates a barplot out of a data frame. - # - # Args: - # topIndices: data.frame which must have the columns - # 'totalIndexList' and 'Freq' - # xName: Name for the x-axes (xlab) - # - # Returns: - # an image/ a pdf - - fileName <- (paste(xName,".pdf", sep="")) - fileFullPath <- (file.path(path, fileName)) - - pdf(file=fileFullPath) - par(mfcol=c(1, 1)) - countLength<- nchar(toString(max(topIndices$Freq))) - - par(las=2) - par(mar=c(5,8,4,2)) # increase y-axis margin. - - b <- barplot(topIndices$Freq, main="Top 15 indices distribution", xlab=paste("Count of Indices for", xName), horiz=TRUE, - names=topIndices$totalIndexList, cex.names=.75, las=1) - text(cex=.75, x=topIndices$Freq/2, y=b, labels=topIndices$Freq, xpd=TRUE) - dev.off() -} - -# ----------------------------------------------------------------------------- - -multmerge <- function(datalist, mergeBy){ - # Merges a list if data frames by the 'mergeBy' parameter - Reduce(function(...) {merge(..., by = mergeBy, all=TRUE)}, datalist) -} - -# returns string w/o leading or trailing whitespace -trim <- function (x) gsub("^\\s+|\\s+$", "", x) - -# ----------------------------------------------------------------------------- - -streamFASTQ <- function (file, verbose = TRUE) { - - fileBaseName <- basename(file) - strm <- FastqStreamer(file, readerBlockSize=1e7) - if (verbose) { - print (paste("Opening " ,fileBaseName)) - } - s <- unlist(strsplit(fileBaseName, "_")) - - repeat { - fq <- yield(strm) - if (length(fq) == 0) - break - - #print (fq) - #print(sread(fq)) - #print(quality(fq)) - - header <- id(fq) - a <- (as.character(header)) - split <- (strsplit(a, ":")) - indexList <- lapply(split, function(x) strsplit(x, ":")[10]) - indices <- unlist(indexList) - - totalIndexList <- c(totalIndexList, indices) - } - - close(strm) - - counts <- as.data.frame(table(totalIndexList)) - sortedCounts <- counts[order(- counts$Freq), ] - - return (sortedCounts) -} - -ldf <- lapply(filenames, streamFASTQ) - -# if there are more than one FASTQ file we do some more stuff -if (length(ldf) > 1) { - list1 <- multmerge(ldf, "totalIndexList") - # Replacing all NAs with 0 - list1 [is.na(list1)] <- 0 - # sum up the values row-wise for each column, but leave out the first column - list1$Freq<- apply(list1[,c(-1)],1,sum) -} else { - print ("Only one FASTQ found") - list1 <- ldf[[1]] -} - -subList <- list1[c("totalIndexList","Freq")] -orderedDf <- subList[with(subList, order(- Freq)), ] -topIndices <- orderedDf[1:15, ] -#print (topIndices) - -fileBaseName <- paste(flowcell, unlist(strsplit(basename(filenames[1]), "_"))[1], sep="_") -#fileBaseName <- trim(fileBaseName) -plotTopIndices (topIndices, fileBaseName, path) - -#write.table(list1, file = "list1.csv", sep = ",", col.names = NA, qmethod = "double") diff --git a/deep_sequencing_unit/source/R/createQaReport.R b/deep_sequencing_unit/source/R/createQaReport.R deleted file mode 100644 index 3463d50a994..00000000000 --- a/deep_sequencing_unit/source/R/createQaReport.R +++ /dev/null @@ -1,7 +0,0 @@ -require(multicore) -require (ShortRead) -args <- commandArgs(TRUE) -fastq_file <- args[1] -qa <- qa(getwd(),args[1], type="fastq") -report_dest <- paste(fastq_file, "ShortRead_qa", sep="_") -qa_report <- report (qa, dest=report_dest , type="html") \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/fastq_quality.R b/deep_sequencing_unit/source/R/fastq_quality.R deleted file mode 100644 index 58beca86018..00000000000 --- a/deep_sequencing_unit/source/R/fastq_quality.R +++ /dev/null @@ -1,101 +0,0 @@ -# Needs ShortRead_1.11.42 or higher -# -# @author Manuel Kohler -# ETHZ Zurich, 2011 - -require(ShortRead) -require(RColorBrewer) -#require(RSvgDevice) - -args <- commandArgs(TRUE) - -loadFile <- function(args) { - file <- args[1] -} - -splitPathAndFileName <- function(fullPath) { - # Splits a full path into path and file name and returns it as a list - - fastqFileOnly <- basename(fullPath) - pathOnly <- dirname(fullPath) - return (c(pathOnly, fastqFileOnly)) -} - - -subSampledReads <- function(fastqFile, samples=1e7, blocksize=2e9) { - # needed ShortRead_1.11.42 - fastqFile - fqSub <- FastqSampler(fastqFile, n=samples, readerBlockSize=blocksize, verbose=FALSE) - subReads <- yield(fqSub) - return (subReads) -} - -boxPlotPerCycle <- function() { - # Boxplot for per cycle Phred quality - qual <- FastqQuality(quality(quality(subReads))) # get quality scores - readM <- as(qual, "matrix") # convert scores to matrix - boxplot(readM, outline = FALSE, main="Per Cycle Read Quality", sub=fastq_only, - xlab="Cycle", ylab="Phred Quality", col=brewer.pal(11, "Spectral")[1]) - return (boxplot) -} - -nucleotidesPerCyclePlot <- function() { - # Nucleotide distribution per cycle - a <-alphabetByCycle(sread(subReads)) - cycles <- dim(a)[2] - total_number_bases_first_cycle <- a[,1][[1]]+ a[,1][[2]]+a[,1][[3]]+ a[,1][[4]] - + a[,1][[5]] - n <- c(names(a[1,1]),names(a[2,1]), names(a[3,1]), names(a[4,1]), - names(a[15,1])) - par(xpd=T, mar=par()$mar+c(0,0,0,4)) - barplot(a, main="Numbers of nucleotides per cycle", sub=fastq_only, - ylab="Absolute number", col=heat.colors(5), names.arg=c(1:cycles)) - legend(cycles+10, total_number_bases_first_cycle, n, fill=heat.colors(5)) - return (barplot) -} - -cumOccurencesPlot <- function() { - # Taken from - # http://www.bioconductor.org/help/workflows/high-throughput-sequencing/ - # Calculate and plot cumulative reads vs. occurrences - - #seq <- readFastq(subReads) - tbl <- tables(subReads)[[2]] - xy <- xyplot(cumsum(nReads * nOccurrences) ~ nOccurrences, tbl, - scales=list(x=list(log=TRUE)), main=fastq_only, type="b", pch=20, - xlab="Number of Occurrences", - ylab="Cumulative Number of Reads") - return(xy) -} - - -plotPdf <- function (plotObject) { - pdf(file=paste(fastq_file, "quality.pdf", sep="_")) - plotObject - dev.off() -} - -plotSvg <- function (plotObject) { - devSVG(file = paste(fastq_file,"quality.svg", sep="_"), width = 10, - height = 8, bg = "white", fg = "black", onefile=TRUE, xmlHeader=TRUE) - plotObject - dev.off() -} - -# MAIN ######################################################################## - -fastq_file <- loadFile(args) -subReads <- subSampledReads(fastq_file) - -fastqFilePathVector <- splitPathAndFileName(fastq_file) -fastq_only <- fastqFilePathVector[2] - -pdf(file=paste(fastq_file,"quality.pdf", sep="_"), paper="a4") - box <- boxPlotPerCycle() - nuc <- nucleotidesPerCyclePlot() - -dev.off() - -#plotPdf(box) -#plotPdf(nuc) -#plotPdf(cumOccurencesPlot()) diff --git a/deep_sequencing_unit/source/R/nucleotidesPerCycle.R b/deep_sequencing_unit/source/R/nucleotidesPerCycle.R deleted file mode 100644 index f30016232c7..00000000000 --- a/deep_sequencing_unit/source/R/nucleotidesPerCycle.R +++ /dev/null @@ -1,14 +0,0 @@ -library(multicore) -library(ShortRead) -args <- commandArgs(TRUE) -reads <- readFastq(args[1]) - -a <-alphabetByCycle(sread(reads)) -cycles <- dim(a)[2] -total_number_bases_first_cycle <- a[,1][[1]]+ a[,1][[2]]+a[,1][[3]]+ a[,1][[4]]+ a[,1][[5]] -n <- c(names(a[1,1]),names(a[2,1]), names(a[3,1]), names(a[4,1]), names(a[15,1])) -pdf(file=paste(args[1],"nuc_per_cycle.pdf", sep="_")) # Save box plot as boxplot.pdf in current folder -par(xpd=T, mar=par()$mar+c(0,0,0,4)) -barplot(a, main="Numbers of nucleotides per cycle", sub=args[1], ylab="Absolute number", col=heat.colors(5), names.arg=c(1:cycles)) -legend(cycles+10, total_number_bases_first_cycle, n, fill=heat.colors(5)) -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/R/numberOfOccurrences.R b/deep_sequencing_unit/source/R/numberOfOccurrences.R deleted file mode 100644 index 4183dd9eb2b..00000000000 --- a/deep_sequencing_unit/source/R/numberOfOccurrences.R +++ /dev/null @@ -1,19 +0,0 @@ -# Taken from http://www.bioconductor.org/help/workflows/high-throughput-sequencing/ - -## Load packages; also loads Biostrings, IRanges, ... -library(multicore) -library(ShortRead) - -args <- commandArgs(TRUE) -seq <- readFastq(args[1]) - -pdf(file=paste(args[1],"NumberOfOccurrences.pdf", sep="_")) - -## Calculate and plot cumulative reads vs. occurrences -tbl <- tables(seq)[[2]] -xyplot(cumsum(nReads * nOccurrences) ~ nOccurrences, tbl, -scales=list(x=list(log=TRUE)), main=args[1], type="b", pch=20, -xlab="Number of Occurrences", -ylab="Cumulative Number of Reads") - -dev.off() \ No newline at end of file diff --git a/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql b/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql deleted file mode 100644 index c2fead97618..00000000000 --- a/deep_sequencing_unit/source/SQL/DBM_postgres_trigger.sql +++ /dev/null @@ -1,31 +0,0 @@ -CREATE OR REPLACE FUNCTION set_dbm_relations() RETURNS trigger AS $dbm_relations$ -DECLARE - groups RECORD; - next_ag_id tech_id; - next_ra_id tech_id; - space_id tech_id; - robert_user_id int := 240; - florian_user_id int := 404; - role authorization_role := 'OBSERVER'; - dbm_string varchar:= 'DBM%'; -BEGIN - - FOR groups IN SELECT code FROM spaces WHERE code LIKE dbm_string EXCEPT ALL - SELECT code FROM authorization_groups WHERE code LIKE dbm_string LOOP - SELECT nextval('authorization_group_id_seq') INTO next_ag_id; - INSERT INTO authorization_groups (id, code, pers_id_registerer) VALUES (next_ag_id, groups.code, 1); - INSERT INTO authorization_group_persons (ag_id, pers_id) VALUES (next_ag_id, robert_user_id); - INSERT INTO authorization_group_persons (ag_id, pers_id) VALUES (next_ag_id, florian_user_id); - - SELECT id FROM spaces WHERE code=groups.code INTO space_id; - SELECT nextval('role_assignment_id_seq') INTO next_ra_id; - INSERT INTO role_assignments (id, role_code, space_id, pers_id_registerer, ag_id_grantee) VALUES (next_ra_id, role, space_id, 1, next_ag_id); - END LOOP; - RETURN NULL; -END; -$dbm_relations$ LANGUAGE plpgsql; - --- DROP TRIGGER IF EXISTS dbm_relations ON spaces; - -CREATE TRIGGER dbm_relations AFTER INSERT ON spaces -FOR EACH ROW EXECUTE PROCEDURE set_dbm_relations(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh b/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh deleted file mode 100644 index 6eb5ad9ec0b..00000000000 --- a/deep_sequencing_unit/source/bash/CreatePerCycleReadQuality.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -R_SCRIP_PATH=/usr/local/dsu/R-scripts - -for i in `ls -1 *.fastq` -do - Rscript --vanilla $R_SCRIP_PATH/CreatePerCycleReadQuality.R $i & - FC_NAME=`echo $i | cut -f1 -d \. | cut -f1-4 -d _` -done - -wait $! - -sleep 180 - -/usr/local/dsu/pdftk-1.41/pdftk/pdftk *.pdf cat output "${FC_NAME}_ALL_boxplots.pdf" - -for i in 1 2 3 4 6 7 8 -do - if [ -f "${FC_NAME}_${i}.fastq_boxplot.pdf" ]; then - /usr/local/dsu/pdftk-1.41/pdftk/pdftk "${FC_NAME}_${i}.fastq_boxplot.pdf" "${FC_NAME}_5.fastq_boxplot.pdf" cat output "${FC_NAME}_${i}_boxplot.pdf" - rm "${FC_NAME}_${i}.fastq_boxplot.pdf" - fi -done -mv ${FC_NAME}_5.fastq_boxplot.pdf ${FC_NAME}_5_boxplot.pdf - -echo DONE diff --git a/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh b/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh deleted file mode 100755 index 0fbaca5ebc3..00000000000 --- a/deep_sequencing_unit/source/bash/RTA_check_on_missing_images.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -# Checks on missing pictures in the 'Images' folder of the new Illumina Pipeline 1.4 -# July 2009 -# Author: Manuel Kohler -# Needs one parameter to specify the number of cycles which may vary - -export NUMBER_OF_CYCLES=$1 -export NUMBER_OF_LANES=8 -export NUMBER_OF_TILES_PER_LANE=100 -export NUMBER_OF_IMAGES_PER_TILE=2 -export IMAGES_PER_CYCLE=$[ ${NUMBER_OF_TILES_PER_LANE}*${NUMBER_OF_IMAGES_PER_TILE} ] -#---------------------------------------------- -export RUN_BASE=/array0/Incoming/Runs -export LATEST_FOLDER=`ls -1tr $RUN_BASE | tail -1` -#export IMAGE_PATH=$RUN_BASE/$LATEST_FOLDER/Images -export IMAGE_PATH=$2 -#---------------------------------------------- -export MAILX="/bin/mail" -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -#---------------------------------------------- -export BOX=`uname -n` -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Number_of_cycles> <Image_Path>" -export DAY=`date |cut -c1-3` -export BUILDSTAMP=`date '+%Y.%m.%d_%H_%M'` -export MISSING_IMAGES=$IMAGE_PATH/missing_images_${BUILDSTAMP}.txt -#---------------------------------------------- -if [ -z "${NUMBER_OF_CYCLES}" -o -z "${IMAGE_PATH}" ] -then - echo "${USAGE}" - exit 1 -fi -#---------------------------------------------- -echo -e "Checking $IMAGE_PATH as Image Folders" -echo -e "Looking for $IMAGES_PER_CYCLE Images in $NUMBER_OF_CYCLES cycle folders..." - -# Create a reference file -for j in cnf cif; do - for (( k = 1; k <= $NUMBER_OF_TILES_PER_LANE; k++ )); do - echo \_$k.$j >> $IMAGE_PATH/image_reference.txt; - done -done -#---------------------------------------------- -for i in $IMAGE_PATH/L00*; do - for c in $i/*; do - NUMBER=`ls -1 $c | wc -l`; - if [ $NUMBER -ne ${IMAGES_PER_CYCLE} ]; - then - echo $c - ls -1 $c > $IMAGE_PATH/incomplete_files.txt -# cat $IMAGE_PATH/incomplete_files.txt | cut -d "_" -f3- | sort -n > $IMAGE_PATH/incomplete_files-s.txt - diff $IMAGE_PATH/incomplete_files.txt $IMAGE_PATH/image_reference.txt; - fi - done; -done > $IMAGE_PATH/missing.txt -#---------------------------------------------- -sed '/^[0-9]/d' $IMAGE_PATH/missing.txt > $IMAGE_PATH/missing_tmp.txt -sed 's/^> //' $IMAGE_PATH/missing_tmp.txt > $MISSING_IMAGES -#---------------------------------------------- -#rm $IMAGE_PATH/image_reference.txt $IMAGE_PATH/incomplete_files.txt -#---------------------------------------------- -$MAILX -s "Missing Images in last GA run on $BOX discovered! ( ${MISSING_IMAGES} )" $MAIL_LIST < ${MISSING_IMAGES} -exit 0; diff --git a/deep_sequencing_unit/source/bash/add_p.sh b/deep_sequencing_unit/source/bash/add_p.sh deleted file mode 100755 index 45a01b3495c..00000000000 --- a/deep_sequencing_unit/source/bash/add_p.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# Simply adds a 'p' to the int and nse files - -for i in `ls *int*`; do - #j=`echo $i | cut -c 1-16` - mv $i $i.p - #echo -e "Moving $i to $j"; -done diff --git a/deep_sequencing_unit/source/bash/check_on_missing_images.sh b/deep_sequencing_unit/source/bash/check_on_missing_images.sh deleted file mode 100755 index f2f7bb5e292..00000000000 --- a/deep_sequencing_unit/source/bash/check_on_missing_images.sh +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash -# Checks on missing pictures in the 'Images' folder of the new Illumina Pipeline 1.4 -# July 2009 -# Author: Manuel Kohler -# Needs one parameter to specify the number of cycles which may vary - -export NUMBER_OF_CYCLES=$1 -export NUMBER_OF_LANES=8 -export NUMBER_OF_TILES_PER_LANE=100 -export NUMBER_OF_IMAGES_PER_TILE=4 -export IMAGES_PER_CYCLE=$[ ${NUMBER_OF_TILES_PER_LANE}*${NUMBER_OF_IMAGES_PER_TILE} ] -#---------------------------------------------- -export RUN_BASE=/array0/Runs -export LATEST_FOLDER=`ls -1tr $RUN_BASE | tail -1` -export IMAGE_PATH=$RUN_BASE/$LATEST_FOLDER/Images -#---------------------------------------------- -export MAILX="/bin/mailx" -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -#---------------------------------------------- -export BOX=`uname -n` -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Number_of_cycles>" -export DAY=`date |cut -c1-3` -export BUILDSTAMP=`date '+%Y.%m.%d_%H_%M'` -export MISSING_IMAGES=$IMAGE_PATH/missing_images_${BUILDSTAMP}.txt -#---------------------------------------------- -if [ -z "${NUMBER_OF_CYCLES}" ] -then - echo "${USAGE}" - exit 1 -fi -#---------------------------------------------- -echo -e "Checking $IMAGE_PATH as Image Folders" -echo -e "Looking for $IMAGES_PER_CYCLE Images in $NUMBER_OF_CYCLES cycle folders..." - -# Create a reference file -for (( k = 1; k <= $NUMBER_OF_TILES_PER_LANE; k++ )); do - for j in a c g t; do - echo $k\_$j.tif >> $IMAGE_PATH/image_reference.txt; - done -done -#---------------------------------------------- -for i in $IMAGE_PATH/L00*; do - for c in $i/*; do - NUMBER=`ls -1 $c | wc -l`; - if [ $NUMBER -ne ${IMAGES_PER_CYCLE} ]; - then - echo $c - ls -1 $c > $IMAGE_PATH/incomplete_files.txt - cat $IMAGE_PATH/incomplete_files.txt | cut -d "_" -f3- | sort -n > $IMAGE_PATH/incomplete_files-s.txt - diff $IMAGE_PATH/incomplete_files-s.txt $IMAGE_PATH/image_reference.txt; - fi - done; -done > $IMAGE_PATH/missing.txt -#---------------------------------------------- -sed '/^[0-9]/d' $IMAGE_PATH/missing.txt > $IMAGE_PATH/missing_tmp.txt -sed 's/^> //' $IMAGE_PATH/missing_tmp.txt > $MISSING_IMAGES -#---------------------------------------------- -rm $IMAGE_PATH/image_reference.txt $IMAGE_PATH/incomplete_files.txt $IMAGE_PATH/incomplete_files-s.txt $IMAGE_PATH/missing.txt $IMAGE_PATH/missing_tmp.txt -#---------------------------------------------- -$MAILX -s "Missing Images in last GA run on $BOX discovered! ( ${MISSING_IMAGES} )" $MAIL_LIST < ${MISSING_IMAGES} -exit 0; diff --git a/deep_sequencing_unit/source/bash/check_read_numbers.sh b/deep_sequencing_unit/source/bash/check_read_numbers.sh deleted file mode 100644 index 7bf8cf3ccc5..00000000000 --- a/deep_sequencing_unit/source/bash/check_read_numbers.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -export RUN_BASE=/net/bs-dsu-data/array0/dsu/runs/ellac -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export FC=`echo $LATEST_FOLDER | cut -f8 -d/` -export NUMBER_OF_TILES=`cat $LATEST_FOLDER/Data/Intensities/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export SUMMARY_FILE=$LATEST_FOLDER/Data/Intensities/BaseCalls/GERALD*/Summary.xml -export SRF_INFO_OUTPUT=$LATEST_FOLDER/Data/Intensities/BaseCalls/Srf/srf_info.txt - - -cat $SRF_INFO_OUTPUT | grep GOOD | cut -f 4 -d " " > numbers -j=0 -for i in `cat numbers`; do n[j]=$i; j=$j+1 ;done - -grep -A 279 \<LaneResultsSummary\> $SUMMARY_FILE | grep -A 1 \<clusterCountPF\> | grep mean | cut -f 2 -d \< | cut -f2 -d \> > summary_temp -j=0 -for i in `cat summary_temp`; do echo $i*$NUMBER_OF_TILES| bc -l >> summary_numbers ; done -for i in `cat summary_numbers`; do sn[j]=$i j=$j+1; done - -for k in {0..7}; do echo ${sn[$k]}-${n[$k]} | bc >> difference; done - -$MAILX -s "Flow Cell $FC: Number comparison of srf_info and Eland Summary" < difference $MAIL_LIST - -rm difference summary_numbers summary_temp numbers diff --git a/deep_sequencing_unit/source/bash/cif2txt.sh b/deep_sequencing_unit/source/bash/cif2txt.sh deleted file mode 100755 index c9c114c7d5f..00000000000 --- a/deep_sequencing_unit/source/bash/cif2txt.sh +++ /dev/null @@ -1,51 +0,0 @@ -# Manuel Kohler 2009, CISD, ETH ZŸrich -# wrapper for the cifToTxt binary provided by Illumina - -#Usage: cifToTxt [options] - -#Command line options: -# -h [ --help ] produce help message and exit -# -I [ --IPAR ] generate IPAR data -# -N [ --noise ] convert noise instead of intensities -# -l [ --lane ] arg identifier of the lane (1, 2, 3, ..., 8) -# -t [ --tile ] arg identifier of the tile (1, 2, 3, ..., 110) -# -r [ --repeat ] arg (=1) identifier of the repeat (1, 2, ...) -# -f [ --first-cycle ] arg (=1) first cycle to use (1-based) -# -n [ --number-of-cycles ] arg number of cycles to convert -# -i [ --input-dir ] arg (=.) directory where the CIF directories are located -# -o [ --output-dir ] arg (=.) directory where the output file should be -# written -# -c [ --compression ] arg where arg=bzip2|gzip|none. The data compression -# format used for the output file. -#!/bin/bash - -INTENSITY_FOLDER=$1 -CYCLES=$2 -NUMBER_OF_TILES=$3 -NUMBER_OF_LANES=8 -#INT_NSE_DIR=$1/int_nse -PRG=`basename $0` -USAGE="Usage: ${PRG} <Path_to_Intensity_Folder> <Number_of_Cycles> <Number_of_Tiles>\n\nEXAMPLE: ${PRG} /array0/Runs/090720_42HUDAAXX/Data/Intensities/ 38 120" - -if [ -z "${INTENSITY_FOLDER}" -o -z "${CYCLES}" -o -z "${NUMBER_OF_TILES}" ] -then - echo -e "${USAGE}" - exit 1 -fi - - -# INT_NSE_DIR there? -[ -d $INT_NSE_DIR ] || mkdir -p $INT_NSE_DIR - -for (( t = 1; t <= $NUMBER_OF_TILES; t++ )); do - for (( l = 1; l <= $NUMBER_OF_LANES; l++ )); do - echo Lane $l Tile $t; - # Convert Signal cif to int - /dsf/GAPipeline/bin/cifToTxt -l $l -t $t -n $CYCLES -i $INTENSITY_FOLDER -o $INTENSITY_FOLDER -c none & - # Convert Noise cnf to nse (additional -N) - /dsf/GAPipeline/bin/cifToTxt -N -l $l -t $t -n $CYCLES -i $INTENSITY_FOLDER -o $INTENSITY_FOLDER -c none & - done - # wait for the processes to end after calling 8 Lanes - wait $! - sleep 3 -done \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/convert_template.sh b/deep_sequencing_unit/source/bash/convert_template.sh deleted file mode 100755 index 9e4c5d8afbd..00000000000 --- a/deep_sequencing_unit/source/bash/convert_template.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -#Usage: eland2wig <chromosomes> <trackname> <fragmentsize> <windowsize> <strand> -eland2wig drosmel.genome Lane5 160 10 0 <s_5_export.txt | gzip - -9 >s_5.wig.gz diff --git a/deep_sequencing_unit/source/bash/createQaReport.sh b/deep_sequencing_unit/source/bash/createQaReport.sh deleted file mode 100644 index 1da680cf906..00000000000 --- a/deep_sequencing_unit/source/bash/createQaReport.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -R_SCRIP_PATH=/usr/local/dsu/R-scripts - -for i in `ls -1 *.fastq` -do - Rscript --vanilla $R_SCRIP_PATH/createQaReport.R $i & -done -wait $! -echo * DONE * diff --git a/deep_sequencing_unit/source/bash/create_srfs.sh b/deep_sequencing_unit/source/bash/create_srfs.sh deleted file mode 100644 index 75456ff4073..00000000000 --- a/deep_sequencing_unit/source/bash/create_srfs.sh +++ /dev/null @@ -1,79 +0,0 @@ -#!/bin/bash -# Processing steps needed from the Illumina Output to the SRF files - -export RUN_BASE=/net/bs-dsu-data/array0/dsu/processing -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export INTENSITY_FOLDER=Data/Intensities -export BUSTARD=/usr/local/dsu/GAPipeline/bin/bustard.py -export CONFIG_FILE=$LATEST_FOLDER/$INTENSITY_FOLDER/config.txt -export CIF2TXT=/usr/local/dsu/bin/cif2txt.sh -export LANES2SRF=/usr/local/dsu/bin/lanes2srf_RTA -export NUMBER_OF_LANES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep NumberOfLanes | cut -d \> -f2 | cut -d \< -f1` -export NUMBER_OF_TILES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` -export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` -export NUMBER_OF_CYCLES=`ls -1tr $LATEST_FOLDER/$INTENSITY_FOLDER/L00$NUMBER_OF_LANES/ | tail -1 | cut -d . -f1 | cut -d C -f2` -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export RM=/bin/rm -export MAKE=/usr/bin/make - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Run_Base> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/ 8" - -if [ -z "${RUN_BASE}" -o -z "${NUMBER_OF_LANES}" ] -then - echo "${USAGE}" - exit 1 -fi - -cd $LATEST_FOLDER/$INTENSITY_FOLDER - -echo "5:ELAND_GENOME /array0/Genomes/PhiX" > $CONFIG_FILE -if $PAIRED_END; - then echo "5:ANALYSIS eland_pair" >> $CONFIG_FILE; - else echo "5:ANALYSIS eland_extended" >> $CONFIG_FILE; -fi -echo "ELAND_MULTIPLE_INSTANCES 8" >> $CONFIG_FILE -echo "EMAIL_LIST manuel.kohler@bsse.ethz.ch" >> $CONFIG_FILE - -/usr/local/dsu/GAPipeline/bin/GERALD.pl config.txt --FLOW_CELL v4 --EXPT_DIR BaseCalls/ --make -cd BaseCalls/GERALD* -make -j 8 all - -#$BUSTARD --CIF . --GERALD=$CONFIG_FILE --control-lane=5 --make - -#cd Bustard* -#echo "Starting parallel make..." - -#make recursive -j 15 2>seq_make.err >seq_make.log -cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - -$CIF2TXT $LATEST_FOLDER/$INTENSITY_FOLDER $NUMBER_OF_CYCLES $NUMBER_OF_TILES - -#$LANES2SRF $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls $NUMBER_OF_LANES -#$LANES2SRF /net/bs-dsu-data/array0/dsu/processing/091208_433DAAXX/Data/Intensities/BaseCalls/ 8 - -export SRF_DIR=Srf -#export ILLUMINA2SRF=/usr/local/dsu/bin/illumina2srf -export ILLUMINA2SRF=/usr/local/bin/illumina2srf -export LF=`echo $LATEST_FOLDER | cut -d / -f7` - -[ -d $SRF_DIR ] || mkdir $SRF_DIR -#for (( a=1; a<=$NUMBER_OF_LANES; a++ )); do -# echo "Starting SRF $a" - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_1.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_1_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_2.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_2_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_3.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_3_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_4.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_4_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_5.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_5_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_6.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_6_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_7.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_7_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_8.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_8_*_qseq.txt & - wait $! -#done - - -# clean up -#chmod -R 755 $LATEST_FOLDER - -echo -e "SRF creation finished for $LATEST_FOLDER :-)" | $MAILX -s "SRF creation finished for $LATEST_FOLDER :-)" $MAIL_LIST \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/createmd5sums b/deep_sequencing_unit/source/bash/createmd5sums deleted file mode 100755 index 53fa5796870..00000000000 --- a/deep_sequencing_unit/source/bash/createmd5sums +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -cd Data -echo Checksumming Lane 1 -find . -type f | grep -Ev '/s_[2345678][^/]*$' | xargs md5sum >s_1.md5 -echo Checksumming Lane 2 -find . -type f | grep -Ev '/s_[1345678][^/]*$' | xargs md5sum >s_2.md5 -echo Checksumming Lane 3 -find . -type f | grep -Ev '/s_[1245678][^/]*$' | xargs md5sum >s_3.md5 -echo Checksumming Lane 4 -find . -type f | grep -Ev '/s_[1235678][^/]*$' | xargs md5sum >s_4.md5 -echo Checksumming Lane 5 -find . -type f | grep -Ev '/s_[1234678][^/]*$' | xargs md5sum >s_5.md5 -echo Checksumming Lane 6 -find . -type f | grep -Ev '/s_[1234578][^/]*$' | xargs md5sum >s_6.md5 -echo Checksumming Lane 7 -find . -type f | grep -Ev '/s_[1234568][^/]*$' | xargs md5sum >s_7.md5 -echo Checksumming Lane 8 -find . -type f | grep -Ev '/s_[1234567][^/]*$' | xargs md5sum >s_8.md5 \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/datamover_post.sh b/deep_sequencing_unit/source/bash/datamover_post.sh deleted file mode 100644 index 3659af90cc1..00000000000 --- a/deep_sequencing_unit/source/bash/datamover_post.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -RM=/usr/bin/rm - -ssh bs-isvr01-s.ethz.ch /net/bs-bsse/local0/local/dsu/bin/create_srfs.sh - -# get rid of the intensity and noise files generated for the srfs -$RM /array0/dsu/processing/*/Data/Intensities/*int* /array0/dsu/processing/*/Data/Intensities/*nse* - -rsync /array0/dsu/processing/* /array0/dsu/dss/incoming \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/do-sync.sh b/deep_sequencing_unit/source/bash/do-sync.sh deleted file mode 100755 index 0ec88d12147..00000000000 --- a/deep_sequencing_unit/source/bash/do-sync.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -ADD_ARG=$1 - -STOR=bs-ssvr01 -RUN=$(basename $(pwd)) -cd /array0/Runs/${RUN} || exit 1 - -DEST_BSSE="dsf/Samples" -DEST_FMI="dsf-fmi/Samples" -DEST_BZ="dsf-biozentrum" -DEST_UB="dsf-unibs" -DEST_C1="dsf-customer1" -DEST_C2="dsf-customer2" -DEST_C3="dsf-customer3" - -DEST1="${STOR}::${DEST_BZ}" -DEST2="${STOR}::${DEST_BZ}" -DEST3="${STOR}::${DEST_BZ}" -DEST4="${STOR}::${DEST_BZ}" -DEST5="${STOR}::${DEST_BSSE}" -DEST6="${STOR}::${DEST_BZ}" -DEST7="${STOR}::${DEST_BZ}" -DEST8="${STOR}::${DEST_FMI}" - -# Lane -LANE1="UB-DE-257" -LANE2="UB-DE-258" -LANE3="UB-DE-259" -LANE4="UB-DE-260" -LANE6="UB-DE-261" -LANE7="UB-DE-262" -LANE8="FMI-HG-263" -# Lane 5 BSSE Control Lane -LANE5="BSSE-IN-134" - -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[2345678]*" Data/ ${DEST1}/${LANE1}-${RUN}-1 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1345678]*" Data/ ${DEST2}/${LANE2}-${RUN}-2 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1245678]*" Data/ ${DEST3}/${LANE3}-${RUN}-3 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1235678]*" Data/ ${DEST4}/${LANE4}-${RUN}-4 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234678]*" Data/ ${DEST5}/${LANE5}-${RUN}-5 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234578]*" Data/ ${DEST6}/${LANE6}-${RUN}-6 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234568]*" Data/ ${DEST7}/${LANE7}-${RUN}-7 --stats $ADD_ARG -rsync -xav --delete --delete-excluded --exclude "*-tmp-*" --exclude "Images" --exclude "*~" --exclude "s_[1234567]*" Data/ ${DEST8}/${LANE8}-${RUN}-8 --stats $ADD_ARG -# dirvish-timestemp diff --git a/deep_sequencing_unit/source/bash/ellac_create_srfs.sh b/deep_sequencing_unit/source/bash/ellac_create_srfs.sh deleted file mode 100755 index 9f306c0446c..00000000000 --- a/deep_sequencing_unit/source/bash/ellac_create_srfs.sh +++ /dev/null @@ -1,150 +0,0 @@ -#!/bin/bash -# Processing steps needed from the Illumina Output to the SRF files - -export SEQUENCER=ellac -export RUN_BASE=/net/bs-dsu-data/array0/dsu/runs/$SEQUENCER -export LATEST_FOLDER=`ls -1dtr $RUN_BASE/*XX* | tail -1` -export INTENSITY_FOLDER=Data/Intensities -export BUSTARD=/usr/local/dsu/GAPipeline/bin/bustard.py -export CONFIG_FILE=$LATEST_FOLDER/$INTENSITY_FOLDER/config.txt -export CIF2TXT=/usr/local/dsu/bin/cif2txt.sh -export LANES2SRF=/usr/local/dsu/bin/lanes2srf_RTA -export MAILX=/bin/mailx -export MAIL_LIST="manuel.kohler@bsse.ethz.ch" -export RM=/bin/rm -export MAKE=/usr/bin/make -export GERALD=/usr/local/CASAVA-1.7.0/bin/GERALD.pl -export LF=`echo $LATEST_FOLDER | cut -d / -f8` -export RUN_COMPLETED=$LATEST_FOLDER/Run.completed -export ANALYSIS_STARTED=$LATEST_FOLDER/Analysis.started -export OPENBIS_SERVER=http://openbis-dsu.bsse.ethz.ch:8080/openbis/openbis -export PROCESSING=/net/bs-dsu-data/array0/dsu/processing -export BCL=/usr/local/dsu/OLB/OLB-1.8.0/bin/setupBclToQseq.py - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Run_Base> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/ 8" - -#if [ -z "${RUN_BASE}" -o -z "${NUMBER_OF_LANES}" ] -#then -# echo "${USAGE}" -# exit 1 -#fi - -function gerald_basic { - cd $LATEST_FOLDER/$INTENSITY_FOLDER - export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` - echo "5:ELAND_GENOME /array0/Genomes/PhiX" > $CONFIG_FILE - if $PAIRED_END; - then echo "5:ANALYSIS eland_pair" >> $CONFIG_FILE; - else echo "5:ANALYSIS eland_extended" >> $CONFIG_FILE; - fi - echo "ELAND_SET_SIZE 8" >> $CONFIG_FILE - echo "EMAIL_LIST manuel.kohler@bsse.ethz.ch" >> $CONFIG_FILE - $GERALD $CONFIG_FILE --EXPT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls --OUT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/GERALD --make - cd $LATEST_FOLDER/$INTENSITY_FOLDER/GERALD - make -j 10 all - /usr/local/dsu/bin/check_read_numbers.sh $SEQUENCER -} - -function gerald { - cd $LATEST_FOLDER/$INTENSITY_FOLDER - /usr/local/dsu/openbis-property-client/client/lib/properties.sh $OPENBIS_SERVER $LF - sleep 5 - mv /usr/local/dsu/openbis-property-client/client/lib/config.txt $CONFIG_FILE - mv /usr/local/dsu/openbis-property-client/client/lib/bowtie.txt $LATEST_FOLDER/$INTENSITY_FOLDER -# chmod -R 755 BaseCalls - mkdir -p $PROCESSING/$LF/BaseCalls - $GERALD $CONFIG_FILE --EXPT_DIR $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls --OUT_DIR $PROCESSING/$LF/GERALD --make - cd $PROCESSING/$LF/GERALD - make -j 10 all - wait $! - chmod -R 755 . - rsync -av ../GERALD $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/ - rm -rf $PROCESSING/$LF - /usr/local/dsu/bin/check_read_numbers.sh $SEQUENCER -# rm -rf Temp -} - -function bowtie { - /usr/local/dsu/bin/openBIS_bowtie_alignment.sh -} - - -# no longer needed with the use of the RTA -function bustard { - $BUSTARD --CIF . --GERALD=$CONFIG_FILE --control-lane=5 --make - cd Bustard* - echo "Starting parallel make..." - make recursive -j 15 2>seq_make.err >seq_make.log -} - - -function cif2txt { - cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - $CIF2TXT $LATEST_FOLDER/$INTENSITY_FOLDER $NUMBER_OF_CYCLES $NUMBER_OF_TILES - -} - - -function bcl2qseq { - export LF=`echo $LATEST_FOLDER | cut -d / -f8` - $BCL -i $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/ -p $LATEST_FOLDER/$INTENSITY_FOLDER -o /net/bs-dsu-data/array0/dsu/processing/$LF --in-place --overwrite - cd $PROCESSING/$LF - make -j15 - chmod -R 755 . - rsync -av . $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - rm -rf $PROCESSING/$LF -} - - -function create_srf { - export SRF_DIR=Srf - export ILLUMINA2SRF=/usr/local/bin/illumina2srf - export LF=`echo $LATEST_FOLDER | cut -d / -f8` - - cd $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls - [ -d $SRF_DIR ] || mkdir $SRF_DIR - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_1.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_1_*_qseq.txt - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_2.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_2_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_3.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_3_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_4.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_4_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_5.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_5_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_6.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_6_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_7.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_7_*_qseq.txt & - $ILLUMINA2SRF -clobber -b -o $SRF_DIR/"ETHZ_BSSE_"$LF"_8.srf" $LATEST_FOLDER/$INTENSITY_FOLDER/BaseCalls/s_8_*_qseq.txt & - wait $! - echo sleeping for 600 secs... - sleep 600 - echo creating srf_info.txt... - for i in `ls -1 ${SRF_DIR}/*.srf`; do - /usr/local/bin/srf_info -l1 $i >> ${SRF_DIR}/srf_info.txt; - done - echo creating fastqs... - cd ${SRF_DIR} - /usr/local/dsu/bin/create_fastq.sh - echo removing int and nse files ... - rm $LATEST_FOLDER/$INTENSITY_FOLDER/*int* $LATEST_FOLDER/$INTENSITY_FOLDER/*nse* -} - -if [ -f $ANALYSIS_STARTED ];then - echo "Analysis already started/done" - exit 255 -fi - -if [ -f $RUN_COMPLETED ];then - touch $ANALYSIS_STARTED - echo "Run completed! Starting Analysis..." - export NUMBER_OF_LANES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep NumberOfLanes | cut -d \> -f2 | cut -d \< -f1` - export NUMBER_OF_TILES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep TilesPerLane | cut -d \> -f2 | cut -d \< -f1` - export PAIRED_END=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep IsPairedEndRun | cut -d \> -f2 | cut -d \< -f1` - export NUMBER_OF_CYCLES=`cat $LATEST_FOLDER/$INTENSITY_FOLDER/RTAConfiguration.xml | grep MaxCycles | cut -d \> -f2 | cut -d \< -f1` - sleep 600 - - cif2txt - bcl2qseq - create_srf - gerald_basic - #gerald - #bowtie -fi - diff --git a/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh b/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh deleted file mode 100755 index 0141a08b95f..00000000000 --- a/deep_sequencing_unit/source/bash/goat_with_missing_tiles.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - - -RUN_DIR=/dsf/Analysis/Runs/090701_426LKAAXX/ -MISSING_TILES=--tiles=s_1_000[1-9],s_1_00[1-5][0-9],s_1_006[0-1],s_1_006[3-9],s_1_00[7-9][0-9],s_1_0100,s_2,s_3_000[1-9],s_3_00[1-4][0-9],s_3_0050,s_3_005[3-9],s_3_00[6-7][0-9],s_3_008[0-8],s_3_009[0-9],s_3_0100,s_4,s_5_000[1-9],s_5_00[1-3][0-9],s_5_0040,s_5_004[2-9],s_5_005[0-9],s_5_006[0-2],s_5_0064,s_5_006[6-7],s_5_0069,s_5_00[7-9][0-9],s_5_0100,s_6_000[1-9],s_6_00[1-2][0-9],s_6_003[0-8],s_6_00[4-9][0-9],s_6_0100,s_7_000[1-9],s_7_00[1-4][0-9],s_7_005[0-2],s_7_005[4-5],s_7_005[7-9],s_7_00[6-9][0-9],s_7_0100,s_8_000[1-9],s_8_00[1-6][0-9],s_8_007[0-8],s_8_0081,s_8_008[4-9],s_8_009[0-9],s_8_0100 -GOAT=/dsf/GAPipeline-1.4.0/bin/goat_pipeline.py -#CONTROL_LANE=--control-lane=5 - -cd $RUN_DIR -echo Started: `date` -$GOAT --control-lane=5 $MISSING_TILES ./ --make - -echo Finished: `date` diff --git a/deep_sequencing_unit/source/bash/illumina2srf-pre1.3 b/deep_sequencing_unit/source/bash/illumina2srf-pre1.3 deleted file mode 100755 index 9fb2a5e45d7aedd7ec24657b9d1ec7cd4deace80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704053 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ξ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%0D-$4G2 zT)=z`8Vm~_;JpnFZ`ZtredMK`bW4Myq<5soe+qdygETV{#lj#byw}T(VK~5r`7vc= z)ceAo17^<CC;-%GGugmd4&!2sx>{6iCs5q`+|d;DPclC|0g2G^Y;ZAgeMSUD1hdm7 zQb%kegOd0sn<!L-li_DX(@WyrHc_;{Br+(8vuvW!0!d_060ZSK7(zD3vm00q>~f|z z2U?cRQAwR+OG6!mS^#gZ`m0#~OuYC_Z?EVTyu%D;b(^@jyiuH3p&H~#Te@@`cnDki zNgHkH1YCx)p5mf7#IjS=T&$QeXimLMic3~n;2AW-HeQNR;2AW}xA9Vf0xvq;FdHxB zBk&BGUK=k&gY7V`_@EgHn&#+~JppUQYO;x|00h?2p>TIhbR(rDj(^O(bmh=7$wWK` z=yc`4I{GN?MA=M)K7sc{>_jY;6@<5sf$E;teshl^8ubbY+gc2f^*_IXZQ6f{J5}<+ z1~-iJG3jaS#WL%&1(->x%irfD$Vd=ihi$m{EH&{0aO(Kh!1HgzjCUobf`<GNszV3? zJl1qn;%<bE-}2wCL^u_r+K$ncn2-uhOi?GNaMSIO)|IG7@FQe|;Cuvki9DNAF(2%U zxw0?#SYL2eUvMpg2a&#Kth|4suFfhLkfB^$?upeRe2NHX#IEm3u$-(@qbz%H)U&LE zx?BfNiwLA<B&Ae_wm~Yf+3ITCVaa+gD?=%6i{Um})@ulYb#wy4n*}<$9Klu*R1?2P z+XH-B#!?e>rU3szz!_>{DPTK$DJ_=ADabwZXuBGp7ga_{_*GXYC>GA4j!04f>U|xE zBI+Md@7sv2^5OBVJo`W7wif8f#o#BMnKEdlIs7Rs6vaPM6WkXG7Rw69TLH9;7khS} znI(@SQ+qb`H}0^YziwWN1C7@sLSb*q6nr#2(SW>7<!&m@^9;i~$1KZSzC@-tbvgzS zX2hqloC+;}22%v%K5CFHUl{A>sRmt%D*TJGLc#7$h4_pMaS7aQyN~UFr>Hgs&lIJG z`M}b2J5FEsj!8zn9!ox7Ql=P53P?*PTE%DFX0fuw{k#d-ey`J#V_xJwd=(U)szR#9 zf69;tb&oM&#FO<R9QGF&3927r<jbOio@XT4A;2crNKBSgpK%|R9Mo(hIf0=Zf6z!$ z$-+ir6+U3f7DGNO#pgU*beLd@o@D-hhrMexA49P*ZnNh;O2DXm(IbSi_H4+aGQKC8 zR~heR6JOB$9L!|PA#?Lz$hLGTK=Va}L*mv{NA{TFFEC<(8B(e753ow88Ru=7#)fP) z&wC8^;$`5VkjG>SjXn**K?t(5{21YHGZ@Z@seN79dKnf7q>n&CA7F}iL@b%&mA({C zm$x32DW2_1@wh9+%Kj<X-qx)$#WI-!kC0_8v{U>9;h)+mj+JIfq$om)RDZu(reoPI zv(vFQC3ZU0hAPOeCSE`VX@pFHyJ}gvc8ZG-9%83B)9$0T8m5ecw;er!iejzB0!%9Z zw>&~N!@%Js1Sw4)!tElA<HCES6<Bn>h;|Z4a}Z>-qY<tXVMMzf4OiO?%w2u_8eIHh z4!>Q9h-kGk8u?AMqmkd$PP8fL=7L|DjL7m`Xh&rE&U7O3foQ<P`l21}iZ;-Rb`p9s zq8-9=EHr@}K1C4Kz#1on3wUQA=}m_;NmhPKA8CU_S|LeK_mLiRNbQpJn?BOd9nxS~ zd#(!G#kk!eoi9l<`bZInR0)#YRX@ye^AIK#vi;Wn1bQLuk<btWnq@psh50Xym9SFm zaEUX(!0zM12Ah-blpT1y@hp4xhDEX`{^?<4@ht7$hF?g`uYkdoMbYgI@o#2Ar1&G~ zysUU&uLs{VHm_wFas92$oJuCbjB3f6Z8z{4M_!P`8?39d#zWcBkJUsSy1V|{k;ut0 zI`}3D^Na~cjncIkHHyJhjv5L_4GWf{e-FU&lrun<wBy|LMSo;@uW#)VqZ7;IxChqn z4!IJ`(bP%mZA15&kIb!~Arg$58h=UHs0-Gt8DYNzwue?~4X}9JF@8B(NjBQ(Rosr0 z<5!{#=)zv}T;MD|V~85peQVeF=Wsm%Unk&9jJSYPb@`s+&@@}S4suB1z$8>)J3#Qr zb$CvYJO?>EH8)Q&P^F|JECj8-b-!ft);D&+&X!Cz3m64E$<5?@3dRw{x*AMUrFZ8P zHb%Bv=gBPQJ6U`z&FC~I3tj^F-qe~Q%DI+Ve2ViNsO&`!ljkIpe22*seN3!&8CP}U zJ`Nfh;!jV4&!eCP4WSQ}+$+2cJvf!Qs2^q-5#eQVv9qMj+$WUYQ6lJ2pAuaMW}5y; z843vh)#t+$rIk;>EU}?*a;kqxsPSKWLwFRqGoIgyh>DiQwR^4fsDZcxy-PEmr3kqa z7kWf~3;zIiE$858vTCQ@a(38*lf+nMEWnk(`7@^5i(PyEfjGS7(}kDSP=#i$(e&cP zCD;1OxB$SN=Y7mbf263deAvGe1!SQDytEilR}b^!RP!n33Cz~WMvR^zIFI-}=bcg7 zbtU7*R!%ApjK%TS09HG)$5xKLBm|$LRzO&Z=nVP?UlPsH43Vuh70#l%y8MWenb9Ll zu8a;Y`B`*8$#u2OvG<WPR*#cO3I(T3;UbOzaY)H^(Lp6Mo1@;6D`Q8o6iqy|W1pma zA2-?>E-s1w9&W{mXGUOs%EZR-)|Lj?1NaUDA;F#m@4zhLkv&7Sj5QRk)W3=4qh0P+ z#<8S}AA%7QZj-eXMM|X*`iz70uITN8ftf8*&<(S$qKJ(l_x}xMst8hVVGrHV$_Y?8 z^vC)&x)IxW900NZZH>Y@PHHBD!wBCunfboyi(|q1e4nm_<I{AB;v;8_6f_eI{r{Q9 zSl5ERc^L$tC4ajUUIrCsm+Sh%yDLG0k3Lmsm1qdp=(P*xu<vbchIk4Z2cO0JXJ7De z^iFx%4cGXMxwx+Q4G&ZQ8ubYo)3NJszo^j!L`jv}vTdF!FY$LTDaQ*OLCjB$=W$FM z`+!|7&A>r9{){{LYoU#3r|;gO6_-Y}WHm12qLnTkj5l*|$dtQIRcJ{p<O~%L-H5xB zrq4jXF`~RhiL!9@eLC3UMYl(IVR5LwPjuK%&G{d&`)%r3lVW`TI}(!?ammLLy*w51 zn{Nfi`WegX6su^LM6yq%kRN^~kyp8q{H=84Y+dX|e&vx!-g8SOkAE(c``pM$UrOX* z4tq}Sm*X-Fd4B9h9-Aq7zUoF6?36K|b0e>iGPQWwQ#6AWMF`FfmmnZdJe!GU$Z=T` zuT+gdf55o`tjgelM`%$%KDUr>zKL$c7a*5>$U`@Ut-S0k(+iam`osH{Xct&bXcR7m z<Trl11lOLIoCL#;md8;(Ts^mMgV@gmHRA5MF+LZsb>UVoAD>k59#7wUlZ$cQUKC~N zC47f0_8}Gf3KWIsbTY^K8gKV`=Dv(QCFo_DCs=I8+IsFyEqB=UyO!^9i^nN&N?sh0 z=Xk-}AU<*bp)0sa2tvGLU&>XLSPxD~E*{B87v_G#cX;*{Zoz?aJ~9Hc7%aw<?7rYe zy!pU~B91~R_RlcR9r`e}E!^Joqfl4yJ)0v=t}i`ImeCr%6Y(D2h#B8ntDe32_KfJZ zeF621jeM$ruSt-U-)4UMKWrNL$j3EU6_Ag7n7|@EANjaxGgu56xDW0g9>hj6aXemT z68jCx%^Vh=h@;zuTh-MAQC>VohBAME(#AKkh<M6l=|+mcIX-1yT({+h=Spzn<jbJm zCJym8eqA*$NAJcn9TV<g56At(b+EEeplhRxqj$f!#_8QSVUKsBVKi`O74N;FLk9J& z=D(r6=(6bE;>{?&?_<P76x7Y@Hzxui>PE4sjeHv$5Bo(|u<MhNUg<M);U{bQjp7hL zU$py9CV#{V8de;7Hl=chK`{$qhlzcvA9lev68r0Z*k^Z3Y-2xc?^^<E-HJ}yk1+SJ zBwS6xwW!YA+_0?itLEU3B<+IqME`tK5{C695@IqR+aU>=?i9BCp4%^JpHOgVvdt4F zsKfe)o5q@7bU-G0I-PI{JQIk-`n8*2=d@MWt`2L__s|a545#$b!b!9cTlfLI14o{f zps|DAimeXZx7m$;3Vq?zkhqP7CvfEZi49A#J@W=MEE(jP8wnV7-jFdNJF#cUsXbTA z`4%}m_G@x#*UjMRJ5TRU)_t4Uv-n&sIq?`C1vT#y)Ezj6%dLZnzu}tl<;jUBdtzAn z+K6jo_8VCp=!~D@mD;K?fw9rS@;$lXO3ae4r*fkNEbP~3UuQ9TT19#LzmLn|5Bu8q zrHNer&crVel&0!pS>95<jHt%%g5HYpPrY*?qR992I3B9;i6Hf}YFFD<4P^_4##Tfp z&Rs7Gsm7l|QuR(QU6o!nK0KQCDYmh2OJJ=Rg!P!BLePCi`D(b=!YDt*dOJ@&cF1RW z2Z|RcW6N-aZyoq4>&s+n^T$YK7l5=eq%i_T%X1^*ZQbQpKowoF;OQ#jjyhw#jab$h zh`{otUiv+T%}>u5{x3{~BE|e^oMN^g`Bme5MOPBOk_23C+yAJVpg$oq-YT?6SbcH& zP`m|hZ3EqwH#fJUdMO{CR1*&)wn%r+wRU-|p97VubUD(o$fu&nebvG9Us%l-gdt9i z?>Q0-tZK<GW63<Hjjk98X6plX^!K^@AjhP>(lLWgAfO<aQy-OH0nJYPP`|Y6?gu(0 z_+_A3cc-NU-}RRxmRZ*?B}zZqW_c9|J-?8GvF&%?{WkfY-%gIrxZ8)fTwKq$@c9u9 z4~+!$mvGY$_xURISNPP0>min7L^s3ZtvozYXz&e^EAU!rJBO5{w?PLY>21^V!}{dh zpkC(->-E`qHpOc{nbJ4phjIH;j`wMAg^2#b@}hXSvdMcqyjCi%lj5d4yooRIm~8Z7 zV;&Y@mlW9LYx~%1&RYRvctsJ;Y!zscS2-}_jgFx1$92i+8L$A|T4qIojtItg-w#gR z{}VEC-nZ!|9nH9`2>0zy;YGjix~yr>zTnZgVCE7b%~0fE>gAT#e<iv@Y@qPDdR7|? zSX>`YFD~c4lsL<@rze1y%rJUX%6SW1;E*01nu}9li*O6!zE-^M2hVq?&m27xv*n6h zyfnhIHk*9G;yFd?a+(V)!LxIkQ=w*bog)>wc1OiqIQa1eZ$mig7ak6dwED`sym@q` zFlqGCrr?E=pf``*A6|<W-T{~x6$N~g4o}KvWgBHV*o^d;14c=Lt+1bkjA&N2*$n%} zxqL0Uju8_M`A7t{WYn)ZF)=Mw6|)l?58~(6g2fARaR3>bZtJV{D-i}Ksm6h8h1=-d zrPB{fc?FHDO8BE4iPb1#5DqIB5tcs$Kw9IY-4@o~v+3tM?qDxfc~}FFXk=FSupNtc zC2|`-#VNS14D%Ei1U}DzGenzA?IP5cdme3ST<rdcM_6BWdaK9^(t$s+DW9IF9>_7z z$8aYmpPX&}>I`nD;K6jUXVX<tLJ30y61|JhMvE7~Wz7y2*XKlWm~J-S5$-ukGe$#i z_i4$wXj>2lL8*(sikXF59XAbH-I2=RLS%p+kNFVm1?W0Bx{kihlRSK!i3*N$a_mfY z=f_+w2sc~Pzrlr8O&{v#`?z?N4L5&2;^Vm7;N}aMGjbPW+oRGqy7>IOm>Eb;!g%`% z$#~peJkIpWA}U!M<Afq_1@s+Z&rT;P-e7ojNn114j{HF#J&zv0zF9c^|G@%)U24iH z-<y(?QCNW@oUeijfbW3YrP0%tE>dXoqZOQ>nBUhi`{t4@jA{Op_LR#pe-dh)kJdF` z!sy)d3{5!HLHS%R4ix>IU)&VxFwa6z_^+rX?i`(pn&O<@@MKl5-rZ0#5O*<pj&9tA zXSfK&1}3)Z<9xAC5erIxL<Y_cXr4}U+b`{mg?o4-COwt8WAuMw#E?%kuYvch@4#8} zA~?`zBFE&!Opkt}&pH{sN1iPat1GMp%b73i|0e4zR7mXI%6q1Kg{yH%9z=+T1-gQM z^dZbNRER-ylm<U0z<Fd)3Z$D;C+amW5k|KK(L_O>oXKN4eDnFmi_Gfslc29a!04d8 z5h!3l_D{{I#xV_e=dgIlRx{4;HrI-?J`O%?lynD-%Wzr|GdoCsJ<{TpA1!&S$IcuF zj~@XNH{IbL{RW|MWIA3$ZTpwE=QOg;!`hpsqrE0%k2&*}-0&zoAFyOD?Ovea5+yo4 z%$MWwYB-LAeq=7V2bD@r%mVZ6QBGRTX~2Y&(M;S)`~q)%<a<!$k$A2&fAK?&?c#b& zo)+1Mow<=vYOneA?WiQ8pnve(2=d3vUM20;Y%~UbuLd9=JuUE{aq$dEP`#VYzyu;L zB!K5QG`%Vhn0&n|-@KLl`nQ1?>1_K}4ZVUZ48s=hLDkWMJ{+NkMZ^5NMjEqIY#YUg zZ>WU>@!T}Vqmcpk+_<<e63!_0M*krqMK_weeg+kP-kG19+X1>0F2N<f1wL~l&|2ey z0wsE-QGwBJ@g*{Em;?F5BJ5Yu;?rd&XmDAQ4-6Rm=)2~DQ&LP}uOdZD-U8DCb4QYr zk?&|`nNygBzJt1GjYF6LxahmHH<Y2`X1gG_)4|vpy@Z2yS2?Do(7f_oegNk2+f^<U zv#We09pJ9=A|gQ)O4(IjB0xC6xRQ+?Kzj(YH<eG;;Z{HV3R;+L8^}YvY(UF`mt2C( zo$e~m{bMqRllD<RUa0%0F!JJwB#frK0e!=hhzR{v6NTs%I76IcKcIB*KfdC8$bRMe zp8@>bl3;2cmE!aXG9;%!SEU$y|F4{q-oc4hT#xt0=7hQ`#W>xstSso$e{l-B!e;+} zW$SqXr9+<)=F~@94M%M%`X54g)GbQY$D?kro5#+##Z{Rd9T_lg^dfsP8i{%RJLUz< z9Isu+YtU;##-eO9GLJJNw8v+V_O$?de#Q9$X;jx7d;B*?frK#=kqQx#zbfVGFPhG^ zBn%~A$(9+6y3vqte8R5ny{#xCUIc4J8+FL>uz&mGb}Kc&Y5aWiy1zkrG0gweF^8LQ zmX|VcJBt(ngn`F`!9Jgd8Mwkf6SadKh<UMA_2R!bw8D_DV{2eQ+5c#4SHq%gPwXQ` zj7i>jz%cqS-uDp`JvIIYqN;Zu#J_Ud2zjXSR)PFIkvvc+XMq7@u`kdyT4;y4VlE17 z+=PaLdont=PxSAY&p$5Zp7=M?!w19IB_35o$mPo)2L@UMXPL2@0#)JLdKebEw}tQ$ zubvSSzDGIUxgU)zc+7k>VwU5T`_Yg~d7il<hK4y6RhLuCqvh|t3~xY|IF`jhE^uHI zI>==VVUYp?kQ)CAN=MZkPX_;j*%Y(z=uz{2A}748f8r>aKEs~IBs_q7*2)PU-UB+O z^qT7HpHvgOkR1ACUBf}}z$UM)KWc(Ypgm1O&p<bS!>QC+z}fb8yrVk&-2?oVgLs}r z{GbE0POM4fnrq-8$Ua_;J{}NH_N&V|ai>`r3U3O7pqJIPKEyx981H{&1Du!c|B10? zsFcW<R8G6dsFJV84@aYA^YQq9@-;DJs+gxT8Xu3}D6;eYzh?LTW3pngB?jCOET_43 zr;Wtoj#vc4o0n%C^D)?Y1I3lOi>HS5Z$g<fQu!KVl>cZ<zNe-UJ8OFr7psF}Cgk=^ zfOA$Y#P1$)KVqyg8f%67A(ogiw+gQ*MVwdK<g;xX20<cS8T{95n1c%F?P^QK*d`n^ z*idmzQ+b9_QH7@&o60j0Xe#%DIKHVo3&d-i$_E$~)q*$>fzAx2sT_u-`-YBD71fJY zNPW41haJ27*0%%W3w!P7ES)7Rt#R=L<U15kj=_>(C}NYrg;+enE~@#-GOWxbC*#+h zHiaVpHn+{DUj?_dtJ9wIi>D{m<sTtkAX(Wfei1Mrwz3QNgz-pY&mhb#JmKO!_$ex5 zG)|KZ&2RX6aP+!{uS?Z97nty~c6fB5X=qWhA~RULb1{D0Z{t*^2}Qmz^N}CYBEMK0 zUZmPCP6foGo!;Y6%AtN<{NXy;Ay-@AT3z&5I8dv=xMAVIUM2cyr+1*jw^t$^vSbK% zdW)2vB;&%o;Ag7%JAcGkbJ1s|{A9s^EVZTp$=}_Jyw<SrxL#Pg1we>GM7m)_`-)?6 z8^^VNfgzjkH*z7Maq(n`dcUT>5jz%pfnrtx%M3fU8I{QGXhsZN+xZ9|+@^UCA6&+M z({2Z2?ohjN8oyN*PYUDF@j%1HN^DBlxS}r5P^`qphmDH*Ktqud8w0;(KD_SMhD()b ze$OT44GVFV3ECAq4?(Oi$IiqTOQf-rxl_=v@L~jWIZOLI_L``wZNK8<SnZN$g-+m^ zIxN4NZ`Gs4=xks@c_GNgoS|X78;Z5X<+nh2aH;8+h%PLICK`(xrM>onmgrU!uP`iD z0BL~)3M;Nal>y}cKt*rGw0$z3EXC{E1Mw_r24<Oc$<g@DL#WPi<xNA;@D=sRYcsS6 zwgng^sNw~+iuq3b<h7Y7RPr*hT~NGNO)^*gO++bESLYNpT7ibIPF0s(hr;*eRFt06 z#WJU{^>_qTWNjlV=7WDK-=6#WSfol)=ad8`NAi9pA3NXSC#nKome_SmuX06Q@>-}{ zzZ%v%e0$a;z0Xpvp`_M}w?_h<Wxa~U%X@ai$?<GlSZ{^4@mW*)9YL(_W40X22^z~+ zA~EmA4}{;WDKR`#k5$(#H{1wa#BWSi48@W}w5JP^VAvNpnwKnjUNjq?-hFkZB<O9T zHL(~_F06gw*3RJ7UIqVTv6(b=jn`Mp$DM;$;}Jm#BRr6vP&<Der?_J1k{3}M=7f!T zzBJnz$iV-Zd>~79?#<XH5&K(of#t%Q{d-%oU$wwILl*k$u@mLbe4<xjE;Gze2hb<_ zmhi%iWh)U6HG3Nm4ddBG^9a-eGi4(|yoO(qLT}&$PI#eAi`*xW#<OH@{-hBD^TW<K z?b<Ii*}wO~(mCsWLE|PGeUt{%&*&vi_g(A=k-t!Ztea;b$H-Xh3(YCxyT|a*&FAhw zcd8ib6rz%aOLOJy%EVD7Qn5TD)<m(lZ7-gPg_6|j=u+`w90vR<`$vtc>6QVWVE+ix zMEl2$CUbrc{8al#k?Oc+4|qCv9Pq8@SL^cnC;v~Gm_}z$en19%%CBW0x8Z&n$n)JN z1Nja2%0NN49jD0mJBcaV`Cu8&fAek<C-EJzQQ~)2p75_^y^II_^!xb~8KuuB>sE>H zGvfY17>Ctc0rLemd^$qUJ$ZfgHA4oUFu1cU+tXP#2+w2Zb(Q6EVBJuMeqxT8j@Zno z0`v8!fi`Z-#T*fP^ULoB6vl0b2JwByPngeF27$(}j3wobEW9>}y;IBpdx!28j5?#2 zhawyC9<a}-egfAPy$u0QHt|xTKGb92=_|0&tFyft!VL&(dNdoJXmxfr5X_@1m@Vf^ z)!9D$$OFf_Q5CrhjoQG{MMa7yh^MNLZ*6SN)GJ0>{Bgd*?bh2VPtYEp<XiyrLnxe> zABu?qmYBrM5uGDnGoD<F%tHE`c-stT5n>~FA}RHp;a<^0(&h)LZt^-exYT8Lfr0$> z!Jb9%SGy_|d*Tv8SHZy<6WbqH{5g9GwD<2T5jnZ=QW)o6^NCwo?@pspAcIN<9z*LK zpmdJ*VA=C=BKZ{da&hnhKWK&{5=ljGZwg+SnGAT^zRqr{z7oSbh9$vZ$xf>rCY#%B z>YYp@e*kd2T_##47N}FH>MZkI*IAZvO=nr=cxxJBy2j&eQZ%Xe75T2B{*s(rQ(ldZ zF@eA~{_mv~HlC!Ws>`UiQfR9eQfOYkEi}Fr1)=SiLi-A(?=Q4@(|%BBQjlCMz6F)S zPV<m+Klb3(BMv$q>qm$`B?l4iSFda5bzZrtKe8K7?pI%#NnbH|Wd<bc66s6Ui7Am@ znG&hjF0nB7C~lufuY^divbdo}dmO;J>lUb1zlZa_<TVWV77AuyTr!IwDD~*iM2;)L z{j0<j1f4gWsZjjGPpe_&vE-W!gw3DUu{GPolBK$Q38Ld=bNEb^d~#h~Gc;T8E^n$H z#9CqeA4E0DD31A-yoVIQ<kcAz67@C|Y3JrvZzy@bCmG1pR)mr{a26`_0<f~+Q^XZ> zJlzE03~0hpu};A$SX}8_@-|onJYSO&`>UH%AX$z<-DZ{lU$6onQI*A&-_OSG&qigz z4>Ch~R+2xD_EyrniBdv$N<GgGTS%dYbqtpBfNY0&ZXGWrqHq2J?rLKz9!5W8o_0HI zE~jUhe~a#GKZ!m|M8WV^saQXSp^^P8jF6b7BKzi^J5vK-1F{#tXN2=8m{d56xVh%$ zheT8HQi0d}%@i~%eZ`Gx{797e0FYi>h=ySfU}8?uJ~|LqK>Si0x(J!}oM&%C-#-AW z2po>ocrGH@3koB$krrbpf5xq{crkv)?IBU^PeYk=o!@cATn4zgYvjgr{NpTiNU?u? z=dD<FvuFIU@3GY^kSF>S=k*)j=3>ui{8|*BOt{>bo{vqz8*$)!BzW=Q)?_aAWSQe@ zBv>aw%?9fwSZssyC3ptG$U+=rSm}hYD~2bHe(nbA%sbp*y*URU4~Gq9<oR^1{|L!I ziw#`nfDb!R`mpl?Kj3DEAmB7Nd!ay;ferr`p7*bbigbps*gF}XWp0!AI5?{W>*(;> z2rQ{o`|BG!(RXYd-hVwuM8l679cR1QfnuDXQ17_`mZ8z>$KIZ+h3>ftN`$!@I(~dj z7HWo;MuXD1!yJC6qpw)s7tMhe$Pk}RGIAU5d$2j!Fqaz>^K+xWcQwU}k$z3_yban- z@uUsfP4PbjMN=F*)egy~7~lr$%!5umQtM3<Ab)4iZVDWm7=}9H5Ebm7-5g&03J-q+ z2-gJo8$fvp=l8Q9sN;p8`1?>PfIktH0{AOYDS$r`W!q;V&n3U3EG_;<K`IVeG2gmQ zY;iJB?*!&E(6fQK$qc5FFvIVOd0#3f1A<>F35!Ln;Az#N#@~%hjL1BdisiRPiNT=( z?Tg+Er%{a`@Uqk4sDqj)$AJwtGOmDJgy8xt$ciof(7SAL(TBw$4B+Sx8$iQ;M1S<} z4TBL={2UA%3ZAk!bU2lQ3_NcVG((x_z+w}_n2?K~x=dDOHJTZ!*4}mqFC*by=b+z* zKKx7AB}U7Wy)<rv`4WuTV1Wc{2|{svny1%%+X1K@xx{q2F?qy1>&E00^9N#(pdbL5 z;dd=sY57j^$U@{+LcQ>Vp*)yZeLR*9p*5NK35h}7wYs-hUDFyUZVjs8R-PHa01znt ze94=F4^Fp{&%NwQkv35u!AeW!<l^_bR|m-J>P-B`#GrO`>{@;3Jax_1Kyf#?wPUCg z?1IIc7rtJJwFqBja_DTaV`h(bWSH+T%=}+6BrjGAbIiq;V$3760*BduU%EhX+mhGe zw$@fcdPQnH0}G<5-$BMQsri4Hdl&Gis&nx>lT2WM;2tGnYC(gIHc_jIVr3L10~6Sz z6Geeay;5U2^we4^GeRpQ(3xoV*^W(H+uFP5)c$L)+M|M647or8wAuh(P`pH}vWAh1 zQX!zi_j}jcGa1yL)AKy%`+pygX4YPN?R9zATJL)AYeO93ig%MUI}YZT)=MO1QM|P! zzbNb`F2P|<q-Rjvgf3H~=gGtpBt`&8^jLi)rZmT)>Jlt@?_Jb2nZ5pCQD(W<3<pEP zYo>Lm85t(c(A0v8WY&*B3l(Ivr)#j-TYcrMzT<B&3#wd}MjH>U+gQ}HK5XmmN-C|} zVCVr^3XQ|~JG*f>v*?orK?KyU;<SH6XzS8}%)UW0W;&xt%9sZ?n`7(}H&$K2^keiM zF7Dc1(KQhCb(8k%zp^NN-C<<8GbvL_{;+~Fydp<8smsjH{2R5)nk$zDH<?M0fzGp= z_Nun)WiWD7k+VPsF;B${^A<|p0yVENZ;9kBR56{0JXzOPM|^59j{5#W0lk;IfQW5! z^=v+4AsO+)j3s0=k&!!9GQS*}p)Gig2vA<%lwSzaRK2VOu!CrF4N{P4X}(S{J!iGY zq3`BdH=AD@9KNbzQNA-g%97A<3Bx1LWF3jSy{yOCnX72qLv=BdIkcu$JuiJRsLn%w zqO8AfD4QOO`Zl1>q}ynMt<)$gcz=!9pLr<o6;NQR5{l~mHDY{Lm@79&SSyLjUb<|z zuPD@wVY$vJ{VI<aOhdJCEzh|g7}LQ6qAhW6si4(zHI|+T()|Rk{F5QRep^C?-wN<| za@b1!kza}T6A*v9)UEp|3(Sxm<t`^b|7*D&Ifs{wMGJ&gZ~$`vx49aDYxBiX_xegq zHn4thFBBv@T&-XReO&E$yHOIWujyy8*Wl(Y?1F<0p$`(9gimfl)3dZ{uEEV4uc0@n z$){c`zw2ZH&4se8Mh84a8en5><xHrwxgi<N?0DO?X<$Pf3C*64!-fUBjiv~D>szO- zLv&NORJZhsV@u|9;$V>@cQ|@a@aQFx@D<QY3-h!Q!abpvmK4%UnXLk)qX{itDH6UY zNOA#UzBWJ32mTY~k+avr-2dqEA0f=V3TTZlq_v~!;3T#(U(oQ^XQEL8=T?2O)7Q1< zWMAJVaN%l${@~W{zFOA5_bm9x1bYxGFBeA*Ii4by7K4l~)kjLd<G(vctPp=zkm%Bv zGhd)2ORp0>La19iPOc;=%P!@7pkGCI<zG!9sbAe<US0FNS+L_wC5=4l1zW~*<`T+y zC;UG%n$FJ;jRreT8I3UJGMXp%8Rj{Sc-kDhxp8qO%4yk;`yt%(^_aw8-Kp<oZv*T4 zLWdL2WR~;s<QZ1#=TtTstIfTTG12t3_)>$hSkB3v!cMA_ef^sTJ>()3#{{~QCnE0A zeZ%(yie4nNC9V6L&(_W$8pw@uZqIJiQ0@lA^TSR#g4E5S=dIWw-I2XZw}!1%oQPb^ zefKT&fFi_4%rtqOsnj=`O1G-D^OU42=C^0&LYs+V%KKNh0i9HN-DYRdw*gbg<bZF} zo)KN4cM`ji0*k(zc=GNs?g_3h)EzIa=|-32hW%&E@Ox(V+_)Zf1__hxo*Z+p3TkP8 z*qvFiWgvoF8js`2W1LOl32%qDyp}E-6CQCed2o2xu`60eWKS3RxzVkd(Z&m|B9GF3 zxGNKAbY_B<1Ia-O)>pK=>=lvgu<8*ST~!h0T55N3@Nq`Mq0o)`cW<<*%l36+=ok?3 zn;q(2d^0_YIGY;SQs;)Z3~IG@q-Ikjv|(|L&92MKgPya~S90zz4svZ*<isOe29jNY z@Q6+d-nKpBtS^~?Ip_wbyX(-&T|3A7`jZ30Yx<oT6?&vw1{h>yLYIcsa+ZU(5C1^a zv45ZQB*b0Oth#MlC@yAn_4GG6cqCr#+vVFfB0Hi-bWyH9C3!Cz7N{q04^_8I92O=q zqL}+>+nHQdhg~?ht*rTUT<eS^#Pi|6tP%FZ=j*)?8w~s*nsy^Y*(JSE7h&oTBIk4= zt|B<!?s{Xm&`hW1^06l(uAsc3?h1}~?l`mVUP9Md%ovc|R8`Bd7L>~PEtg-h7n@y$ z_dkMlFc0^Yul0rCj;z#ZK9jI?wYGaKKS9g_=~w#9K-k$Ow-g3r>B&80;^a4Dn5@{o z8GbQ$hqU`@F@Mgc4*|pI#@rJzh>9kA0uAo0_rvZOf>9%Kp>Xrfb`y0IQ-r=`M}^sy zn|3yYHgT0)+W%+Uc|N(r$IkFCAudjc0RI#JoY=<mS}8~yRgy1V-n3KR@!|Z4b4xLQ z&YIshU3%3wolYhG)6ieZ?Y^)(ZO|C1_5>pr#<@7viF^(bMw3h@FoA}KtPcphu*xcr z&x-)HVCE%QHf?<+c8Q#FL2d6QGG2CS_)wH(W+y)gCL;R6>LeB_%Ns&F5~qtwQ-Fvr z*><k3ww+5V;gSn3g%w4mc=S9MqZHRHQPZ%-^q06bV`p9z6mbR{>b8ZANz1)4=Xqe$ zV*nFh;-BBTf5|xfCXcmNc8A;IrNzjy!fo_x#ZqE<`{E~tQG{w3hLi94t&}!|*t9eI zDEEsm|2m4oSFM%nxo$g|@ogChw}pLKuAkxl0hmPF^;dCET(v9|ek=9wQQdz`wk>-( zC9jY|91-KO_@~{g%Fs(ef=rQP9eW!p6a0h0Rpu(4UM}SY3+O~{|K`4L-JclaeLPB? z#s{7}O};<jAAiq%BduWI_vgT*-a-BBx8$HN{x#Mavv7jY4_TZ#WJ)HV$lO7P1eAtH z2nAEi8*&|;bhuRgCjwa^OQ15KW}rw#Uo06OOZgq|y~l7SdA#O2OiQpPTTGh9Y`568 z%OFi0K?V#o0zTos@CK(>Og%s=Vrchg(c?+1zSLB`-G)WnX0+e_s%h!eXCIWTroDE_ z;-DQ`9I);<%$UMN!!b?_4I)SS8(FsVve?IMYuC=RE>}-AalPCg(T~f`Dap>DUE<&5 z&h)zr1F8aIKN5ORlnBJN-zu9&mT^Pq?}^Tc^9~CE<QP5xeX|)Q$g@&R7BTg)8j9^w z@y_z9dJ4ikio+CUQ;?9oKD89td=z<O6yYMK3Xsk`u`$*n-7Sy`Nquxa=AP0l7mKYd zk<RMb&>g-c&6V_C6aPvRk<hz|7jfEwgG11{7)9U|bsQ~$3Z=0pWC>cWe`AMc@4?;n z<R!S<UP!m=SNhg;-hs32v#c0hDg!CYI%FoydcuC9Q!H=HT)c;z``+V4d30CRJVwd> z=<~0T+Kv02D7F)CMci2d9dhh6Bwx0B210CSr`-fi+Z}Z7O38=drbuWLj?wAWRYg=N z@irHNZR<Mw{C5gKsaAe;waLK=2_-hqm9{$uT~4ywPi>l+?+zwYDXD<!o=arvHoN|B zm-v6+M83_Wiu2r|%EVg;AEvqf6>{u+7OGb!yaeKLi66IZ_mS1oE~<B_Pp%4eV&(NV zCye90!GPb6$~>(Y)WdruD$^c^qhh}KKpn(p&b>5{JXi#u=+`55AFgGPXbLV&P~pyH z<=G|P{&lC83m8JZOTQEb2;tC%#9QK+Bq{?|s1^%j7rQI_DQvxYia7YCtkq5fsveez z#e%^mhsHU45aXCBIRo72Cj4<Mz5A$d|DwNeLrcxud>-DiBfEx9Kyo#0GGoKDq9m3c zcY4hdKj(};;wE)RVVUmU1h~aSzwI;BELVF*@FZ+PQ#7a{mX4JcW&Q135zKj*JVbDZ zQp!Oa*~tt#jK$n>*V+6U_o{IZQRE^MjDr=*Bsep<A!wFAoW8;rYl6An6lDftCD^@O z8fZQrO2{7x^*5J0y>%NRHO~PQ-w}*54opv%AIoV9P2>ms!Q>uae58O(K5N-PHIWN1 z4On+gki`cwo&~LpLO@n$!9LO-=yGE9n|+S;6{*mtIx8z^UsTC7CEjuu1t3Q!#@tcZ z0R-v@Nqb4UOzx9q%i=SG^5j?z1K-wg2!PB4YhM8hnpx5EJl@L=JL;)8JL+5@s866Z zMR&5NR<JI3^`G*JX1rHc8?WZ`D(0T|176YKnn@HNiapGZ;YJ)tgEQ5|vb2^~ohc+d zKBMfrFZw;rL8NLTbqbMEE5F&PVXzvm<h9ff2Z{ouj*o@E!>_5d8Kb`aS~thqQaeD^ zMqIs?6Q265)IHP@=12z(g{=quRX*y4I+}>KGVSlDGZW*J!q^zRzv2VYxx_D5r`#yR zW9K}(-#;^uSnjodQNH~@;%}Wn!vYKQwh4{Mhed0$_X2<~@~)t|#2>>TypGEJw+Z<+ z%D4LB;J@%4{7I~8qWIcYO(ISAq*^$053W(Z<t;>)3h*(SLXsT|fGp6^#4Fql?1MUy zw=wtBPcAwI;`+;hC&uKfXru}a{MXbvh#i`44xtYztJ~$4xR?Ij*%@&!9qjmm?&J;t zE7Y4i?ftOWGW7&GkpTK?K8%ERB~Y)v_MzUXg}hVmT`vGJbD^%E$1qQk73`jo*~_uh zPMB2|awdbQ*TceB!Im+sNd_NhpxAP6%z4=Xl0_})IZ1P3u6RrAQwRn*j~`ihByS>l ztVu2)d7Me!Oj7<)U?EA=Op=U~6kP>LsG}k@CX!rA677^Emy;CDF3A*0X`f^p$x$YG z7fJq;+;)D;O!6L*GGFB0OLDYH{)8mtxa8hP@)(o6pQNl7avvaRkyLMEIiUwzibKB4 zs=!}ulU$036w2h4sXp?!FxxM|=I=g@HnAxX7jFTG80gKz%<kIX7j;N)_(l$Q^<BP+ zh2C&dKM7KbFdNAu$F)p|IEOr+xu#S~K2IJxt}m66BJ!_!`<h8WSoL0qYQC0U_0`K@ z`4Lz`b@Zs;@=8uQ`2@DNPa|9buhFNt6TbyRdJ=wL9NJ?9%Q$7A9G)Z@5BihS0-&KT z{y#V-u?b8kaY%ydCZv;fopSz0T8mf`-T^E?OJoI$Va?QBuYCfH`JeU#D3P<oUFgRh zK)th<k2sf0#zdUMfFS5z;&+eR^5%%W&g_(U1q53DtVd^#CAIxp#wer>LZ_pLsrq=; z*D5E8Oq6K*v&TW7Mx`}5!*BozEc*)bH-N1+zOA`JEUT|c9>z4Kk58I6B@Z8~*Sn$e zl82AWk-e!HL$aHokuYNA?mB@Bu7Uw~4i`*Am^F3FIWL*g3Kl1RXHH=0cj<I?d~)zO zE47yTlY=z0nS^{I1<RJ5<#p#m)1CN9$-!e2Pv@3|N&%gQ^iBQ}U3#g6^;9}u4a}qx z+184+vde&K!D-_Khd!XD^L5zi;uI|r_EN`#a1%t<d=14h;tz%+r;DELT1F!CJ2a3` zU&L8jE8|E!J0pG5gp$k?99|u=Xas;6+;yaDqcZ0(@A)=2d)XzKPfE78wgJEP@6lt) z+*(kNy!lzas=2(W+nljLJ_gZv@DG0u(t8NEIQy*B7W$!&Idub{J0<xZ%;a%REpJ)& zk6g_xzlTF-Zmqx^u|8yLRLIYVc_u6M2)W7k2%Ypz5;=ou_5N<GF&E0tR&SGJlMA_g zFAV=WsYb<UCn6!jS#+X!IgRs;xu<+gZoGkHF1fBKnp_)Dn?bMm$WgMSWk6K%cy$#_ zpK;DpchQJ;j^^YZyqS}Gj`W5lShVI|&JqsK->{*t;lrHCfxh{S4KHQXlb;vtjw~CG zgN7n?J#ErnwjG$JcrObk7h=QnZ-Jh`gHD4@jF<3U=f=w0s0P|SF(Gf;2gz}56{3-w zJYQTmhH5w_>g&-RP}BIN4_u+!DA60&b}F1Nmk|Nk0DhVWcyn<A*_F~EHPW;dzXvbi z02|xX(AT#-x1YtZ%zUeMBMH>e6bi<ZzpvfgBa4?JmRX4tG}~KX@SD_kv}3ToIIxIQ z^>e_b-`=F`5&anH+Fd(~?Gc3E>$kg<Kc5%K=LID%Jr_z0KFWDTod?Fza-OdE_XX0J zw*;_-UyK_)ktPD!JLE2l^kg60LQS_i|0-y|H#B|``0w@XDe0(p|E);b5MjY%5P>N< zBk1d!VSpvEE}Dpjvq$R=eXpo8LA5w(*d@}D7v;*dg91RG*yk5Ipopd)e-`0q**<zc z;G%Gep54G@o3mhRSG?605rerZ@EI3q{;sN%M|C@W)ofdzc<$+A#Dphs?v)9#(?6+N zUeD>V-^0QBR!R|Ov9MoNjh_QIgx*?q>eO`XRPfDq(26hP+lj2tUz<#&<WrxszD9*Z z>snqHkru8nFc4Pj51ID}BM^0{c9pWz@b-24-Li+_(9eL(lg*U&UkTPKp=*8(ASdoG zcVd1R06%iJ)HCzg{u)#(4(p?+E0(^$N@q5`{CNF?#2b(iF@xe{GZVmxF`TxH!p#wl ziXcMwR&2++1ECCpIy!~3Eqi2oF#EdQ^*WrySM@+=Gf=$%5ZVuqUn}}$>``|#Pq$sm zcEbn^u)|u%=MudJaUo{}`|0oSEBJg4bA8VAGEEe6Z=IMQIiG`%>4OjN4TgzB^Mu60 z@^Lbt6FOGX>!i8de2A1QzyToBSAhNPrgbd0v>)5nrE3XJvz(C@r6cDR3A%!(?Al)9 z#LLS8sD@A<p5ju%c2=)7VC$=}4cK5ogNb!3)(HqT?x#U`wQ*JTkNW6Dx#UZ4%oIT9 z!g7h;8PyL|A5&nZE(V|Looe?@*V{jaMps@n3ScC#NK{;?MXd5m9&`nE`mtK7#0D*T z;DxAjNaW8p2Gn6UP;!jul0I?a$YsN_V=f%Iv`n_Dd!=ZY5}5n<M$`TaY^OOG?MwN# z?l2LwqRu_O0n%aep5b>2gAF@(`T9vmQAI|bB_OnVd;yjObg#q)Cf_SddX?;}&{yR$ zZQAU|o4HJsm*$uXUloNz&I>5^v8!yqESkkZp(r^8W%MNPC+ShZ50LaI;NQtH$v<vE zQ6vRBQT8E{9x?m~NskzQjHE{luO{gc!<{5OVt6e{j~HH0(j$idLXsXyANomp#PBmD z`A>4U^6L@9FOe)ZxdS9UV)$<)nQ<vAofI0&`sVLslx)#TE{YYogu3!dc*SV}5#+_- zR~88$yP^G(wBM&0*{)#du-z1d+ir`LSGMf1)Av;Er8bece3Ke;qLwj<JxB}?Uw5TH zk0L$puQbt#u)#XqQjG*3J&nIIbSQpo_Cz^<BqKsbcVZOMv=#3OZJx+DTWi+Wr}m4( z#5>fTJYrejnni2L!II|rcGL4nQrRxa)IHJ#^qs!s!Q%S1)&6=$-`wC5c%0#d9}^fS z4-Sh6$@HvsSywVsB4t$x!kXSxxs(pJrOJi!#t^Bdi&|R#%Jt~-HEApL8ENxiiItiw zi42<H?NsR;qzjod$fE2dQ?_{;txhDZx#Z-*k;py%QJcqpxXpg*k#Ca+eeqjpI6ezf z<aR1)Z@!;ur3nuotT-qpnvcn!T=k>$kVXv+>A0h-AK9`oGn->4nbH%c0k@9fYhV?9 ze6E=@=LPHTb7db1sJ)M2MFecQ&rvTUAp(6qu6dHpPA^BvxbTz075Dk8WZ9`n2SsMt zn>~j47K64Lz7G=;C_RUoyKOil*=KGlC6fup-1da*0=X0Bi2BRl#N;Xe_#}_vbmDz2 z50Ll2BSV(rOg<HUhQ-KG4L6e<WHI89D8iX>QFkmhBJD$BMEQc_0#On1zIHWVFDIk) zLn!}GQ(CSYJt8D_SlEPQkKcux(k!_;pGG+)<EPtAC3IVAYVG{`pV>*Ips}^cO+Hbh zP07S_5o90Zq@7y{oygVh_;`I{GTg<zd@vd2;y3*Ah0hLU<Cj}2Q{x24(gC0&^-D*h zCBr<K?aJ3-;=MwXk4>z!Rz5OL7ICh9sY!jCLR6RdqY%GqL7E(8E7l5jJ4#gS93rS= z<Bg{jb$kQK1R{vgEKvV@5c2t24d-w~O`*mNC)v;&Iw`$Wr^=hjywO`Dw=ZSgtn;<q zrB~X=W@f%iJ8ULOItOzl_$IfPvyZS)bS$ZySo(I*6h|?q_7gJER_pnQI&|a&O`mBW zPwn0bjkHCJ{z2sh=-K+_OZ2&Jf9p1VBGg;o>lIq!rtK`OB>uZx{J?u1L&f8PcBmQh z5;hCnq_l|u6Jhf4nyLrT&R*w*Edz)k_oWvd@fPL|HAa7v2ndb0Be~nBigiYVAlS)T zO#;JOU&L6MtUwsXqWM&W`ap9BK@}=g6PpIYBEfa-Yvlqa(SC@LvJP^UbDQij{WP<% zL;d_U=+qzQAa%tR9;EzLR_iD#$Ub7|Nv$72An&|8izqu1sqaV&ZWdLQL@*yG7nE1D z1dx2R{tZBA#zLLe=vCEcrFN5RH+|sDErZ@iURxr>V^Eb)B!&Pm*t#o<PqF9AANHL2 zd9LO=4A`eu%5U@6wNzkNJ4%Z9iI6Ab!s&89Rse@iKJbAitXelmtOh9UY_#O$2nFV$ zysN;zcU%L8*vK?1(WJ!abkI4oN_ME)jKu@IQq&!Oi95L(TjxOE3@uDiON59By`_7X zxLY`%*ikzmJq<N;@#67z6J+}2UH4tygn+Up=9cSZ_UQ&ftzbugQS}X{5Zbb1ukdl5 z>bRL80p2`lL^vfek9m~{GW#+2*Nb#*yxXu>e<KHeHVoCJd8{z31OERW4Hk9$sDG-X zJZoZ05+1xFRT^Me{A<oCJR~QHPlnx%UzvQ5Q|Wr9mm&c<J&6!dH1OVy65FS$LQtpZ z(&KLmV_Bs~lo6SCVd<i>CR19_b+*6oRpq$CSC1mU&&O-pX4oLuHdxU$(o4d%sP`_> zLq{Yf9<O*cSK6{pj^^HRPj|LTyaA*#g)V3F+lg<RcwO%-QM>Op>yBwnh{m*Tn_3DS zv)%L0%JIWF{l8X8!Z_xYeG3^2?x0-El@h0Jl9eQ*0v}cp#7)foGBFMaR*{bHAEBxM ziJq}uD>X^VyA@)jR#CT$18HjAF5M+T6u*6if=$ngE5qz(i>y_#ss8!NgGb`W&R=n` z2<#y`{kBnpfUQ+$B2=di7>7<t1Y=F>8`1ouX50s~*xj+FPOU3#BGTong5u$`%10)* zTehzs_lrJj<@90Ti<8h}!15LoF0e!*^1|Nu+HgZe1QhyfV)ydq;dEq})%sIvwN~{< zU3AJIVw6iLt^K}E<xdV!Wp^}P{yaf}hpN1lDwhtY%3;D%v>8Dmaffy<|AtgqoVctJ zBlSQuJ=1qveIwM^DuqHd>hxzC1YR(VO92N1;ZCx{vK>&atqsJSy#;Jd^o*0D&h^3U z8+_jgav`pPx9YPsavrY(kn6xGRGx$7XbsEwx*<5`!GGq<v^RLf=}N52eiwQoH~*sP z72^GYAYQvJ8catlK(JVNR|s*{Ajgc@bubz$^?MG~h<i<7J{0lyA&td|AysuxKJ^_< zE=yj!PH7Y0ugEFvp39au*DV4u+(R#WzwU^8jHtVqr+*1+)P+MRc0urLk6Eiyv!#mp zFiool6Bq-oT8HJt?{ub?E;S9(%=`HU-!~0PUcO`Rn~n*axhc~STA%ni4TM<&UL)>w z_}yNt{a&2!q-INDV{0L*kGt<@^fBSY!MD+L%P^rmzKZF?*52Voy)$qsa|ZH;58A%S z>54VM(!S=qH0}Skwd#?GR44`z+?jB~eBm!Kf~fb5Alim=6%Gqt%4!=3F@IQ<ipVJ9 zrQuB~`=IQE`OXZCu!KE+FKD%jN+%4)jwbhD!SR-L*G;mPM0aGPf)dk@6WuEa3LD2K zdvcYYd3D}4*>z9ZO-OP4|0Yf7Ziz}ZIG?DkoZ7PQN~ASY;&-|eHd_HxDR$t)#!jTH zDu$#0OB=N3Y{ytA%5L1B-;Er-sP=Qa(RRlky&=2*ha2+8R4jvHQ)>OGi{aG4kL*bt zmi3-IRd4g$p7hK%{^8b~Dt(om84FEk3~OoXs2y4dROh!Z#}5qiRW@gV2};`xpJsuP z-UA=!*_dMoJ-KSO_8)+`Ou!tU^>HB1O;Y;{dT%D4{D`DOc4YxdumuC#XPjgUUf5=) z{)`i`-U()(a&|HbZGmUDS>|Hdx-0}NM5eI$v%k%m;_2TxF+xp+H7PjDy+OhfT#_z_ z+w1+1dE3R9w`rR;ZDm&Tf}^$!I2&i+7*rDR^@k^Ph2FmP;+l6F2y?M1yk)2J_LesY z%n+W?o%WxE_1ZPpMX=-p-y{#7ym-8*^TS=Q1)PmBXGRdCJ%34fL|6KfK<Md3uhcxJ zkpLRlccMt1G5Fc?nz5!MikR5V$^4&Nv&p%NTDJ_+M8k-UruImY2`6*L<=E`KBQglP z<owVkZkjm8N`I3H4m<sn4A)>x)U`!LMyzkcLwp93!xO~NA)Fip@68DI`iqM^0i+n^ z03XZ)ZTEblwaRxp+sZ-rL&aNOBG(`;_xvpbHfD*szpTbcO;=<>|CWI^|JVpn*w@oe zzx%^mwl|E}6lpsKTR)oQMdA&w8#%cr)#rM0bbR4in(78ucL-kQw5IbG4tHu6CyK;i z(NmeYj&raI!9bPRR7~PztVNV7&%?dnV)ClJbP4H7FYPB?;iXGSBly+d4I^#D!DGa1 zW^GX7elVXy{qY~&pPooze@@Hy$JqRvN=wX7u^7O1I|UUF(I-ML4QQb~f^8v~AZbl- zi)xH)kQu8>rkNA1C-F%`69JKrit0ss6>C!7Ik;0OkqPuL8d?`0{wH=iMA5X~$f=NT zPaLg(LB91@6Z*#3LqYCKTs?4LOdp2YZbLR~CF5s-{hdQR;=CTI*_V9prsjE@-U}le zM69-~DB{}}3B8U%Q{CqD#FwSC#26}xL;T-CSD11um6BW(jFn={#PxQgK|CPeg|Q2v z*sWx<Zi4mZ)!%a8R8DBAN*Z8dauuFuDvY1s5PEajEL|i064rdINKY%Hp}t$MmO~^Q zdMSP$!UY-=GWVw-3y~lQkzc?x>F_d!KXhKv{<{(tyjKfiV@|D<&aqUwXk+NWqV12@ zwqsT?9vM={30%jv<_ECH>Mv7rl0yUL6^D+{`^Bdt$HbI*3SP=zp)96U`<PbN7kRex zc3o%3D6%uJkg2=H(i2btEY=4C&|JI|nHsJCsMMMYSqLJ4Mq}&MOIIs0KcE^6X;cdq zvi3!~0~pP9#{X>88!w;`kuS}6(lA;L`R)e!F8{`8SjeX{U>-A`5A}!6U<&pt+7Y6w zCq9acZ;J@O^(bH{T&+?))zpi9VtiEQxjdBik-J<5>iwAaEB~AK-~Y$&^ZbVwzZKf& zEr<nJ536;J0MwoGpT%}x@7^OAOY9Eo<zPY&39F%b4(-6Ndu+R-hAc~j;dn|QnjG|F zf06zo_FV<9Wy}2`_xcZZI-&IlXCi%If&c9NHNRweJg$+54hDADn&0FyQ1XcT-C}wK z_?VUpO^DV5uc$`dL96u|-WmN;VUyCM3%w>0bWrAFdsUGyQZ7w+J^K#2L&-T!d! zOgOEN^zd1BE4@>zE<SRkt)bG-hVJ&V?$=opBujiNX#~0ZtLjOwksq5pd_-PVzxML( zG<mRkuc}fnZ;{D6Me<(Ld0`x#+k`%`(~q7aj2CbEOzAcWDGvI9L}{%;#=)+dM9xR> z+w%s$p&BEC2#kQX_rzmfY?3m^P$&8}HLHeSlxz}*z5yTFj7FuX;MCV~snWr=l9U&h z0wSM5FvAdq9Uck;sXYx-F8)n$ys&djPd=0y3Pie2+#U3Y4q>Il^_*C0{4)Nj#AR!! z<hN4As6i0b-#({*K|(6}AcGg)WS!NDa7#OlL9xb(6M><R6uy%lHnOp*ShR3gh3>yP zn=+tAbsu$RUt*nhEN3L@j}HjT&wbTD<8&aF;SSaEds3U#l0WDMaWS9Y9{(NM7ir_W z4`~!0KdB(BonE+!vM|@fieL<!EEP&q=TVb<^%<JX%qKsG&x8*XnNmO<XIhbArNr3K zc99f`rWM;1(ZTDWx<JXD284i;I}Hc{C3jjizt#NK@>|RABz`B^O}FD*K6#BuoYeO( zKv%&t@$B%8!Uc-YFGblXs$kd0%;~8>i>Id|>`g`3n~HEH1~D`;wbGMD!B1C*4z#SL zjcTz#RG*dl7g3~(CMpphV`YAOC1x?zI1+%5{U_)){KV~zoIop)W8rPOQT^?0L1Rj& zXQ|}v5S7fL^HNDI62r5JHdRX)V5#F0EPYKKBQJ3y#eqJ*D1lf)k&(J8y7Q9Ewze?n zIhvkOS_$o7fb7M~M);x6nRnF(bbK;<w<vMq6U+*`*~58G{}9%jd}U%gyG`UtvMLVl z*C_0-$=^%PFtN~9k5Z2?S5F8wX=@dcl@vYefD~PFztiA9&|lIj<y*Ho`ZqBKG&lj^ z^tD3l>wno5QkT=KNj`NW;^FM8oE<Mr^42>$QJ3Yi7rN^HRH}=@E#-ISlnb@cTH;Ec zs|WL>RIQc(STnkzwlc?2K+fB|eqMm04-2s?kW=_w^(r6!_t3F5bo{g=L*9lv8zTcc zl4GFr1L|pO@DT>#G2l}y#pJRhAoGBLMGE43qJI;X28ovW0hH`rw)><!$T?W5{s1W4 zC#AgV0ljN1AW)GK=$tfE<n2*VsbOxYRG<QUm||U_x{<mxR5GV(P#F56KtAGWHo<9Z zG+dtug6j!VQ3+$VTvee?dW-r%ZRqL9L#rdaSw(N8_z3$J8$xR(TGy@=I-Ki~hCnoG z8`A6ryek)WA%wBg7#W=iYokq_BC}{KM}8E>0_U$%GgVxL$-1uNS#bLDL#HNC^4oCj z*H%sPTq5xgnMgFB2nH+i70P~$Hr25VP+T}BNhs7_&9I1II1sTSdoe~Lpxap{+As{( zvFWMXCeK<-oB#<gu*4C=%!?L8<$lb~9h<bCL)Wij08>}0tI7!e#p*9n5?%#{5=7tB z$;F~U(OoT<Mcp<F*#*oECqy-NZ>EyP#s<vk)|D6$xqw8Z5r75D=A}g4<qIRsSn@Qp zF0YL?rhqZVHO1$_pm5|Tur`J|NyPcgCv-n?PWX2YL|{^mZZZ<;YW|`0w<Lnxa&vaH zrpM@PIJAD*a^ywQ@!q0SBY3N+Y$L;bO!HuRC{|=pkA*R*2cVsV+{+DT95Y%t!y;Mu z&<yL|=?k3GQ&&ztD+l<ByST=9^@9TMZDJ>Kq<K!=E-WJ}!%tQMObwF;>#{vw)4SDY zOw%45e?b{mdec*ANe=9DP%a{l@t@MVzb#T$@9a&y-cYlLN?U#(4(+z?j!QS=fMPeG z=p~j7pc$IOvLFhB>}WBC1WjA%n|Ujocoo_l0ZeFTo391Uf?2qn>jCWlcIj6LghWSO z-=+nxNYzrKfdI8EeI;`$)vynQ@B;nR7iB(0Mub|he3tl3@k!q7FbP)rfR<&LWfjI8 zNv{WSh}Mu$H~a;v`r4}U%qzNF1eR%Kko$XAdv!3w*4+>DE;q{}NU3Zih{or1M=5%* zaP}h1rM;zZWbUAFcy$r$|4&r_GqYGmttaG9qG-tc%h0o|h0Im@xjJ8d#?X5?pEBp` z=T0WneE(^lJ(y=YNw*9B-6{vu0JNBnv!;X76L@tfIz3|A^>9^kKln@tW@eaZqt4Tf zoDJhq;z0ULG3ebTrkNDPw&^~8<qW&O>H$(Zx|#kZx|#kZx*5OhD5<$e_#ic5A`y93 zSAC5ppa%dZ1dEFi3(r(67R_Xq6EJMx{bXku=`+<?95dK;I^AnPZ$)a#6pSpG4;vl) z0@G7%KgRyDS!G?Xm)H|}oozN{P$Nv-r<%{xM3j{hRj7=wO*#dgRElY%5aU&nPc$=~ z56?JKEHjVj!wXGsRa}b8oC=r5sfCSLO|RXR4cWfuxL5P!T=g&Wm7Q*_rcW}m0O{lC zvF#xEm!a=JhlPZRdvc(~MvA?hYUQ6D+8RF@Vy?Dm$(=T2?3p4}&}&e1xSJS!wiCZW z>F{jq7;!Yjo?HhuGGHts?k9ti>ZDAqE@QP`F1?XvAEeo+d%mP)QX^Hix|vB}MOvxT zb(bHlG+^ZGb2KesE==*JsmMyLr<>j+=`e6K)yM@xuH_L0dn8(%MsYyAykCv;0Q+az z74BzE(`r9M(XBor8!7#0Py=U=dc|u~#02j5sswyM8}R8HpeI*_A1fkH^$mKT>oCqp z&u6kI)Z2`XwRx=uAZ{3X)X?N!o8R=>Z2bl=G8ak<_n5`@h+b@F7{E>JxHj7*=v&qG z27;-nvIqjwSI(SDR+}u+MrVL=3!u-Z7=c_ntyJcH3ckvp9KCJgV^<idT9=xHWWH*6 z8_R%bkzJ~`O(bYKSxpjiTFI>>2`w(k3X*sjNis;Xl%x^N>G+dXNEhkA4!xdWi+!Ka za)d&80iQx&>E@|TS}&n>Jlu4B=*G1ruBi>~NZ0lNfGnu(D1Pok@(1}~ALyZwOMg}U zi>bgLAM4?XoUj9<G7&_`vL-a8f9NYU(fcIv6wxE0s`n`2Y$5EPv^vlMBGpjGo~>s+ z{#$Y;=$s>GnVcWGavk0tWid^B@^6GnmB%9em}Bf0!CmZ8a;(TkZ{nSuUIe4NM^!L= zdNp3AGaoi=F5l<!KP&mNfnK3OGtt##WlrKxUVM@=TR2bOLeLh_x91DFi_QFhLH1i6 zv~VUZ(3kjDH%I>`dxw`K{7US67+WV-unYAWMY*7ke8z)_I|r|<1k~6LHENg1`+=d? zp+1Es*Sk}wRAH#s*D@T5UcHe1Yj$E-eq1-oxP-9H$%FFaK^9s#9wz<28Bf^ifK$1~ z>*Mp{u+IYL{s(fx>>(kX0YBs8PLA1ZE*bYje6^H4AroHdefkqfOqr*JP`^^<t}y3= zA-h+@_<Ez$i;B_hWSQvE$x!sHRa1|dwb?Q{6yPGG`0#xFkH@!WE;FufKht#T`7kr0 zhf}KV1OZ4#@rEB)CBlk;!H%-*>7i|Un7Ci}?%$|DdKdpu_Pgj?^XId-e){zx&FazT zv^k{B<tvHPKeD@ohy2*PoY>hzn{CZ@=mXWwoNH0q<FWKIUo8EoSQ*MWv*8RmWDkg) zL<dQ+bx*f)wK{!=_wiS$2gnVlXOG97en)y@vAS2w*sRvC09cMES%vF%>TT9`HCa~2 zliKV-R%|1m0vRiXT#d3wPj;vudS&Sk^EDAeiyf-f%R7-gy+Uu|Lo<hEWMzu^V~JF> z5MIddwedZnVvnY0G`w)kcm^t_!NL0?R^^X3hm-Fg>1`;wGJZ|8=_Nb8jP1j<GcT$U zOh|8JypA>|w%cFy$DBuH6GfaSg#|Y3HjMv}sP-Siy&ak+yjmo{>ekbVuP>>Hb=g4n zu8s<-(jmpw12ib&VMIOaJYfwZGiY~KM?2PC$ZSl}WnNK^hYGD9ku5nOKtSlg9b!l6 zFIt(qcjazB?&p~bzAYxC$`jH9k^DDNQ^fg&Y@?X-TiHdu(|iq{*~iDKI64FdrW^ZZ zUC`rx7Dx7%rl;nwbY-s*e2Adjv%iPG7gfrU8fJg+Na7#Ldy|866R#uHlHFd6MGOe< z8QE8Q4<&b(hMkF3(9UYC0fUZi1$h;JP&QhgSdvM+A83OG65kWYLka5^5Heo8Ir9j6 zIgkJpL+~TsYytdi&>KiDQJLRm)gqm)HIkZ15@5ET)6C{Ho1#u-WJoSb;+rSWN<6Jy zxTHHn9)co_3re4`kWKtv{EIQM-lN99p$GYsSQ;->XOFlW{HxAdg2~S7Y}3bu&}CtY zfO?TE`jw>v_joa6<P76^6VKrbASBFP4-%@z%i+4aDW=SWUJmXzAVY%|zs4EXmXxh2 zQsc3boqkx5fOPC{e={5S2*-|O>+O&Hoou}goh&aha)r}BhG*e=M7SX}>vh1ARQDhR z;V=-xDpigBS8`Ba^^#_^&DSIcuk`GS2MJ^FE14$uqDw+pckS$$3GY+a`6LY=QD*~C z*@i!<s@9eNj%$E~`MAGolK%Z&RlVfH#`9ySqU4|*zg;9}eNX}LgNa|FM6lDVt7JQB zGD*`{>L!4b{RQ|q{jiOV7F{(`vT^j)b|0QeUbJK)B4Clnf126P$m~E-K)bxE{tu^_ zkb^gnr@NY&LrU}e>4y!m`>J~TEmP<MUS(hKz-S0X*#X3#$m+$>(I_l!Ii(;zIp;M& z{3qcjAcvV3WaaA7T?VhV?gB8`y9(uzIew3|JcJ)(=~Ys}Q9R#VAiyrgpff6$ZS7I* ztVBH(e_#e$E(LTFA4`rh>szz=3mDtuwd~QUhM@Zh5KsOzAVI*Az~0Kd<lX}IU`<ly z^?dryhPP6eQ5O^ZrSqBKZf}CsEG9tYTmSXk#-Jl)awUBBOsQtYS{VjLm`^SdtJwIr zh0)RY<i?#En#-|Zvs$0iO+MNtxYgA~Vc$BZYu-jnO(79q&}H;X_3Xv@g2?05n+1>V zqsys<&sXp{l`YgyB0mhMyOpeR6x=CIr$kzn)%qXIknKJy-4h^h1I=ZQXL1exWFJ_q zdvuXy=;Vsjmrs#p^{82dd%We*qwZlN+9f}gb!hk-@tXSiY1F0pp7f)W^s3#XzI@26 zvNNa?1<h}z>LG^fD;g+PtH>EVKp4rVpTQsp$Dg?#pnR{~FTHJ*PD`xg;|yqIsHXV3 zd-C6_$1jpT=>ZDx_ozYEkrth{$_FNLhu4@|stao%Yo(j$2wDZ8>YN6t#(@8GQp#zS z>B`(FY?#)e?NJwdgS(782KO{SvPYun#ev-3culOUzt1p*>}U-z&dfKY1~;u|fOR9s z8taa~MXGU{G-~qHLjro(b15MIGP~u&KHUv@CMi9Yf0@5P^3mH0-~{vNbeZZ7PvzAX z+GKK5y5K*cS7PZ0KXyOHVCMxhu`j(%`QB^ZrhJ0>TCQMITB)y4B8P^*bs`V!Oz$~< z2K%#KpG7hXjobtxsZY`04{go+hz)b5-kKNaI_9$etkfl>*`0qrw_tZ-==m_B5=|`_ zq?_BQA4b0aXoKpt^>f)qqFL*SKa$(0g#cH7&@_PI*7UyJ#u(gIS&hQP$udM3k=w94 zc$u3#vn+R4N+-Er_Cn_2GB#Pe-e0*RQ1;iTlPU7i{WTFVe`J460ccu8SFnT5;6M;m zKaW`^o_$6(lD9hVGt!Kds7ZPCG(Vgt`JK5*t0b({Y38-4Z9iu5?oltu@hFS8gaJ^` z9TdzB6MdTVf>~?dsb`EI=yzrr4!v3|uk<p6zsT7Kd-S5#&jT%6NX2L3m)q$-2@Q~= z6MIW$^-c5Dopo+euO=0)R;O!(^e3SRbRnTx#!BADS`2p-bIcf`v1<Z_AR3<&qVZmD zebTaMB;%jP&U`4|(MpO612u;J67T5K%#m0Anw~XT;a;j}F}t1fSyY+lpJZx2PB@h0 z+CZlF?>T&`Eh_>A_XW)%@DR!f2|cvpEhQ_);Xv)cAd=MVs(P`ynJL;9TeKQ;)o(Y$ zfjDdJw7~-+016;b4vKhIL}*Cd5aeNUt3{X?|E5s0W$xgu=1;T%pzuw6X04ooYNbEb z8UNSGrzYNrNyPOuqLEynNgNz0h&BakRrN5Yn9!|Ue}mrSv-A&fc<?B_NqbuBO=@ck z^(N{Q08f9JX<@-gFvZ|wByedzD8&EbPc<-xiYQE<1o8QKH@D2S&Cvn{YvpFW9{}2l zwE`Q@rJ;3~)<jqlMTdgP!CEW1m$xiFk&-1l1N0an_c?HG&QA5h)?E8SJm$aPuCWh& zVY|l-)vO_BrT!ud*x6!r>~*ve)m>C(t(+!K7(O7oLr2r_>Rfaws@sxSz6Wld`DSju z1I^SX#(;U9%@BN>#(TYl=lX>-3Y?fr(MdC@S<F!ZlAV?tsCdrI6aXHbHHxhE<dMUV z-HaVld~EaBB*sHukn~7YH*-lO0`2>Hl1Dy>k9h179-%;s9-AzQ0{YBb|A=~9bfm3P zwShAw=hQ98OFXx(!HutU_2s7kL#Uf;9;3rY`bvLGhNM2GzAw2m{Aj!DeVrFkpe0eB zovznoy1WRJD01TGI{l&E_GP=BY1q-+9<&}LWYS)Bmo&~M#oLp6MNT#iPs=q-*=zJ# z>MK2)JnA`;@61WL&Rp{t$0WTQO@^dA1H&ADn8QEjx{4w6^FjPPyfd38SPx!@;o26v zgqsgFS0`Qwh3fGO7yBcyOUt<3{)>TZf8FN3(*L;303!R8yorF3<R)`1Re3S{xM}&n zXdmgy8u7JNPY=_hhYycWZ`~GgDj#FpNsKUDHw5y|by(~__>$f9p87?uXhSf5nid9p z#Cl2S{l3y+^i9B!eGyuyZdYIFyNxD84M3u0*B)gq+wS2*<ne-#+?GmnkUgsDJj^Jx zTKZS!37axeQvc9A)tV>QJk^`0W#$Q9R!V-=Jb8g;zhIu`nRm0y(*pC<V4fD5r}NFz z67y7Jo&x6SlltjT?LbE|j<MZjn@)Gen~wC`?w`bi&J^7%M5Ozt2l5%Onv93?8Bd#x z$MP9ZnvBkThIWgUGvOD!k@Ne<{ATaXhtZSsZL1Jj19jT}MG4Qd7qdxyjSQy+5g54L zLH)g+W2v8N<)+E!r4?i0lNv6Fmg^EZq$18jl#=tx`|4*>kjNIZ<!63h{UmvqED!k2 zRC>R%faJN_`>pkU>%Cvw`<*Mleey?22fW{T-tPkMccJ&YM1K30FP9(w*?r5~O-hn& zL&<x+Wa5@^@(uWYk?Zue-j^@X`oK`~p`qksL&;7r+1I*0m-*on{X>`P$odxRQ==x0 zH4TX5?vtGN8kP<9@msynAv;uQKG%+4tLYUfy9XM=l${r!p3i+DpSvJlo6qgZ=Prz& zn9u!vK6i=LTFfq!J+@7)6g7+>zV<LthD|R__m<{AsElvPcW-_^w<7*zK6hq5w>ti- zeC`GL+*+b4fM&9;#;gXvNIVsNcL)@_wzaZSe`PA%#pU34bv=k6x6nlJ0!_;r&?_Rh z7Kp*l3xQ4;kqk~NXL=WVos(}jKsYb+F+osuVHn&#HK9U|sN41K9-+3tQ)1UN7pt!1 z?G;5>c3G>YO`4CT78fr%4Kul6(P^0NPMhpBOpbp6>nuE)ua0p=DSlTK+*R&=u`=df zQ;Ch6I|o0kOZi`ny>72X*Mgf&<alw;CGw|#EKmM1k}8+fv64ED#0B%GIz&t4O0>|^ zEogP7)id(=F<j;sAK}g_$HQ}T%khPQRx}i)99n-ATXX8MYUj~LkBHu|(cHV{h)vhD zc~TXoD!LpotfkxnK9LyK!_4DC9v2QhF5z*B_sEhE4ZK{_)?U~FMkh$kO08s8RW}kB z;tPwm(5R&P)EZ_aBUAqPw>ZV0kWJjtOlpnGA9ckTfw<h1dp;+ucH(Pq&wQC`3f9Lg z^#qmZHP91BowpT&_FlfmVez$Jfyua~Yq@N{JiiEi5I;_xdV<v5BX?*+<noc27uV_r zd$O5a4L_F}2FybA>Y1fRN-4u+9o^p7bbCi1KkX7fxp{0IE-%BeND&vd&^v?}NSCco zyhT*tb_uxoGy13D^gR+dLey;tcO5F00FIXuJGlV|4Qu60;;pVM>e^1+eG>I01pDLH zE`}QOOQ8PsT?3=)`n$FV>-vdBypyoE85${0td*d+IKAEJCmicQ34WjP^AMTFFNar+ zFHHNN65!OWmv2gaIDbeNicB4rk7&+a10(DDd+IugS}?<hN0hYH@00S|N7c!Db!@sU zn8hReDqauQ9i(WnZ)4ZMafKbCGg+dE4maP9ly5gFKFurvtqjp`$-|?<1WmeQEBi3~ z*yCS6|7QY_%?(bMHw`N<=PH63!>pByN8s(y^;*E!#k0TbO_Sh8f(o58GUDr!3k`aC z%Y|?J9VM?MQS9U1$g2qB9rU_8TrM-1K``wKhP*dI-__`vcWO4)ye-|V*;Ml!!v;uQ zHN9P#(RFXvbcd5W%bcevvA%0J5pep->Yj7nso7iew#-288&z7jo~Twey_E0Dl!WWv zZgAE|YBok{)`x*>xUN5f%~4Hf*G{XB8V`-K?i>#=B!!#6iHmQ+_XTUNhgi;ZZ)C3f zGHx?0nG6|_3_9#Xl{sS=?@X$cmnP*mKQcV7OrsF~8x)chFrW~r;ru0-HNje?JEOx4 zWv{G)a7`y;-X4fBD8NwDugA~G*Vk-h<aNEy0RZ)O*N$M_^Uk4~gEfa)M|JoVQTBPp zT=zD?bN)(MmeF8McbBqQO-Ijbrc4$<Zhwa75RfW78v+A=_V+Xusaeu{&_(NAw=Vuw z+<*~oHz%AIv1N)U>NYt2;7%`~I);ediQW1_0qEJHEwAJ441EcuDVDSt;;JZBN$8h` zAU?*j+?&S}!DF*oUsS{uhC#^&)doT@Bz6f0OjLP~chf3}tlL*F6hSU<o%VT#yj8o7 zfl@cMN&~i_G;ql3{P=`9UsFk*>ZT~NOn5_F|4vO#<IXXd-abwxnjX3nJ|NGYclkBk z{|Y^(v{DE|0izef9>E=M6aLqECOLpUBp^g1A%8WAI+?)|uPFW*<m%+KL$%fjDB*)9 z@SFUKTy^#lN*lbGcqzLbdN6<f%8by+toS@QAx?`Mg~8H3D!VRmC!URRCw>y;ZTEWO zp>G#4CGPl48GwEzkwK=4S5~jYWhEYK!oT>>rh7jH2pk!Eyx?G&v^?h`g-Hw9=ko}B zxj;h4WA+Gv=XuVN^dmJ1qZ*}6@60Y$Qv}4x+iQ#BVGdjg8~bbh$+TK*y5$1LdcI#; zt@*?e>R2g_#j?2B5Z|wYkbc!IuL>n_V6?8Mz9=5Tz!|)J3*}6(z=H2LNh$IRzMo{i zU!~vNKGTf3CMe}@x8-S+ec|mhnUmus4>FvgXB<jP0!7%g+RRctqG|P@*qnaW=mR}- zh%j~#tbh(7aE)B(*D}9IDJ$~9&;l~WL-x?l?uaNPdepZ>$SOzKw93RY*?tWViFS?d zXkXaboIp|A*@MGj1>uI```(W=ZEVkuXvDu%o?mYW%?!3DuvH=)QD{R<1T7o575>#M zc7TzbzBN3%Zoi%`oRgDpRjSD{90#bbvz@s%|Ibuk($Hz-p<%%j;~0jXN?Ac?>-ifT zXSH4pM-g5f{C3{uWDoj#@iIxt?eeTH+qjtYiKOa?dQ(qjqy2>JZ?C!?YCsxF4wexe zg6iJa&MR6ux<j;q2ZW?XA_4cljJ_aM>tFF^5fUCe=`e7AlUtg4$vd@(JhHgh$$Ko4 zs3`&Sh+R>D5@hMO#A(C8UR9Wna#_Jsb+tVDp7RtCag34cbf=fuYAzU22(*s^<Rmi! z01}nnrW5`(pZ}o;llNs1=aB6-mdOzQi3`kWB<RdRak>!?>lNFF2D_cXBJNyYFj(&~ zH&}Tr7_52B6b{zQ$_=*L_HA?<u^E~Z{3m+m%&AZl5D1Cs^IEI*4zQxNvT=m9a?Z%K zf27k`?aY~!_SeHLrN%oA^N41)!D@YwQtq;9z*Z}POb;^;vd_UluM&O^Vw(jaNZV*6 zH&gvb-mosf`+WiRh<^KuU6SCtV`Q+-Ml)^3KT`upL@NLLK)NhoJ7Yf%MtU|_U|pFC z!7*~5MMJG`qw_h!O+-q(Gph%@^~GxITf^B0?wm<L2K`bU!*&z6W;E0b!70L74H>bI z5!lp!2sSH6=3rCsCJ&o?^;>}rZ~uP`oBAAVDhgpU$-stFy;3`y2%^<o#=jpF^iYu7 zbO;BW7VUs@JmA!k<-%A;5)BuT)e%)hrrD>6K^x{`CSeYtB_kxiVQ#O#0*tb3E?2Bu ztrx+nsz1mVeGQsH&72|3YtzAe8-E-|8<WX2l!*CDJo(La`^DjFD5AV5XjO@sBK2c< zBaOomZCfcV0dSX8nvP5vl#a-Yj)ehtNtyZ?DiSSmcbE9h4LKrd){a_>bf*c{A@bR3 z_v`FG`Xly9x&~1vy=uD)7pQ;B7sS~`w?p&-v?gjrz^gnowZdxEf&tKJPz1pQj=0kA zhUbZZJawKh-eQ-8DQYzlK?qIa>vg^G;r@?X_$>I`+V>$|ml}g%XKXat>kob1zqluM z23?N0Q34omxHLVk)=F&xL~M$xO7=62k&t0i#{W$M{aUH-%X`fCtd28v>=MFyVeV<& z(X8{OxI}FfNww~2(+99n5<&Y=V|wDrw(ph3^n9PH)$?CowMLd#*jhPmtlH%l?FN@r z;ZWynO}=gsizM83-RN*z14!9lb%|TXsuN^lJ9la8ijN=_nJ>G9nCbuPm?i4WVbJAO z+*LVtgut0DOlH6a^K+zWcF1cMJmc#I@Mtp#tg9mL%H#rf=ms<$&X<YvNyZg=dI6Gu zBvb^;VBAQRL9ZrO6}9BBn)-m6DwVZ_C*0It|0IMlXGGK2L!|nvuui;r*k}*>ceW!6 z$jwzyZcVB5p==0E^;>s}BP3eW?~OgBNGT0>+)LE;fLkw5&n6{DI&x2_giufy%X^lA zCZe;?LZ5o3R1nb}$3smRN_xdxqGv{GtuB(jLpyPagqA`7q)H5=#UMYxuP9@K^1NcL zd?5M<ArC9iOX@ASF3#Fqq6J3(qN`WCkfG^U4Kove=s25oB9f@9q+5_smrFDY5CyT% zJ1TT<xQI7Wvt13NfY-kr>eoYcSgrFx>zNz)<B`P#>$E{WGc%3k89ep^Bv9sJU8G)* zcR-t^h`}t(L%-ITYjSbOd_@zE=<nKC4eCp!x_42hFA>gzL99Ro4D<LEFf7o&zpGlP ze;=t@qJLLcE$0{TNJW6BzG#gQbm}>uSLM3+?<LTC0hQOMq5_TN;JCzhOgu1rBZiX- zM4cIdFxS3Bg-UrIYHWuPC@j;cb9u092k#OUzCJ_{JBP3Xh<Ls4dD&hNZDw7Eot83! zD*V4d(O?TMVh;LqRnU3I+eIRw!5n<|P@lSe@373VpdbQ<8i(stA@b$p8I@{3%Z`O1 z2xpS2VZQZMPL-S*&~ssTG5))I)Yr_akwOH}yO9kM0fSbC2?HVv2#6D|yLUX145Cek zZ6Ba`(X2l)O%`)!P}B@asP#xDkFVQ|I4ZO;aS*gviPu;p9q%4bfvZNs-i)s6WZzL) zAk?3DS8MVj?w7!>*iGH4u{Y>VJP9U6n|j4-&e!K!VLpL$`tK3AY*^5WGZvvCS6S5i z7k5X_pst8Jk0$;WPLKO6*BMGP?A%&L#lo8nHUaxkX56<WI#H@$)|ozDntD)WB8dzF zmn!<8@%SJ0>lj~ky#^lV9;8^)%~gcD*{1_I2sW>ep<De53zP0}#&J?<JRV6;ERj)x z;KArY^+}Yj0&;jL&auWO`ghxi9BOa-{Ak>z+rr>>IY+_z_)?eo`FJ!XhY)=|-T5%0 zkCt5ZzmDT|FU$c6<~`Oe8|I<;7#;X;(7Ya>b45UXeve=h5U4)=0G;j14IT!=YhZ!p zoj&xLNHf)Ym`Dh=uNQ0&NChFDfF{$!_SJfp=nTdPa%zM3xpJ+lj5thk4OVW#?!1om zN!`q{sEI-SwRzNkSm-2o^pAo>7cXTs=#{?aWbmcBOz?_(Q46osW}U{*Q`v_PAIU^8 zq6R-ZeG)YcVr`c6vq>D6#3;bvTz~=se^K=@$5D5NCfK5Giy_!rVUE=Yd=>4RVF<QG z<b<!%_lg-0{AbNYZXy;D<f&Kcj7mfjas<etsfdqI8#RD%_!M{&&(f2z;?$GAHZaa@ zs75DIhBVehLcTUx<~HE*d32WZyr$OF)3O*fgairTOz%z=Sxkf&&_Q!Q0_XeFW-$`C zd0bn(!kx<8U0IRrJch8!J|y0o6K{#~UsvN@&d3S7xR*>g!E39k`x=VQTCiwAUxUBy ztXeZ67!z=>U0Xwd?zT0IpoeV@Bf0<JpCHzv$q$aeV_K<R=8pA&B+V>D!O$LFCQs9M zWWiQ<o5wt-$zvg>$z!x@*HN6N$;xw@m!$otGsQswUd@px$Waa)WYz-}1z1|ZRPD7Z z#7^#68df3+o@4xclwv&z9WMf#5t^7^s>kvsde6UbSAm{G>+ZkPhJ+qNxWuhsQMgDg z4{NB^w4-J^bqF-K42%T*_kV-qX6#}rQ>*!2b+R5vL#=mP0FJaJfq!BOsf0QvnL4(~ za!v}D`4za#@sJsMy;^s_`!U0>XZJVMe`Ng7iT~e>U;0jmhQ?p<KOg`5`SHU^%J}uh zj&P{snro%L>w#gZ7_BeSflp_L-DA8a_x#h~UShy~vot4|!wa0Md7cIS+s@Yew=Yt) zl=gr!yF59$q9}0>lVyY)5UA|8BkFW&$gb8Li8_m0o%Dwh_g1<~F!L60pe$Ot8?Ra- zeO^GNS}ZQdZ>6bSaI!`u5DT_@CO1_>34EGQ+imx{qF(7m$EhG>cTNy`mSX@q*4d<9 zWpiL`RA#N5HClF|;9I&xyhlPmj_B9@Y~y2f2L-Vk_pB-R{NG+43k<A_WG`PD@TTg( z$4!++7e)jloT%9u-c)rRl0kf>LV%<1jzhKxhWO2a+zbL&C?tRy0EL%bIMZ)^Q{36* zV62usGP6VA4%BA~{<ROh@P8W)3k6rqHo(}Ymx^FesCl||6l(=5t+C}tFnJD#=0v1N zAypBQnv6nxu0IisYf$k}32?JWUxzX#aYPnpPC?+I68jHBFuw_{aVaT5&OE6b0CnaT z-Vf;$wcG?-OdY0W#ajWEpnH{{3$ZRQi=}T8?~`|IZt|_;(x~g#oBOc%i|LxjUvXbw zO78(p-433c*exQA6xGbPt|Cb8?dU){^&Ki3^mnNBIYPrvoWn;(zhKpM#yD03`i3pE zG8^LOVwCMhD^Q2<l=!<y<R(yI7~NAi^sbdI=YbyfCJ&z@(eH@#bXo5^*0n;8-5VAP zH<GFqQky8sTtobMx;~eA(w(nP+zqpFI=2#kzI4+RAJuRbR%OSTnz`JAQam=u8lP3x zF*%=e0Xe#F6&*2?sg1PMDY^XWj%y3@^{rq*<(GP<0mvZsf*m)T0veS1Yk}r`tGY|Q z#FW6(;%KtWlu;YWfs<JBsk&{PkKBUx6Njr9JJRO0kS6L^6bXl3UbdaJCo^W&Ue6Fr z07zyhTZcIi;G3bFv1ZVI6wbevoWc8|yn1(*QC&ri+DdCF#FZ&{i94=ZOaUe!4+R0Z zvx0PJ4T5!1LYzovZ1)<r^|r)oIUQC5_q_UV?apnAA$wTS#c-Wwlpxvt?BsG;JN#+^ zWc;+|naLx?@pF?$O5)cW`JOZnHXwAy+6u^@N&?~bIL~3Ys=8m*KJDc~>1DT?yjKPa z^47}wB6i1W^X@+j%ReA4-a(ttpXFE~N_AtniXr>$_8}1fibxTL3}`6;y2Ap0$Q5r1 zdvA5Lz=LDO{Iog^n6hf@rbYAY5>OM`D^#!c1dIjk^qH-CgZOr<ufBU&%#0HkX`4nd zVV^`jA~p~PNW=!V{{5ZyEfG`px%zpv7Ar8>(kzU}rP!#f);>r>PL}EvOb`(h_!Ix( z-lgAt9DY7ZQixrPZzE*zJ-WD+64^;QQjLP=cJw<M&DHd(C#aWBn_Fz<m3rWv!@__Q z$7v#8n5#Yv2Phqb^^G-spufgBQ@Q(Od6*ubP51Q+ebT9gyb@Ox$(8|C<X?+CN=pW( zb2gd+L@W-sO&={)sq=N6cj*u0!zw=1r;_0)Kg>zmCA0q5IZ0t685FR~_gdWtT!6jw z=Hp<0)Y%vby%9lE6XAjtDNi5;f$U{(dys8?h~1lcR&#c^^EQUS=DShp9Ylfntc?$X zwA$cIX8{hw5#^5*H2bA+{p$FV16b}139@qjya?m>VScX~_cA-O6&%!2+UfZ{m^fLZ zH7Gy`EhavvoMks7+{M?|cp-{l+K$1@&tzB5l?yzG!p_Y;*H%>!3aIscCQtIl3xT91 zi;~+zuARP}oj<Nhy}6raC20S;_`RY9AY4z~wnn)aY%P~4xXWe|x&aTTDF9UNYe0!G z(_2t`)CIt(0sVc9xMFk!?rqsj%8n7>qb8KH(e%>sW}&GvO4~_5SR~!!t_fMOAQkGA z&uq6=y&y%vF#!?a%g2+axVI9c2v;H9s9Fz@GW;+6vXIA^tz#p0CGIR3Y?t?QA-B*4 z9Ns;d6Ls|swFO0D>52VZ52jzgp(|MqC^-D|Pk46gW-;9p9@*IvpNZGMz6C0|W4P+) zq~?}^3D5)$(2f3nQ7fN@n)%N|TILhNp}E1t+j%APn?}j3L&Ax6TI{wK0Bu|#?iYM0 z_uCvOxZP3Ti9ozWL_qMMqW%xN7fTNgOAjui2jNdm4}>3QT%yL+GXG%IoetQM2+^sa zbm~TIQgo46)9YE>wAba7;8ESZ-KKl2r^Bq_*I2_ZK?KGdxwQvYr=dc~y_kfZJJ9GZ zs8Ew$q1FAvg7GPhj^Z{ET1c#t0{{!0+=(I*Y=)M`|Iq2l*z_*S%|g0Dk)zny?PVX} z+ic&5?IS?t8rl*9Y#-m)EHD}Cji|Ri)ex}LW$R>q?2<-a9V^Bs<L%Iv#4*{6G`$k) ziJyR33gkW~UT1q^xAaKkbFoKYI8%*%hu%!LylhMrun#jYePT4CCq6g-x$~D<LFY4P zmOAkzAnmM^0P)B!tkietj1E9(PUWb3?L}C_ZHv>Li0E^RIF7|&P{!~x6k0L{_fk15 zOYD*cY&W37fX6Jl#(#fKJf$nkAJicZ>cziN6W@|eKyhbJR8Ca4fvd6T0o;oG2Gke| z<bcm`bS2sK+($;39$8QOy(_i_yb^Lz$KXUFNQ@E&5T>7)z2Jc_-8_IoK<>|&&>i02 zP(+(7rNlI3+6?5(epwoyeZR43ZFZE<8=7H=6Q$~ltaElP$Pj`NPyQ~}(SXD|ye8Z? zoHmNGSBe<;iEY478&}7tO7(&G?J;K|Fkuu}JkeSMyO<#ggrY!53RP+t%>h8wiIb$x z;nWF=McEDAkuz@6v0&*qGO8=Xp@y>Co=s2G27%J<IqdE1T3M8XkY1?eGpJ#RTQH;# z-HWpp;xr>*1ApyT#~7&ND_&8QxtikQUzDeh;$xcU2|e^lp@&XGj7(oV;%D7+407o4 z&F8&G{JoB*Yd%b4sWTW9qt^r#_sKyY{U1XgeTORNw`YHJw1MWF^c{OTe*a3;dB=91 znpIMauM8JXMoN73`}=V2UZz2GxGe1SV99sem)avvZ^>fdyuM_3#Cf6Qa_(B*sSN<d z{I6@{IN#G^HdoW-<KaYO2!|SNLj{I#7|r=Mbv+%#Xl`%KI}vV7?pi;(4*H&pn5L)4 z1;SnH$A#<GN0W!j7T-JdNY%6VK@!sqJk=iXx`Ds&9ge63ba!OGTB|M}X04i`yJ4*& z4%w;`x?T%n(zj|xpzF<G#P<Rgf~#g=H{4ei@%4)7U_VxV*o$r)SF`tjr?=Lfw=uQS z<G^>InUgtiS$A~OZ>zv!GiP>LV6`ba$1W5Tg@&6i<SiVvdE=1brZ)ntH9u;yxqe*D zJB&vgU;5tZT7P1lHrVv_=b*n4gV3jgx%n~%n|c;Dj>h~_>^zx;kp;70-C6IAYa!#J zkJ1riOo=h3XJ?5ure|mA{TO3Rv6nT*n36Kan3BR6Q-1ylW6bV|v$bpeagn+gYp}gU z&9(mcNZp2-F6U`yeb@Tok-ArESV(n@G)RGdM!TtN!?+p-%~#l{b~)?oHg>HK@N$gP z2oHt-MM=cDt|<F=I*=Ox%S1-B>MHIrm@zEkdy#=f(&LI*N3v|h7FIIKiuL7qk&+pK zNXZTUNQtGlvoRdaTn?D5RboS$iI8-M6O7<UkvyJ9LJEIIN-%oT0Kf$LVbyw%!m`1d z@#KBjlR;?3ho&V>nqbB2J=5RJ%R*?-_kygAWV!hqucFS(!%}j{=GFA_XC^Z@LG(m= zh5dpQ6@X~&QaUX8y8TsG1!xefVx-6b1VKa}m3SNRjw4W&8Ji5^!pl9QoLnBg+Bc(` zO^}OEk0bqIu5hp~T#RITapfXEf2;R#crLEa?v(wEvE9-BUG8*P(@yc_#LP$31kUv8 z`nJi%&S1|P`g^2rx{%66**#u+$(BlA_%X@4?L5tfWRIKLR>uAp<4ZJjp~aQAjU(ng z-jikLEI&9h@mgKy@}=h-8ExIu8LjEe5`z~NM&Ashc=LKc#NTSt0wm6PV~H#yW`{1i zui}&<o%p#VrtNPSR~(<nNmh%GK&2ge{??m$C{k~4mm^rN0qs%0l(h2-eCahi^ub)o zu~iGk=R#6eYVKn_0K4W8CQ1SI1znPglqC8ZydE}GGFEhj4I0kb6<%>jU85;dHM#E| zB9Zx;O!CnDh<qsLS|S?Q6>n{o+BmVHar;GcC{ibV2tM(zlfp$Yh=qFbWQ8|+le<#w zbgJsFd~syERkP%6t7hSAR?UJ<R?WOFt7h&Wt(uwtZq?Y|wrc8ENXa7RrO&UW0UTU@ z8G)#YAj*)^NGhmC-A`VV%6{6L&$RzIXtWMvhJZf>mqgjlqM&MeQy?e?7RoLmgs@Oa zq5j2x%{2qRRc)8>flwuHdW{Y>R@i({O@H0+Wz9j9L{i&@)9B8$>cy;-(h2WQAd+55 zyb=aofRm#ZAW$jgmio;5!~hmT>Lp?6K2*+(#2XKyFa{v;-*w#N3g_K5lc-cZOzac6 zXUJGgV;D-$#Rz6*<wtKo)-&H%KaP_SQU}?Zj{L6a1+z4dKOQ>~A#JIoUshF*_K$C2 z?uE8>O5Z)6_ipL*zfZundK|iD=7F={ls&4ydZ{1(q?G?ieP`$E`>Cn#@V<YtzAt`k zeXj}v(fw;M_5F<c3OXk8GVaIqC{eR)xdKRfZ|*pN8Wm4zk^2OVG4Nf0m2DsYs(`3o z<XM*tAUbVA|Bd>vZX3F?3+>RlTW^3ZJc;Yg34UVNcy??Lu}Pu);QQ1U^#Vzh;b0a2 zi+$m>RrR-G<RmK>qI<<!>B7;sAi-Tj&%-vYDXIiJeLv=dTj!qV-Rd_~Mbp{44SipF zN%<*7v%qkrCjOE;K1v2k-T!!JLXp<BA}vkNs#L}sjRo(Pewq?YzaTmML3xmrd=CFN z+YTK+oUEL^Is{$(rZCD4iA@DCi5%WZDAQ$U!bGsnFRfg3k*KO|=a7h2u_Fj@(^NVv z@>Ou{wCd#-j7<EM_@kJO_4=!e9;2lq8_#X5*5yj;9<F+p*0V1u2@~6%z2|8D2lV*$ zF$|E^&J|(qESj8Ex#*M9BnTJ@9X{){at*#fO3s<=HqB>xwL-6Q4fAqoGsjPfzrCO= z;X=3+ndRw*$34K+o$VBQz@KP|Id9n3gS)e*Y50P?J|2I3N@HLFCwM}TM>+!E1qOM_ z4&7e6_#A^fSP#3E&5FsP84oes#=$kMQg&88JUi&%_S)=v+x>c_?R>pD69*iug6xZC zJ9+&V`OQ|@{{u{n_9fMhq&mLXO;w8VRNJA^(~mm^bF9OV<nb@VwSi?4WbeJLl+Zni zli?KHLYIXPxlu-~2Vb^p5PA}FZ7ngYV%GH6u~ns~+to6*Sj_ju>R9OY`0&04J#~zr zZgcd&yV+l>Tfkn~yFa}DlZSlq^OJ{)<Cy*@a2H!#?Opq#S(ZSL`W3bI6^&&AjNnrc zPHwzDPWFDgWN~G-SM%5SpP51|2!uH;XavNS_#P-4!Jl{W%Mr-uDVcQ^?2x~Qme(2w zZ~2b9v7Kkk*Pr97XcNrYmjkRE^BvQJi3X1E`dsAKoR^>h=Dg4y;OO}&?B94b8ipIs z5e7;xk5RWUP`gjiE)I5PzZRAsr(PCQIPGb|nChi8V-mW`6tCCg;aDYzlIOoNpoMoG zw^C(+1UmVaEit<p<f|ga8}<q{wRQ@#C!0;*X+#ut(jAL=mPTF&1ZWw)U>=hjS@oS( z!%nmVYQ4Y~3^OeG)UfcQzK$DB8H94`_d~A&;Z?qlC0=dcBfmpfN!@{7)#{a7n0%@P z<wbmfK2Od@q*A|s9j6qr$p!Hu;)^+-a=tt+@h?*91h#pl7luchcTKBR*Ssh|*(&Im zWsS^E<c?^Kv;-0>D3LqXv$1SLMIt&XXVtaq_SP^PG(mHwmH3a^sa93LM3sW%-Q=a? zDzmL#jMtf!5$B-1Ur#q#3rzd8O1dS>!h|*x(_$&m_X32G@H+F`>uY!ASnAAu`Z&s; z*KqDg@t8Jsf{X!xo?>LG1xGN47hHR0EMJ;sHT2Ho@AK%)Ti+lswL^#o>KmRr{bd6g zKHV+7d*_5A=b|?L0+FIQt();onPuI57n9GTv{Ff(*kGl;K>|^lmHL`a7%vnn)x=Z8 zy`kK_0TUTEoK2|kF{s++quRTII<SL_gf_(|inHxZF0PBeE_(4=zPdN!yj-&m`U=At zSS0@>{gvat!uuxi7tRun2HrM=y19odP;dRbcYgAMqPWdv&hcsCbUmRm?5063BK*36 zha55#&K0!2*C`RY#jCeI)th(?bZwzp;hMro(P6<Cb?C}ixpZ!+?=Y2eNuibccb1x5 zvDbPp39k|EXB2<oVrr8%q(+J)N@=V`HH7-Pk}ZDQ{Pvnd>96@<Cb@T%VD8;GBZj)2 zzGV}+m>AJUG#v{c&RW`2wW}D<<51|GIFhdTE^C#KT;Je)Ck!vqRV*>py|Gx|LKlea ztmj@~PXtz(zmmZ%$-33VU9btSIWJ~YGM+i$3oySd|BB`t#cS+3p{ua1G4mC_OysT6 zM!tz4C~J>jjPqyRwlD|txfqU>e=@1Ulh4h?Ti*&_-q2P)YDQam3IC5GeFoi(qC^ZG zN^E4k&@Cx2t=C^t#Gg?`;a>k4McEhm8C4{o6=bf{nYyS{W=cLZl&OnK6WJd#nP&Zh z7Kb?(y}4sTky|>z-yGi0z0ci8V2Cxng(g=K;P9Dm3BKEbk*)gm^GNp3TQo|Jymf@M zy|}KkcX{Q^rlQa2*ydbA#|`1Tp7;WD{rF=)KoHT<-PSJet(8|W&t1OM=0vuy^eif% zWRco%t?Z0W%}!XUZ<A%a<ybiWNGJr6tcu%S@`>d<m0BseFNTh2+ho;2S7gT`RqeFJ zIN560?mj$75y*sE{Jfo{Jg7VVBxrsbcjtZAyyRATxpOUjW`7uC?pTu&iD7@Y-qyDG z%D0N&q$o^+G)rwH1XJWBuG(N5$sXbOxy|;q>CWnZACQK|(~yMGx5cIkhdsW8v=uWd zE)?00@pI7jDb3aJ{JMVTGF-g(0_v3KWGqN%8$uv0Ut*o6heR$MP9DCn<$V5*jql~} zC*wQ$8+=S|yO+Ba8k^pn?ymlYv@aGtI<#@_vt}>|H!RvS#ouUrsf=V?l{*V1NBkIf zS~(jp)NQryld<X{N^jkVCW$et`@};uATa!<Jgccs2n<D<sfn2t^44zpw!Cw1Cj@)F zm{*FCy$4veqH748sXq#CmfCIio94^!m{x#@8|xpGhyb|$G@m9qAR(3r1JL0QS}XO+ zYV(g2!jr8cPW!LeD5-q(kV|>pne!UO!r^M_kGb{&Hlmek)DQIwHFmAnEiYN3k?*-Y zxC_h0grS;bc=-iIiOac}q9_q1&Qj6*c1*}OAYhnM6h9^VS>|u*@}+3>6KC+tYUTX| zS>(%?UO?tp)^g}=D<!u9@IFYFobEW6U>;Vjoibcjv9r$oMtOSanqsl({Ho3^t76}{ zU!xPvHw%XMM$1L8N8ySk_e^DovJs{(&=}~-c|gQxb(A0L>xTkfm`^P+sr1YeaID?k zHCWu{uaQqRThQfmZ!Hh?wtQb3yY5jVr_1CrkM18+dY&H_CAZA;3VBvnL+<H4C9IU2 zl$UH9Q`BsmSh}iT{bCEtmCzLGM{D#nOC(P#wGp|}(H}`rU0L?-(*8l!%neq;)4kat z_TzihEBt1DuD{U(od??V(Ru9-;6X-WI_SL9Iq*GzEX?JN)p;6%65T<U(~Q^9W=EPZ z)PWD40e3w-PmlXgf_^lPkY{z{D&2L-WW1840bqtKm_j{7Z#AL<Kcoh**JY$f6)$M$ z9vYGbYP$=dm@%+AQR-z*++sQM{~zMc1U{<jdi*n!2}A^6)QC~B1RXRHRANzygqjHx zm}poOP+LW*v5{7-w9W{vkc4K^<~a;fwQ8$XTdmsuu%KdCidi86SD=CjMR4T}!{!EI zOa9+;@0%rv*7m>g(ad}I-Syma&pqedbIz?`%rzZ-jL>8?cr_ats#m`lucks?thef= z4agftXsn3w^h;+->C_qP?0GmTwRgp;cZm`l^d(_%fSHSatTG5y(@Q=_HLi%PTJrL4 zjZ^K@xkf_~!P(V%&Fjo5op|V#6v(v6G3kVfs^bmo#406RqYH);1;aB}bzt4|=32V) zE9r{4M^p5jq=a8`OK&tumveZONITR-NxHT4Wq}HDLCPOc`2<aMUld~Yq6USSPTeVu znE7<7TcH%Jv;bjrN~dHH^7mqyhQ&q(t6(AT)=1TA3M}L^^iO9_fyKScsYtdn!IEXd z%EpPN4UE~kq$wrC6UN&Uqu|l7hMs(%t|s<t@uI7kT{X;s*nKE`twfP2ISo}s6G1m> zR=6b8)#@o4SYiP3I#|XvSnN1E34>MS=7Km<V9AI}M01YH+seY_u<!(Sfm}|2kH2yV z?s_nb0e|>+)iR_=Z?TMZK+G#lcQ5&Lm;I@N%dcFL@bi=e0%9$8|4h`icA~GKT{89v z{?!-0G7AqkpE;(tF?T6-O1Hbjn2gB_N9ss14+5$Hy8Nseq)suj@}d7Kr9Nv|-Nbyi zaN+k%0fl}i+0l;?=!Jzotj>2)`Z2x<VUTYaVSJ^W5D59!lRAo)o=<glt#*UGhY5pN zS9TG4Yj(1lw%#S&2~#^(kr*9Tr^K316i0HICH>%po{%k3rn+_>wGruuzu`&fAn&@4 zLq#l(tXJSHRf@_%ibSDiC4X*YruQMTrdWNeZFtbgiR~qWDNj<CRX>G_c=E)xHhKn` zN{2D`FJP*GQR_?Oj5{%Nm(X#hV+i{tgUqo%s1#o>CP?(IYL@LJ7fC}>k{Gm$`K$Bw zN(=raS}03GxtjL9kpPl%TL9<FDZZV`M?S-P4qrRYSGn}bTk{dIr-a4IC%8BPT)3jI z-KgCv3Hz)mi)?U#sLK>uendE7#^ej%Mx6DjnKk$1V%O9gL`Cc~<}Ts^|1{8bd=5M{ z+dKF=1#|T#!68jkB3Um}0mq8&g`n&A>}28-xm*%|h`>N9pCq^?;e<p&nX3m0z0WD8 zY~P9k_xE_nI-$ZC>Hb~?7iD>kVtlz*RUi`-w^S6Y@);w!E(<>dKvYt&#i;!y;NY(C zl3^twq`D{7Fs|$k_pdNM%a~hBQUc?{g1($D_yxzp?i1+jFS)en1UG2}FuIIx**QRO zUyt-|Nno|F2XT#3a)Hdg9$X}nl2jx~;BH%QNd^;23YvqprR8hUNEHd*d22p#2P>cs z68@<qYtYE7_7d5@9CXQFqXM;oa}xst;GL~jw!`oQkmIFCr03#<QrpCnwc~Z@D*|u# zQ~2;*y`yJ<FX4OKQJ4IV?8iRG{YvwwSyqQ5@N3}~ZkJtFmW*<0F+xHM!xLCCFG(gV zLgngJypb~<>ZDHL!gGB6_qcFL1#5g7u;q>$HSfIpTq;b}MX4zwD!TKNDP^uSQhF<y z`XX@QQixhszTm>8{~0bs_rMD>>Cq4P)obUxh44790TR7lO<Wq49V0fLN`aJAE~(24 zW^&TNeFfo0+1q^Ki!a|a0HaB*7VvUojW7VO^Z^=hy|q8%MJz)7rR5KL^k(>8a-+|z z1ZKi*h~>MvgGB?)`UeL8Y64h<2I*3#>_jD~=W0Gd*7(@<4=}q+m}=2jmtx$eH>`DV z#;iNGI^pG($$eASnVe!WKcY|S;JspA&7rO(JUED%Xigq4mCK$lHC9Q7MS7F@tQ~4M zUC37$PW@Gm0A|AtbX6H4vBE3ZXpE(riQ!2IEJm$#2Pc5QsZy;-50ZE$iJ&o}4gA_) z1c`{s%wI{6Sk3&bdD064Tf&gAf7~u+QnwuYnv9Bh`CaM^Pt<TPEP$-p&=CV5^&t)$ zWiYQsf?vDJHpCu@K(1CG4k(NeHuhZ%W6ZIj5&Dde0^e%sYx%L@`^u^WeA#%=cWLk> zL2Sb&^budfCF7Ci?n61Ix2TCK<ghfbP&c3_?}jxUNYywvkxw*{@3yN04k$J1A5Joh zlsLTGn*EZ!RI#wD6>VYuuIS5@5rl&kMNYF(!8(@#5JvUq;JmaZy*u`BcGJ`dHNUkv z)D$&Tbs^7_Ut3~1B_x`4?PAIQSN_n$DWc{7;Kg|NrVs{?O8GEVKCDiBm}-Q?5{(bj z<io<mhiOJgorQ&G&5#cdCqB%uFG3(5iD;1fScUSby~Ixkp+B>xl$N*4I^s-@iwhc8 z2$Mf+s_^yfZwvM7H2d{W>Q&^LSu^;0zy4Z;4$``tY4w@GEJ3f3M&uCZsA{okfy;(& ze6D`OM-iCLm+qLGe5R~r#7OI3!(~l$Ro)<yq?ke;B}HaGRP2yT`H%-?pE)u9JT>Kc zTFUbbp1qOLP<YYuu`jTPJR>cC_XXhpfRa{bO|eJV*xG&k`ZY0r{R(5JpmRU3(W|K- z-UaCneV(di`I2e&?+p1>QP%i4MPA|sq|c;v&p1v^u+A8-EnYwdMw+fsY{KI;#xwG( zYKs?;(W@BR38O1N^g4e2qs}wX6cJF=Z?0G8Kyv<5w685Ka8_JzA;%SVwA!Q2d8#iT z7koD|Dy?=OXMH}yzs=ix*j0iDQ`e}-(B~l-TwUC0T@RR`E1*~#?7FwKd}aP>bu`Ka zb}sCx>V081dwZSlL=OLa;q<yu>bFPTD3`qVl!>bwMbO8#G+)8?;9H=XBPz>7>vLu6 z;dY$2BiDdO$*WHon!e&ZcVA0d;5#yyII*-x0~aPI05vOeThWdLw?sy{uu@%b_^sw6 zE?;Eu^KLbOBi0{UKnm&oxV9qa#<n8YMx#Ehc2`|-T4gaeHNv^BW+-WKy?VXxG^ZNR zy>6p^6yv&=czL5-{Py5ije}=3tb#qkH6`X?Pii~?@3lCuTm8M);0HYf<A}AL67dtM zNmT#k9eyY3Tieyu#3mSpUe0-RlwXhin`{3Lwtt7%zeCT}`G#fd-$H(*T#*GZ`Src4 zfBge=dKqC1Bz^n_{X5Zqzs~-CgI&)QyWA~yeN*jrZkKvZF{!w&8GFT=PL3>n_-C6d zE7~1bII8X-30?X~balqu^Z3hq+B_pPS3kP-{2H~VNQTCe9!BFNE(@6jR9_#6UlQ8a zeVBgD{y?5Fr~4qIDECuL0N>BZTO)FBwo$*r*<4{>kr6GD8Wxv8??^6-O!Q1EHFq*H z3A^v`HeNGn(j=pC6_pwFU(SAC)hG2-n8hxmaWZJwHTy$JZT>LB?1*Fyub`Q28F^Uf z<ENDOnNh#Nxdy$w+h`m^@9Zk5z$DUSeo^j0`j*#`2imM~V%G}{D$Ma14bEan?MD6E zYBW^nTvL=QMvNb1n4Nj6ROPBj1y14cZ#Q@_GF;*E{$sNAda3%mq=09mzMY=oS`6lV z!WiB*7H^JZ^^Le6H5RXnxJUl@)iAjtgPkfjH4%1Y!5VWTk)K;5g$!>ceRVeT!RP5T z7Oytn!~pFyzJ5wws$a%pg8GrL22SwDO;Ve4LnO<LWL+iZpgCfmW*#)He_ScOS>QAl zT;;}ncdxO)+uPX^_GZwKH0I=pV-<;Lo}06rEhEjWUzI|VOU0?AkpnhPAYk9z_cnL* zr@8ND-J91^u)!$%Ow;ZI?%)TrJ88kK&8sTUZSFk1%v|eZeS}X`M=IX^9sbCJo@z3g zQ2S=LzhG_fL#*~^GE)JpK0o#D-vg97`sWd9^M24_TBOjCHq$eM;#Pmgk!g02#k=-^ zH}61mSAR}xvhI%zy^1oO{iW<$sxTG@JUtk`H`4pWWv#u=tu<He$L)SErg{hZHy`Yi z_bMoA?iF|m^j3+cKv+BfT6_<)oE3R%;&6pWFX=@{K4etxku_@N*be-FA!TVho8)?T zum$@L;rdck^{f<Upj<E{V`RjAiRp}OD2tR}GdP(rIE|S`BPNb->Xl*Cf1&Z~gA6*e ze<L=ht5_&lWxfxputIEv^n<zWYJq@D5qFv(f9#J^W9$>P>KduP(NN9QAGR0Zm*zn# z)k|joCTh$h)<#ior;dP-t*~)}b3=vsvmQ2$v+ZZ>0F&ATi3^qMtDG!;qyA18XH0vH zxu~cSu+?2ru?$o(zJm8>UF0usW-nmx&n~cnJCbjqrog`>f`&5+$X7-JJ-T#>nQula zohHS)tPRT*OUP9>9AvdeW^{R%KocCX6YBaR6SKD<Tdt`58E1)Ju7>8AD~&@QTG>V` zC6Vh`BknYs`4K&34Xl>Xu){TdVr#2Bmm@%omp<d{Ez+A&2<kbxyf@<e9*;zwEodPE zqq#vG3`>al@!IH!dk_s)-PhK`A);q@)19Ka3raYkrc>(jG#!yrZJE{yiE+eM==Mc_ zfpL68$pmk)*d@Iowkd~|g?z4<A$hDT&@&6=l~Z!LX4~VhiP7SA0xPvzcl6_<N({TP z`Wv4O4@@@MS}5YKi8&*MTVUug=fQ9gNY42OmTE+F6C%!HpZi^AD&jt)G%_|r3lx!w z*-qiJ9)V-V!?OhM=GzH-#O<%{F(!AR@!$3_W)#nhG3E{eS4`rnq1cZLCmNyOQDNao zeVq=+ohaQVfzn=Ag$c3rx+~0{{PX~}8LS)NCg+STVpuIfcwM%`ff!oyzJmW-`M;U> zR+mq_1&xqmIyv6YD2B7R%vm@(SSRgx%{1MNZjXkfy?8^;*za^E)Ss#|$IRvSL~moe zgP)O(OL@AT$SL*5>vKhm$%x3w#<<`ap5Q>bs~+r)Pn#VHQ={!Q#9SxtE{N?(H)D<K z)Kn`ZC^cWVuFbWl9P;7e5E@@Ajwd>V2g((J@#}r9s%LT5xmM_aSR#hYS~?;V(*0pC zmIppiVq=ZvGF!vmOvAsa`A{0?%@W(@9&n(nJXRbj+?AnFrI0``UDgkm3ggtA-&E1= z_9AU4tqi1oZ|&w%^Q|`Lcw_FnWCwe$hy?C%M6z(N1zAcQDq<|i18ztm@MMg+6NJfM zH^%&QjD%gqkj?Fh-O7F;i1TL~abPf+BcKlG*J3R^N<E0mw@5wp7K>{6c7jHpHXB)1 zf+#HtS(1p;q!7zLJj)Y6_X6(-%A77JGneX$<1N^2VfC-u>di+r^J`CtJ*wyUwWpCY zsvzuq(wXSlvC5U`u0^MS9>>T^ai2#IgU69}=I<(8>eKn^0LL=XwknyvaT}-9VqLR< z#Trec?W8}p(#|MEf}vEVKgwkf&8Jr6aMvU<z;zG+uAF6m!7$9Izmap$&#a%_E_&Jq z3(8q)uCQ+AwdPP2C+M(JqTS#YwPJn{#qX1#pxnRCp1xV6YXYp-PjZz;f@wl`%;wTG zE^cLJGfvdLKr~jfBhAXZ3AC-<RZ4xCQ~=GvJSR|s(IUmHU(udY^q`xOSo65nNnjia zvGC4~^b84ds}(_f!a^qif!l92@nWxl??{Lok5seydQ}Y;kVXg_02C=JV}B(0jNWvW zJx*!3zv;4yDXqXMEnLitZ8b!zETgaWR+Lc2-lcNBq}dczg}D_2U>TCNbE-Xxm4U4A zb#TLNUWO~Iv?Izv4{nOFhqa^R&1b8efn9Rs1}MXmvy)k$A*&obZb6$LEf<VQu~*ad zg3UEKzvde@@zC=-LoNx*Wio}dGuIw&5f!8AY-`R>nAIc9>Pq9j-vZ_Q&7$4v%M;uN zqCb%bQb&iqKz^4!HdIU}FgkF9!wSGXL|I-TYZISh$e22xC*QhYvWy8`%^}(?#ceW^ zQwAhrrS!|hTMvdP8xzA)pUj&uIJsgHi_;-yqx-D;7%hh>*JIk{XU~+0@C!W~FSBu- z2y|1#cXX=Qa7}}-&S;%iiW^udM(_FiO4~~^Ww^?`hfTv;i)#XgvEanR1aFJ|UFkD1 zPOX`hO@Ah9alys_oYvmMR>+Gx7pQSA`J>Z;dd0j{V93<#>E08c?j!g-0}#x1O|Htr zWV|c7h(B^#fc`_qWi9&=i5XO8Plt8fkL?UfCBj-DqxGQV!lHs%-)im_U=$Bf_`$AD z*hxNcl#mg7C?P*O_pa?o2CXC@nKo30jAx0N5R;w_;w6MbTSy#c{}$T6MfR`H7V7-A z&{szPMR*)<(Q$q!+CpGLIJAYuDYo!<i~T-zfG&5tUC%VTT)?hxhTYCgsh7TbtmB^q zA!m9B3(RXSw>I+Z!ahu7y1700D+y^v=uZ2QeLlvc#vcY5XQL&K#&fii!bTg5C%|EY zV`UL7G?bcKyp5u0^)@J>uwFv1J6kHu6OG1^h<Dr~uurqqq{rn@#p63a#o-Jo3fA7{ zsdFn#KOFN&guK<MLSZ+7&-od}XhKPQxp8TamatC#Hm#LLuFg!hsMt1|?E&H#i*Mo- z@>;l#cGoK+C4Rl!XsBT#G!lhh1ja{gfzdtE7x6fa#fBCYjRor?gA>vsTj_rzD-Kbz z;tryZ{qG2i4I(Vs{O`As7nK=%<$$=nI5sIS9<b%a;cRumXn2ul4xqxvKE#if7k8(~ ziyBLCK63cdLLL#yY`L)?hEq-6{ky$u50&J#dJ!;vNSLXj<8Bchwa|ESLTF?oFX`1y zYy_DQV%DY#jb5}#A|ncJX>r^)e5NO>!W`WL<%m#}O!U;U3UE|R=TW!=h1T)>6{a(~ z6Gf%qyPj;VhX6&96~857E7GrU4V{WB`j}mx-O&H1g%UmG|Lm~-Z?D(nT9suQy_U0~ zxZcp-zeR>4tetpIcq8*YUCgfvokIj%9X-c7_y^epV5`Ob>-%Un%}*3>TIaq<37fMI z${A=dX4I<-4r`7$>ztLBdm|yw5h^2pWSR)kz4+gKUg&fenK>V~1=Y`jA9>9?V2V~j zE=3C0<g!&+e8)awzeC#Gz`nxinh2WSh`I}X68ygCCFPXL`aT_m8<Rs(wx(UI5<epm z2P&@kbUPYzt}1s}6X$n!Et8H4-?qmp;Z>ftFOz)MCA^kIN=S;0Kv<JQ?fRMLuxqXI zm%oEwHNg(ngtKa;Cd9zuS#wPNQhB_YHK(X<d2gvjBxpQMsv0<<XiLNFSnOXJ^?7x0 z^4&lMd+PRh1yTxRO9UpBLlxDi$X`d>?z5EUA>@{Ni_i0&<*d_?lWKeg(corpq*j<x zuh|2@2^dfa#kU%5Np91tYrNW(ok=E4rAX@LArv3Pv_5S0|GgZxiopmJJTRcB`iQI4 zY$-8+<OrP03%lIIK(nZN7ghywco=V>%v=+<dnJHpr6no~j0!L-h^66JJ2KLnaZh~7 zjRL}**9^A2l-~S7Hhz@Hwa80P{ew4V#&J+BbZK=H7pFCMWY@VDL*P0x>wJsFX1ODS z2a%c3V!RH)t9mN61GH?+g?nVuXq+w(93gF<$yF~C!zh<f?WeRE)@_D$o80-5hvp^g zM6Q{M5LF&s8XmQE6YtZVxX<pyeeq7*=RzrdNVF`?$fHg1bDami(w)s<yg)+f7OR1s zz`^c~SKZvh6*Spu_}zQt++gl4stY7KfX)yo&;cHR!hJwNbU7=k7NoX`JgVd?TRQhe zf^aSI^Km6-DUMvLy@=h~={4U*6t>QN*k<M0f&*FCB5r>3xvsb7u&XRG6<$ZsfHzP> z42^km246uXH8nW}Uh@D7t+331Sf+DZk&Ibx-0_9e^pA^~M-yxw<Z>K=``n%~`M$Ys z8}M_}?b)9zS_}|=Wz}D8x>Xt}IqYpKIb2*)_oE{`bYkFL(#7ffrO~0_0$texMr(w` z=0$L#dxu)Sp+l&PK@2cLdbX*=Y~}tQ@wNUIJzQV)h?1nm?&dl=67K<r($a&D6p%E3 zLl01|V$<cz<D91DTekd0)ss<S^zHSo>A5db(W#a?!Zn<uUhYGFC;i%NFZVO`a%YSz z_wUGZ58SMm`T}NFs|h!1Y-^QOj(B~nReo0*tK6kl`CT%v$E_irnSgA%Q&87EJ!So_ zCWHw!Jtd1(FIoYQORd=}T_DJnsxmm#<K$i@wMI_@5~*u+oUV49UJ$QWwM4HHa0@Z; zE4b^`M_p7nQ7UZG-E!hR&l2lienr*#=!p~qcp+J?ss5Ie%rAYBS*{7CVv~)VnkXr) zoezkB#RXYoM6BFNiP~LbB6qorxv%n^zgYok9U}R1k^S<!VwdVCH5?+69_*jLCXaid zxZf>lZ@>@&)?p)?eWBkZE){z`gbehMZWhoGYr6Fx-cERX_;L}JG91Vms9MbF`r zKqNj-KOQH}lKY(^Lo-XuSA-{qGGQo%h<fXM_qfcxxohMh&D=YPT2xQWwfW6?YiA!Y z5Q2=k69L20Odi!;t=_g#oj(3_p+*^n@hfBZnOH@w$c+;qO!yW3f!>IU4C5PL<TljO zxO&;LKc+agh0YNG2>p>Oi-i6>d;fn$f2JXaH4Aj0KY__Yd$1>OtleB$cog;VjS;## zM#zsQHJJ%gGZqpLK^?0Is;{86>P;D+jMiIHSJ72sUKmC1gUY#byP_kqv1mF%bXT9u z3`;p#e~Vo|yOS?(Rg!YN#?GSG?@<l@v+9*tgxXELnrI_IAd<B<+qHg`8XQ&IYgH?w zg@V2pB=EO8zXVfvN9P2i{w6ePN308fD+ECH`%<$ha9Z^t+3vmO1%cD652XdJsgAMF zKLmi|Q!M*D6m>7l6-F+W&U~Anf|q$6#V+4jF7vJ8I=73fhVcPmhB<f;l`Dr2n~thr z0UM%FMCx!6&SGy~hv2Vsm8u2uZ0^?;tvb4*b=@m6=HAR;C6n~W&(X=eVrJtkm$O4E zkS-Vv9e$2H?AyD%H_8w+Wwhxd@uJ?*CYW+=Axk_cOS}^d&9+XMC%i7JTPclN07dPt zGO!w>QJ%pA8`0Kz)wN(O?@PQ&x1v^6Mq+&zG%u0m?=!}&(Ke6maE7r!xzBtR#DL$B znU!Vh25b0XZQ1zaTvJ-Uj+EXE%zf^8?g#69{ari{Jy$j1KE}coLrT4H@8*dO5_B%< z94Y%^8v7z^Hr4IsDE?pZ3;*f*-9A^X-%_*rKjI%`{fdE^TE7@_Cf4tHf*&A<yJDXC zmT=6le8jCU%4J$HnU;AicrW;o@YC_tT4b-**lZTl4yHw;nA-4tCfpPoZXWC3Y2(^P zj?(ZXJe1oa$Tsmfwf?;Y8-wd&^QqxERfArQF0)e#bI>W}A-3E|Xw)CfZRu8SlZq@c zFXar(TtC75JTmhPIP#rxdxV@xyb=-hrtBDH5zgR4;>AEy>>YFes4xmUbk6+DH^)SJ zW2+4jFDNr#ExPQo;2HiA%IYArh<w09tt|n>=T+NSL94jb(YWsszD0iFq)4ov#%~ec z@lYhAbiSaISRk1*2O0H<U(IsB$Vals_u{(2gl8{OM6#gM{|HxgWIAT8FZkU2)VOb| zth2i7oy~_bylrVt9$oTScUwA-X*}YX&67KjK@~mFqRJ%@>dFi**ThZUJGqsX%+KPD z<i2WtN)vTivSnc)RmAyOQ(D32I!${N#^$o_By@$?%E5p@OKe{_Cg@bWxjC>WF1hla zbk?{-PA==)9l6q(-xSXJb-}B%+(gY;nNlnoy&tydD17%`%RxmVq=I6Tkc5<rqIjnE znPcxvD+4#eQ*hYeGtaJ^z_EhZS<Am7p*VwNNlqNZ@xo9KAyM5P#rP1fl#sGF_Q~FX zNcjNXw4WJ+n^1n5Ep@&@&gO#|xDv|opts;(RZBI4)e$FfYB!brB^mDlnVkEsJT8RY z4v9cEOgNAnXv1KuA}n-jrO+t?GfPA@I$H)MtDHtx8&yZ?D)d^&$RO2O#T!g?Iq7AK z75uY=df;f1psn;d6B0x?RlGB->-nOhyk-(pw$B)Xo#{xqg9%Ag$B@<bIf&(>$MJ-0 zomUE@pq3`uO#&@QH+wO_VckYoE#0#94G>-tL?eaIOCp2IkkxYEy)vwJ85X9Wg4_fY zz<2S8)0jJ3@|g#U>YcINrjDMhh&pJ5i^n=|;=x5qofo60W_Q7EOc2Z42xyp1Vqtag zRqQtWj{uJBIw!_g_M?~QwD_|tGRj@kmL7k#>zTR4YrgKyJ6u}+h4sA24hq98vuERZ z0>P^3VSIdgZ;8xGlZnf~U9PmVxyywgn|SzH&r(ZroPVQO?XI?-qtzvrN}-RtGl_&2 zjP>=Gx5{v^oUh9oCcNLaf|Zp&H5#sBt8;SuC?TqlCmXzq$!#&}y=lnQ#Z@E3a^>z8 zN^=8GHES+1lF?IzIFUwB*xApn$Vi5-)6*hcWv|)-1j*K_?&lf}>!ms<0@0+pjl3v6 zUKJ(?>Q{J1d@ftbA0K1jW<8IGoR#D3IXuG#TbmPBP3Rl5NZYQ0_hy|f)8@2{`pnR} zUu>;DSRJ@PzF*~RbBb9dS!QlY&d3?GbJUE)CpuS6G=_X?LUU;$_E?I(OAyf9-@K>4 zbH8+YZC7Mwm71Q6)UMB9WwrGjr4&+XZYn3kv7ICx!5Xh-B^&$ez^c-RbKz+ah0|o6 zrA)yFa_K3^It^D@8`fmQfJQ2*SxNVF9aYQy<zHG?{6+wcPAnD0pbVP6E7lsyp!n>O zk->OKDuG|wzH`{71EQ)>JJ-ST`OPeXZ2W<PanbQ4w(Ea)DnHyE+`xct<C2OA=svL1 z!h;gZLu;JWqq%Zb4z&3x#roma5y4M@;2Xi+C3!ogPiUxb@p$A|M2=<mVJ3hj{oKK7 z|C19OIgpVPoqqB=Ix_UaSWmUTn=5<;U(Pz!xl4|20mp5BRGklg67{kt`O5>C^p&@l zmaiWhDa=tanK<`3-?Q$2l#H~8DuZ)A3C-y*kTDZgu?$0~eomkBcEak<<f#(MKo5i# zs6<AVBep!FB85X@+%-!Vj?5aJ=z{fFybBF%D5`{XoS`@%b)EuFeP&Id<?Ir3zb{XP z57;QDN10I%UG~wP95FFIhn+_WQYy?VEN7W>dx>+m=-aLJOp&jEjKM8&n8cncEmzSR zek{$0vphcYqUhxbLEm0K-fN-fZwgJ<Of3?YGR7Gu)cej;#HE%SDmZ-|EXV6Pgbo*S zpFWu{6~+atjG9Lo264OxAFu{IB4(3^l}ym)a+lQI>>LyMiL3G)b*^f+2jd_nsj|)b z3O)$J`ujXb#zbyUcLIRHGR1?aP)<dMD7+~x-wD4XBL^Vau~RwM^eWq;66ZEw0Y!|t z2Z5u&We6Mt2b97VGkpl0rOsXcNI&d|uy%XTdhz$2T}&x>At&#CGb(4cxFV2|DSlSK z=p_<&<ujury>om8Y($l#y|cSS=UeqXET9G)j-7=*nQSG__jS`xwAdMp$D8O+Xieah zQZDFAQ&+$3qb*wb{F%UO7<6|687CG6utFt{%JY=2mOF%%{Be;JrUXv)JjGXGJ0|zv zGFlF$dpJ=cVJ`&$O7gaq=IzG5Au;m%dI&}{fE=G`iFgk|STPKVC1u+r4*V+r5?Les zt5y@`&u@>8Q=E<F7bO0zkhLQtBQq~gBOp?F*Q5!A3Yxt$7cLY)W=jyWOw0Qat^hMV z*=j0?9CbC2Q46Nckydvd%I=krFM16{0$uASdivLmNAg)g!&u0an4J*u!`{62%F6#K z<}iBwqiQILxchO;cE;F9zub8x1$&MA{z;M2a)f`bh+SLe+%u+Nom^JBoMfN5+UwjX z;iM^YnuMh|r1;!mTfw`=+?nK%PV`6dj_Rdu5`m{xp4!cIB`^V^j;2L0B7ff%k>0st z&+TM$fRH-tiUFSz6k`6c8w-OK{>be;QJNk$=3E1yO>2-M4iGSH=$HY^DiBJ6Hg&@* zWpOgvGMotvWYYuS0b;Fi#$NWB&Az<%qZ6o1b+WC*>ChQmu`QUl&}58&r2$V)e$z3y zSfK%@;Y8kzjrE0cSV#wgJH3%{2~M_$tQB)@3NO1odbOJI<bE5uvxnj>2(by*Gdd0V z=2pT^qHE;@nFOv2m3W4*2Sj(|LTu}z*`n4!W;5o#0vI96t7G4phr55>N?x^jqqi;# zuG)w^Mv8#7yv>G&uV7p7?RZLIZc(T!@FQONRe9XGfmOAuXIxb9TIB^^oI8+cULC`= z_eEGgGAAW<na))OErA(gep|b4Mz4Z@R(+)LXX%<piXF?us;{A%r^dPbu|_{YAa!kz zMy;i~Zw2p`)N$lE=N7<^^bv5!xskGX6y;W3**V=SJBSouu8m57Nd5iN?%y}@J*huY z+o{@I;SOwj7PeImQEYuWCUIyGSX^?r9|t}_2lPk7oqJPIx-6^0ykZ)e8|E`Mj-0S{ zk-!*5B&i4){`kXqd9eQWJBiI_)JEiUWMsM>2!6YCCY%4+^xPgfj{r$Bti$x47#%@B z6<bgIwiD2F1yDF&D7Pq~*vEThzNeb1BpSb*AeZqjLbycZ7Y@5Dyxj97zbpnB5k{FK za{fXDo|c9e>8`r#!s-d-i2a=}J@l8%#Ft%kRzjdbiS&H36SXB_sJIm!_sdeMKsl)p z553ttSJ7Ch*@elbj0jU8xx(U2{M*=~^smnt%=S{5E*x{PQkbH5y-PAErmUTo$&+m@ z69?%Ok`zd%#vcUk!ewO00~ft}WDcxrAJib0b%4G^gBX58`j!KTbIZ(_>{r8lY@9{b z#(5gXGsJdhH~<%_>G#&%;cPyFOniq+euy^b;yFzx!AC=B9Rb{kA*nS@>5v==0ySU5 zI{cUo`=>q6(Fd86h3a>aa{iJzY2uwZS;ddc$(*NB<|Kc!6<`Rl`Fyxbe;B5wgb&xt zhX)e=H%9%XO7C`ZeE(MBb9&8z!a#P>uosI4m#d@OUwL`BY_v1DmB4gMSt?!p3O^=Z zT*uY!n~_comC7DVSUPm4ye<6TZ?^GF7?hpW%d4dp2k}I)ijJQP#`Td>eh}r)l^85% z`D+^2h+>RLXyt8371a2nTS!@tls`G#lMB-N3{Ssx<v@q=glfjlH&2%8Hh(!5d$)K% zF<gt3UlH<`U?F_U&fM^#1=3e82*s*ugLoz`4zTZH*fqu*er&#c!+H+^%WLX4fB9z1 z&77Bpvvx`(1nyJAg<uEaZu)JqV)v-BvWU&Jz#zqqv|Asu^3;lxP#U-}iGdir2`g4u zp&a)0+*WVReASpUwmxNi^m3aF!cz1G=OP(Ihx8kxTREG@zLpzF#18FjHRxj<*Qxr| zD)g79`NOANvSOekj0h3Fp{0ZPAs8wSRaFFEK^h_E0qi8RI0yf7flD#$)(*JlRUJO_ zee1kYYz|GaNA!FM6u+^5%KrC1?cYPKNB8eR3`wvYmi|fH_^<1r`Kfhp$+zquz>|=9 zuUo@Z-AYdz97qGD<y?M3(2L%{V37?2oJ7Kby&cvZ<{i~?;z(4xqNO-*+3P5d-*W$e z=#%A;UESEM#Qn;vU<VMH=mJa=#;6YFpkb3*qt<D2p&(4jpCbH<8_mWtgoc`q!palc z(ombUI#D?vY)eB=x&qE-B`nMr!GDN2h)s10v!c%<lKLV!@B1f+lTB!5=oXjz;WxOh zW;cA(Eoz?od5p$2-sL>A`y-Wk8)YrZ3};5`c#`#gW#sk|xIc{{%$U1xL35x`xcIID zj8|JEZ+Y8Dqp@s6XTt`@g73$~5*ZnhNPIFFbE_B%uAU>#nV;yP`C+<PJPht+dvNS& zGB_n5$q2bP4}<wzxUOMwi6ig}x+oWw)!qdSQk{tuJEcGL<>E+j7w(k3y$wR3bbNUQ zRNaMU+7-B#Cfbj(R=c#DfQr6=K8)^9ys$H+RG8e#L|zYcZ(yimFt;+evXV{)-0)sv zsEqRlX$1C?>Bvr*3-Y09QV==Cq2rV&u$)i!*jp+4;{@0`)DE9<;gHm8^_Ke3na1g+ z%myUj7DWQG!zYC=A-f=PD??#<D(BTt7^b2y8c*p;G*GPPPs&3|l#8YEw-i!>+3(xt zm)4Mjvc~i}7|c4r0Olw<pq$bbCCFcG%?`^_z|o)8Xp=SDF;fO_pQ?OadnhQ@TbHW_ z14KWy%PRt=doEST`Jtj$ziu3eCzdSxc%aJg%$5!j{DhcFb5X35;R#h>RexCRBC@q) zTDLt9J#Md2+X@((0HnQ6rGFdMz95SOxNK891@=U0p8z<+h+!4Df?!gk<Vw5@;p0&{ zu2!JXvZgitUYT?RO@G0rz**Io4Gw${DKNe~DNo&jUL^$|SGC8|D2=(H%nT$&Z2)jM zvK3&%ja1BFhP7HH&w`lC84{D<-jGR<A8>2RUoZ=fBZA$3?=_qXh;S$7PhT{A49-mA z;sSs9CV%9?M`h!+@+bzwSSQE!rC~Q$)pMhcxR&?BFng<YnJLVU7yI+Mk4g^nU)X$) zU3P0lMTNO>|BmK^uDl(X4m#IyDags7<!+h~JK=RW64W-$xWP+wEDz~-{9LCm)9F6w z6z&VCzupUsT4vVO)tMX3E!20U|I$L*A+r3z^t>Gy7gFzUDZj(6_m`@?Val;pd<E&< zoK_q5k_%8wB2)Y$o^r`}<V+Y-v{p_EK5O`r%+`5i1*jP+8}?%U^3{ZrRn*vDzGDK5 zb$3HAIwUYD3wu@x6ZZ@-Q5vz<KpI{gWs&*M3n)2bfD;gpb}S`S80GJA5EvNkkKE>j zdg*Ea&8^*wOJ|~Np$$jW5cgXTKcz|s6ZeHlgodux_<*=>gv~WXpM?6xQPTFY0qen7 zMxc=vKA?6rN}a$pW#v1H!;Ai|*sgt*9=S~ouG@T<Ye<yGf^aaFnA{Z?Jodcgs`^lt z)7P>i_WoYp5)S=ZRoYbfR>TjUe|?##ileUuv-tWVjzKxD^X?7)$fElNh#L3YtMFlt zj-@+^4YT^c81HgD-mb43?=0Z@e{sCuq5AIqpTv2cd1P4*V`01fT+q?VB^Lza9MW`v zRI9H}>5)uvlcJPH%g#(DiW$95?3qm5lt}ECOk7DKO&pg@!I?l(6lQA&jz6gsm>2zu zoFW;pO^^4gTBqnu|2;8-{HabEoXm5BPB}lBa)nMgDVZ`%r<|5dIY+0QoJ`5mDH3DR z?vF&Zp+Bc2Q})7_kuoHiB9Q<|$w;QWu2bY*J-eP|I_1=4%5ys9jAY6~Iwdoi5+X%| zx_>gU3Ts}SI53&`lSJZ0$;3${(lKG3>~4HlH*tD0Wq?i*R~$Q!p;OLErX11roSjUG z=@d^g<z1a}VKSv%r{pG6R$|FZe+DE|p3-^pk|}@EdEChq884-DoMVLmcj%P!l6kJz zDHkMDN_C1T?Co(~s#DUFDFb!N@yV2vbxQAKic_cbNv7<fhZ_DTBojC3Zi{1v-P|gj z@||Q#y-vwbraY}vh9*<)*C`h#Q>sbP&0UgAyayg7T%)4lG*zA^8;Nf9`pFQ(WfJ2% zI-^7HFxO9Rou{-IW#y=#<9?FDPi%uG2)#xEwc`(YF*67+S}cSW?hQGBL#bjjq!NgD zy5IUPo;p{AeP24RD1Yo_l}&C|l3V04H<RsKg#qoi(fZ{b!X%`rylhQZls~AlYcfk9 zAqjK7p{6rlnf{6<oX}mu1o+l;aI&9+-_x^<h4lV`oB2C1a07pH=LIJ5lNT7r-;0F* z50vn9N#OG0@Ep6DSA@0l5ok^VQGS!9XiXGpWyP>)^Z+#Zzb}3n&<;mrLi}OXcDIJr zj0gv*MKWQj;HyyB$6J4GpO9>J#-#kpVT>pVv_22!IskJm{2v+vTaPC;=H?sLeS3uE z2@JR8?8iLSfJ~G&A{~hWZJzp_Z!2#Wd7hN-w&E<lpNjllzX<tuGDU7d{zeJD-TGp; zR2}?F&7r=5C%L1;Cr*a@msV4O<-e4Jq#!WHX&VLv|1juAbS67S1^SI+#!rEv*W=K7 zNKO@qoo~IR8u>ra|9vkBKQ03Z=mCJQdH_$$0G^<?s_VMHe)B^s#FFxx?}tSd?~cst z>g?>?zh*$o><_B>7qGb2mNJaE*~;ACQq8ap-x_~}*wTh?m4hwo1AooCY5u%-tw*5} zIySkQMHxR+$I=obrBw9@Djt#W->`naOU>HABz7jmjIYY=icwQjlFXh&C-65ndKx`Q z;m?xre@(GuHvX*djz5@Ie`y)2Cu)}nTq4(@%JjzZM`WjO#voaL;gf-rQWAe;t@%_| z{x`r>Bhfd4v@Gv^%Maay854(bg-;ruU(q*#M4*-6(QkGth@PDU(Xk=QD%0{?+Y1Bf zbX4XzSw>`@9E8ahAyEp(3cP=V4>(Hyr6v{`O5n@V6lGW(uQ3_@!de`Y{%E*fAaIrS zC~%easNt$r*|vJsUXdD}wlt0(@W<BUGez3|Mu>`!<TpappBJ_ELE?bu&wyxxJq*zo zSp&zGzm+_Ep&G}xkcaPH_;2N5!W_}I19_*mON1S<IGGT*69vrZaA=WiDC5F|zaZ{q z<+*Yxy}pdFFinK!bn6*59~4XInleTf%vZUqwlHvRn|E4&y%8(In$E&teJOfqq5is% z^Kp^Mpig4n<-IZbLn?`jG)S#_{4m9btkF9Z{-j;sI?rFuO;+j8EC4@L1miM5rqk{x zO<yhHZ)cMd;E{h)<3<`(CtFrE4JavXWuP#Bv!<`@p+Cyl<eyUhHwv$4Roo;i#kYmS zI*BlOs4(~rvFqYG0lleX63YF6-QsV8WmBol!s4Q<aW)nC%}1mVUeZ>YZrljn?G^zM zK=2){FNX=4l9k^qilKY(X<G*5{+N57*W6heen={5s3w>Aa(^E$8-`(on&8E`^7iX# z<k#RGl+k?6mv_h;8Qiac@OxEft`+SvDom^)GOg2a)m8O3Q$Ib#o(<~<j$N&B_jGni zaDzvxm%F9=y^Pu$=rSgFkalxdXmj9N>z-eTZX**ziI^e!7|=pK^KH1_XlUK%D|Y4t zqUtUk^{K=`U=o(~iLp#sUpl`^Jf8ebDt{1Zc#k!EyI=vwC>{gzL81`?vET`E(rwjr z9B14&7ts65Z}51$;YE+jq?U#Y--Au^nj!USWljc5@iXje)JpK(((tbrG6-Mzlv|%4 z$eV()Fgb)r@pH_b3kG<GdBeXJ-hs!V!5eV^*%dn-oM;c7Uv$;2l%`318)qMK&|Y9@ z&7rEQ_pKQ-1OyTTHFw{N+~At$T*23qWyqLPCir@L`bYBzN^wV{cxPFg%5Cr;N3$ps zL{UU26mIoU7{IZ*b*=Wd(WYJM;t*~)ST3dK9bQT)@UE?~2TCA}4Q};EYG#vER<O<Z z&D%61N6kf?Dxc{HtqYth0g#F~p7w=%*UE^9mKx|$*H@e@QmzMhPXfIp`hlFPyOI~P zUVljSHuxKV<Svf<_gI@TsTNUv3{45J`v>ymXJFtg`N`$7PJZ$NS@LsH#k|1r@^Fb! zTMYey`O0EXx8C_!X4<H|k~$>vN)~FU4W;FeJ)~weGO3rJ6H~G1=*HOo>2A(Ugp-pC zWI$Wzic%DCPODUURNDm4YlL<Sa4;&&ZgXe!^0xWTKaMj|BFc*iO@?(R6DNB|Hs^63 zW;`o8oxMAurfHh4v^+}1Bfairg#J!_bnZPmr*I4ibnDZWpllF(XxnnpJ;A7C<)>45 zY5T9^WJPd%@(<~&zQ??KP#wf@OpLe{PcD=*CpLE^y7)G`@fhbvv?6}?H%JBWoNobv z=!w8Ir2%Mp?9bLF=@OwVP!#GYLViqXiBlK3yNd;P;y&MaXAU7sS=SJIqwYJhz%e?- zu#R&kwclH^rS5GwJtzu1TeHk|A@LLbV1v3f*jGjPOx68BHnTaMXt!1&BB4nXOg^G8 zc~@Xv!*QUi@T#u~bu$&MjV-T0K8hc~!4M^xSEbL={Pr-=-WNXeiN6j6c{c|F;Xd<t ztU2HaUW6iz%{`M0vbksTD=brv`kn6)TMaq29wOgouaJ6Ljk#|q3`zG<heQDR$X_$e z5ts=^$4*rANp7>QX(5JuQ{Y+%Siu{?ow0`-t0~o<ekz4PS)PvLDU&CwH{nne@}+<F z+(1X*hv7c*o4*b_3FX&SgO@`)8R<ezQwE*}yRksuH6tH&I?>Zt%7>-0uoEo4^%KPH zvb2FuQH`9@-zIa6P90mo=n2dfrXuNKzR5ooIuVNXVhVqhs_#@M2B!z)G}@(Zl39Uo zmr^GB;_^=PHR@EHb5j1<rdcYHf4Vc!oR7)zUG@hF_DY?PA!QzYFaQUqjs+}nj`>f{ z$CCW}H}IRMstyFcJ->O)vjWU-$8Smm*(5yU`#+p6MpB}`%ase3u!J_|ieU)Kd?R!L z4_Iu)&SU+E+FuL~&7ER8M!@R9#lC_=#@wfvFK>0BhwQ?8YO|mCslj&3_j6XQFu?E< zr3E{UP%W8=c7%D%%HZFsXE`qjKJ6D1P)J@5IvK6UYZro(Y4xPAP{y3H0ycUh6q2?I z+RV19E93nk@>j8si+u?a-b4hb6Qy&?oD>VFHe=5BnI^hfg;=#B*VpaXP?Yx30=^%k zDyv&nJEW@n1WBo?^5xhzRiZ5Nqci|wLt|)hlq<_|?!gR1j1CCV9{3K2DPzUzAirsz z>r_m$oNKsaj}8`m8r<`FD<_h~ldDu_zLDM-B%g@Yau=ztt2&)cxh-`k`Vr>Ig2xB< z{x;=~cD8;VKNgYtbEto!U4KQIZh&ZA5_*Cbb|qRkN1e*`9&Ic>kuXV}v`~?D)nR8- zMV^G%pb?ie@;=9<k~Z2!D~ew3mG#oma0=Hk3x2!;0J^LXAG8TWYoMP@T9z0$@3Q8n zvu#?=z-e;SvK7BJZFa++Cc=*#`{(bPE#VW&@4BGKcyMLxorJ(p&8)`HvqYe=GOw3O z`G=%iZv8xuXU%<o{sZ+<;hN&%Kad1->-EuhdFUpuu90=VjY9)lC8g|_Y{MHyw$aON z7My!EJW1us7Sn4I<`icn>v5@5w%*oYZa&tJ%7lnr`<r4udu7vZ)Ox;^{_=g+_v4kQ zi0pyIKJ&I*Z;kknzfXhWY85FwB4pQkLJgs&nrEV%%MYt*BY!cK3!crXo(y09v3YWL zeDG?L1OW0cdLy&qjcAMQYZ6ULiQpQbC=g|Sma`J#FkL9mOw)7xM*CA-oj=ZG+<g<} zrFx^*#Yeji>z64t{8T?DXJxXkl7=QorLPKcR|8b`;#PzDtOgi8Jy|E&J-VRPPl{pg z7MCMGH-6A0hYAe^?5~YQlWuh=(cAjyj?S(n@+!hiYm%NJZ*?wXzaf1mOgvKVht{e) zF`uhXAHTyPy!wSk{VAh(Br1{{7BYDLFfN*DSQR`~0u)fJ1xEt+=^U?r;jcO9Cj3>+ zicI5Lb=x1iic#OEm(;U5P+UF2!IL9+qtS4{X!wje#APeBf`Ycd-h%eP&e+TJWC)kd zS$#NR_)HCHMJ7kHUt3C=4%X72*vf{>8M*9~?=xiKOc8Io6821pY=R)dO%72P_M-pe z61Crv=2(`qPy&_1af!iek$r1#=YM=_?>1>5JmR#<0o3*ZMq?slBIX_Q{@&Zz(BVd; zQ*wnJ^KrmFCiuKT%Bgw5h61&6yR{qlB6d#*Mi9#|5?_P|$IWC#CPu%IxFVqk$?}PL zr99>w?bhFu<ufSW`$cE6wBGN#l~<yL;05JRkn%rGmM4ZBi7!I%yR}ak2|>SjFO<k4 zC5KW{`i+&BV4$}20zbO7_m%N>h7;qxTUcT0eU+dZvp;Zj0h#7)!~D%3<obyYW3GY& z>XM}F#H*uAN8XUH{$?vfcq9yF^lLPiq-<R%o|HLIRm&>@LCur(G$ddfqWDq${R(`? zCi{B<-R&)Q%DS_3Oj*`)7kgAUOOKo_&R36WryD%J0{`7OIN9@mih_SUWRB`<%2cG# z^JCA))8Z<1jQL>l*n5b`bWlW4D8gEWg*Hn1U@rb9&PR!oI6;Wb9y4k4i<D0kXOCN} z%uiKu)>M{t`&Ucrg7&s1?Hh~Z?ITpIRWaY}@%cP`t@FNGLu&h9gMVL$PfnuON&M5} zJ)x9nlQLet<o;hFS((`^geX&u&bq2w7ZqUP9|fNA?qw-pehZ|cV(QJ(^&UVyl^nXR zH{tJ{fcF6ze_sXcqmW8~{_-*EP*DH6^&aY0K*3wlV81zHz>@>z+C#mbQ0|@B?cE%4 z;EC?vqut)yM+=p3w2#izKXS6`jIOV-rIt8<u8rBy0(0&x?0L3C5X`jhs1V`j7OYt+ zx$jPnUicnYLgGWI&57aJGaJg-M)I3PM177z@|#JQMGv=~CT(dLd)^;Gzr`V*`#j#{ zgV=H0Lf@poP5PS=`UG}GsTCyk$G55yelz5Ggw~aM0pkbtqWJjy)sn54R=E?xI-Oq> zY$A@b%CLTe<m-|m>`D!Y@o8Fb_P*#f@NW{6O{|}+%3HLd@~y%<L<SGSa)(%=O2ygJ z2wkN(ilJL_{vaFX9%~34gG=JPX-{eSR_g`nr}#oCPS(1by5a*RKsuJ!%RTcLDD+4S z2HMBKy8XQztJlbA#Ao&<t_D{K*x-PUi6V2Jj6~L8?FIl<t&794t>R4@%77=|rw;F} z5`mnIrOf<{qF&;6zDV8l?#?SCgD)irNjTZ>8Ptn--d8|l4=%X1rh^gwf)SRM|4W#* z8j35{lz9?U0=c-{)EAe_{`7@3i2K=Cu{;D8A-o-;ayh*OqUuC3O1c`&?6xi@6A&5x zy|X`YP?PYiFW-z6;PJF3N*(DBSI|68X{jno%e>ylYsEa}=%^HG!izCWtZ!>EjWd9Y zU>f@U3CUFP=f#tx_*UzeH}NYxb-IIZf$stB#%c;%FDMv|*unBq7r1lIY4ySEk<5W? zU<dJTx0Y9vfFcIvwZ<Qwxm#J@ssTIx!le?OwlnVi^|~yaLye9KdN+Hgs8EDLWms9N zi$*PXW}!qm|4R-SO3Y7`t=e9EN=L{X-aWoz-pEM5bJoW2Q2u%E*s1Vi-h#Kyf8Nz6 zGNFqjyy}_hj;`QNIX(kT0v9{1S3s(o4o9G`F-LrJyym}<NaOWQf3c+Cle;hTNepK4 z-+m^2*=^mca5{KgEGYaAAF1|C2Ug}@1XE01e~zH7AKElht)sojEiC@b9|}^zMJyBA z5x4!f4hUw{bRZ|cO0uE~GVT<r;5FZiin3mm)hgmJH_YQsR3CI!&v3&k&)^wXr+RJ; zZ$i0>(+i&F>wetS<vQYUHj~o+<0dB#wa#YZ5)p}iO{AYQ%Cyp(5&t7c8*0L@8Y32( z9}CK~@u=n;fj-?NhY`9(WmhcF4%KzbEB!72ozGxSsOg8~vwBk!WE)0qVGuaLr%0*V z+Q{WV63a4MbcFRC_?%>LZ37OPH}1t|o#kNd0*_e+M(vj%wz&gkySYEXz@&}X@ytMn zW@D`8T`6o#IQ@0LII#n~+84RKxF@$5b@-f|FLYUl%Iu-gQC!+tEvGz9-Ui3bg8w*T zzGr1iqvazaB%{)#8)M2p_H+E;(CI<a)i6*ZX?~KLom(w0pGyl?*nVMY7mtyA=AMy} zp%=)KTz7yKJVaV#!3aKE)l#3LGa_2JZjv{_2C?W-6*o$!tf-(#O-FyDRt$`c#pyZm z4(Lq%$z--_7;ejGj&YR%nY#Wm&|#jrn!h!%{y;MhWpeC*(KAo^8=nNk_e%8w;`^yR zx)7bP%=pABW!@_0MJuJv6n-k@JdpEEt$ocEQ_gLZ1%OAaUs4|{eli$vxikSTo#JmF z?PpMUtc)Hnzt)%I<1t#>+h|b{7Uzw01Oj7T&ATEnT~9+`#<Iv7rE+V$^wd0atq_>- zh!6NEbOyTqiS?JCsxpBAN|7#vrd*6%x*M%RcTit6#jK;ovqtnI8zF*9&!ChH%Kjzc zemr~U4E7AGi4Hb2eP7W@iQqhMirN7#@Gg0T#KuW%&`X6G;JB)dlaK2TH{KXeQYl7g zfY7h-h@LV6wZ^tkh2VqKYE9!sYiZ1_ZRtxNMH;YfpG*b?jCHUb!LfAzBn&cE@*;L5 zfa@oMQtZ5bx+rSq@%)OK`8xGG-!n!1F7ixOzso(-_=VAs5y4)}_Y|Qr=Cmw{b+Tmy z1sTD);C%%1lpNoJ$(wz!qT;R#j9N4RP{*LV(ZN2xlo2})i??L4A{cY%r?mI~NNl3_ z<5hd7-17(4!@n1QYS)>k_{nO7enrQbtLq<!itYOW;0RxQDIZAkla#+s4pqlqFX??Q zB|)!6K?Kb)d>3RnHewi|;Y`_Akwe|r79O$Vk5W69+SXoLl@O;0Kz-gOwKOuTziOr= z9PCatBW@QQPL5>m2hQi%i=CCvVpmkP&?RgAals~8>o2paWoI)#Q!=KCEJ*ZS-o4Gc zv!Sp^o<b+q_?&yGc?j3kQvwk^N0wYsiIdW30Z}4|g_>wx*xgx+!f0_m<n!c450ftX z=02y<bz$a<lG~hhigZNwxY|KNU)ULneDb$gjgLYfJtm-r2lK%>aM8OWZ$8uQ(F2kJ zx6+KKCPu@Xtd-b#GB95lT~O^tD2mo4C$<W;Nibj;of5K@w99z1e9q6*E-^E+XBokx z02Ui2&LWtWZSUaX7CE;JnHm?y(J94r5w_d9`ung7jNb`&J_Minp+@K?8m3N<-w6Oj zACl`Ip6+@CY^wc&DGy(~`(cGZJ>&IQeW)ay{*EL|ndlpmtxvnkcFHy=fL`P^(G2SY z48fveg{Vl}m;yO*gVMY&YfEC@)7(&wq?xLXoXANxe9n$EnK8Lr(MN1@$0$W4L0luW zh&-bHMzsVLX)iGkTLVC5kVjcq4-=JeQJIq?uT8QYq-#VUD?N(9-o&>)tBen9dO?Vi z;*R%QJ3gbIw^6;Er1mLM+y4!`+VXhH{(*_1>>u!ZqP>;lJoq>3vddI2(b)z@(zLz? z_+#KC7rF~6<it3$OlzRF%1yw6k%&{ftsw)InTAK>5TtQIf%IaVYy&x>^u@C77TaSX z{13UkDD5AE(;>3^ucdY&vMU3v;Rob{Km3yBHQTLTtU{eT{D9=<(-8TAA=o3c_mZmU zCG`nNZ4SzL*a{WiT=bEQm#szF>#6Z#QmLF-Fv}Oaz1cgj%b_y!bL-~o=!DtAW#cnX z?z&L)Qh6;fcNYe@O!uHOP*E0n+LH;RSc(?ge7E7&ggE$n3W|W%929Xd@I$qQNP=UQ z%<*HMA<_an!!UkjXDCv?^F4m`yT~(MzRzAE9cir|enIee@umQ()U%Oc%I_4_K=27Q zC4v>>q{{-g)*!*2Vh<>83Hg-#cAo9lAT_M*7!p`Hx`XTOJ#M>o-!-Z{;0iR!R+K{z z!s!>R7kTD=HH%6W>}|;8=z?ttIa9J&?@;GqwX=Y|pc$L(d5w3<UMsr|X#`NXNP1kU z(B>W_)K9FFU<lONj(qr0%7+7juy3>QmMQ&Kd)r=ClVqAUNye=^LhG8YUr*bzyV*_c zXKxEUf4K24b=_LWFCO@(G~$NLMbTrUE^ClLxAHynsQSSwhjj>CJlq(N!N|KF%o&pX z1%YJb9;XPnpIA>}+Zp{170RcF_>|A}szr|I@g$}2H>vuE&%w6mMljd<gfK@acD51f zgl7>(;(fY<duY0xi+?=Po>^FSBeY&}NMxo+4;~`32vMt?a0lW|e|q)7%Z$)7G9+kD zrnw5s4HZ5j%fXF41?%s=*kAC@bfVa*oWV_eHb2A2<0F+l;_WJ~#=R!6o`SgY7Ocm( z*WsA{8t2oY{?eN0KFn1F1&jR5B@w+MSEWU~Zef%&+uQ{gw7K&yY;*T=$i0Bo1#H_- zNlzjnPth=0DzA&?JVR6iMGPDR1b;i9c>L$j&@u2#NG`{#&*|s!Ja4d{ujBbwOoHT@ z!t)k8eX5-&mZRyJ-0om8Px|_t_6)9;A}m@DIw6OtGr6xvotzk<{~=Rp*pTt$_@zJe zui?<om3PoPKwIOp@PfalS&-^4ha1CjEFf9Pe1EDXQosZL$X)62I;_h;SG@?a?NU4z zDiX^r6NoyA?ut8}3Ss8G5si|9e|6#Mml?Gfgs43rF=@c}GV`<OC_&R*rI8yvPFxq| zlutPnDy*VuZjsa7&tGSqiG`?50e;gB1hwM11N{^1teb!vf8-XoQ=c!_at=bf(#sq9 zqCLxv&@_cxacae8A~-o2oU}>FR%@H&hQg&mOr$&r{GRpbK`Jv_qXt8#y~B;a6`%<n zuz}`cRSWJy#zF7f+zIOSGmYa)Q#L|<e9Th>I|J2Q)`f;e+8?8qsHNUvznp$NTSusm z#<&(y4^^NcYYVxhoWtrb9W=Mf0?N8d^%ch22>q4HAll_uW%(nIc{p}*R5Y*Rdc2V5 zS3GkY5UZM7lS1l~x-2L>#Cm|bmH`r*u@ur|y+s<ApK|1Gggz%lF;ol_ac8J}YT``t zO6j?<^+V(r<{dm+CU?#>ECn#)+J!Yx%(~@jwk}ReT90Ym3<!Kjn~f4<i%Wd5ZLZmz zhSN|U5d}6`&&!Cp&$jk3jERISv^I+*M!VA(ns<pPHkOG>R8e#4WU6FI$yfO&&og+I zIIY&g@ts}P8B!x=iTX3!{1BMT!K);%iRUJ4$&h7^9MOO6vHDX0gfQmzl`R_<b4YuM zE@!^WR;t>x?!~G#)_%Bg<xzO?bG4X^P%%AMau9&>hD*3sW#w04@`<^o4Z<OgfT>1} zrC2<a89pnVemFAF;aFE%vn8!;(CwZKQOmBO0i%8b%jGtAh})AtWfGQjBHRlHGX$$a z?$!01y@^5f8u34>&W>Fx`~oVSx|5ZMHL61_<ce9o{y}a}S%Ed{lInv4gIjE^&t2Gr zMi#006`Z4-bs>`~vhS(DMOEQ!<$$yS?_@PKMRzbYYP&W<WpHFFaZo%FoVrvog(HSB z7GbJ};N^IdOw76Xy~&7fVnnhk_5)Jc|M&2V+EjtX2py1>7#{KB4>@LxJg8C|egRX5 z`{P4&Ec!0r=N)cb-)$a(6J%{RNYNC^V*MzEsQrnL(R1jU>~D?FP~5si>N82VuV+>} zw+cQS{Qxz~;l@qf8>y5=zJGKh)4oi?qfi=Y=1=28(!hF_Z!}k47szXyyq+en%pvx* zyaJEfo}^gk0UQO@bjKW#8)J}?_H-+(O|hZ}+4!aP&GaiyIE8L~n9_J7-=aP$6M1RG zQi>|QdxN+ZS$`|jjnycsIpR_Iy0FmeXc#n>uXF6Ls6z$#v-rxoY&cP-ZJPb9RDb(n zqU4=Y@@o6*ApLcuD!HTKd?|T}{mszd&XsTRDLq{>oMLC#&FE;h2N|qpjU~04B#kZN z3Dz}6O<Ly;=0GP^8vM54TzD1%DCT$`lw8#P2*2Rls{-zx)FdWhwQo@>98!6dM%M_v zLdu8-Wo3ordTD=n4CWk@avB;bM@KHcX@KC{IV^za)qI~<Gs|&&@ame|J%gQU{|e;W zBqI8PtbonYcVG(}e<`j0RwfeiRNJ&faR*Sl=tl@$LTS>kly6(DH|}JnGASa7dvPUX zJ0DEckPqeK8f9Wl80|g#$rT_M^C{~{xoT&5qIZe(M#hKZw%7|)!XE1xA)0)cD<9O( z=mWsf;Z%_@uL&`70Vw|T%AN<AL6r5VC9bQLNk0Nxhas~m@><eqL3HiW{otBiPvce@ z>N8_xIBl`D^Nv+t=D(}&*_8S$sqdO&)h8zjv&f0zjUqY$W-1ppGH_BiLmcU0tMwq` zRoPYsI5e7&;}741GND<MaG^g!Z~99nz%&|g#g=J)<QVYqhyD#bu2sB3wZK!u;~`b? z*TKW_@9OKBQlEmys6>70d`0`!V&yg1`WHAOH?I)|Gcqx~i+EqXI4*16=NskB3A#h8 zgU1n>#mT*q!H?w*ONq+aJ>K&~6o;zPK&esRAG7vitByL6p_IKlw(cA{t#tAsuM}+v zm2ckXyUytfd~7vA2(SweyC0EUbtP)E32hF(BkZBw3gOniQh)BZsNYHb+hmb^%lf~Z z5V)JO*D+{1+S7;gSN@fS2Nv?^C6FO^&EY!sVW=sX70XknXy%zYeB<tDY=ANe(k%$_ zcY!7x;d`h=U3^7&#@_M4CNq8KLqf8Oooz0bM*1hbiL1vp#u-ju!yB3g%FT^MkFmbu z^18Aw)$%$%k6K>Geh%k4>t#Qxxq=lEH0M39F?J_HXjwU-{B~Gp00eKr&dSpXZgFMA zcQLxWyeLLVZH^p23>p@;pZUY7X364KloD0v82#BM>)kSO*Ge^aWyRx5gv*%q2!yU+ zqxtTvKK5bZZ%E)MzZ@nA@fe<KlNAC|h*pCjk{G`!`XI`X6o)cxl2p^xXZrDGM;E5Q zj~1i9TXG{x+}0&GtG~0=-&*z8RDUDt?@!d<pQ^t<SAVCgzcba}->SbA>hE>(S4&R% zFJaz#V%zobN|DwMcng|>nY^0361~X?oymU7`}@4hw*fqFkmt+1&R`ZVuj&^9ai1+Y z`%C6=c4nePr~BfWzr)KgJ97{N&Gf<g1)KcCaMC24wL-UXKF_Dhv$T=J%klcf6@)EI z?`l<FD7KPf60a})LtW4aEmRC&dT0E7n|^PPzh~-(K8U~H>V_dq7a}A;D>L6D#uMQ^ zjgYtz=?{O@AMEr6iFAQ41?=>Xs95L!bGP)@6X`M&$^6$P>Up+XdJ*XiC{K4VC;<G9 zJPRZQfG6n}mjYl9{Q@L@r;D9w7aN?+=?wPg#m?ypp2W++);Iufq?o|3K~k99b9sJA ze{}{==jB=b;tKZR<x%~T78uD(y)I(ZikC++Cnx!ZI^kivDEeic@Eg0hQF}TG`ex+e z8ecs66NN8_-J!OuMBxi`f;&<8OcIugRHnj-`BdXZqP(z6l<#U$Lxg|nWFeBUM<=8O zR`9Y!UJBqIKNbFjgy-~E+TW_PKawc_rcS7{%Nw<?kg&8T?W<5gy8n~;df8}N`zPE4 z^^H~UX+~`;@5(<sI+hJeuQ$FwoT%+BGQ_ql6<gPo@mwU|nUA65Jy+*-s>wM+zqr)o z7<MheK1$e*#$@bj{heu-m-Ts)U0&Z<slRV%*7XnP`)l$n=yd@vjrzr<mibHiB`uhx z^kC7jKwjcSL}zO#FSDzW#k|0-#t8j`93<Rrf6V9kHv41H!^=(j#T7i2mkIhME!b<R zc=|`r)ivK@7nb$@eY>y`sv`&VP$s`o$XIf{D)W)0!mLZMxnBC$rsL{BP=H&X-qUW{ zsFnC<B<ycegJ-5bAwgYiN$N*BmH8YhY(;(g+lg#vlb}?Xq&6qA{a9yvA(8Dm$#x!p zlrL8FDvd<9>+hghoyb!4={F>5n64Ab5;ati5S0*SdbmxgRN~<l<9?$24{I?(8Pd>a zAW_nOSL+*9d>^*hN%_0vTC)rncZK)W{94V*%u?(j{IieHnuA-|%U@pcM}$O9y!KdQ z%SD49+*B5Rc@>Frf^el*l(5*w;JTwFda<Pq-VCG6Z3hcUR6&ilTW1xi)7Zx)SW)vf zcet*J8lp>R1jBuzUG6CwBK|b!0Iltmw&zD$&BkX5wF(Cgmq$kav!-M8^gd=2JK!{S zKv8O0=h6ol8$W?!VXg418^3QwQ6NzBVRi6MuO1AisgB@_c1zZ;X`r-x1%m$ba3St$ zIq#I8<`3NdyjSU-%U`hO?#q^5N$)tRYPd!HZZj4%tHoq2*ig_?c?SABfm}Qss8ZkU zTago(7rU33tJ+>Bwkg3dR8tAePFy}f*9iyy3RBc&_5A{HX(k-zyWK+XE{rsKs>Ad& z)hu3d<7%cfy`YW^>sjgmK!KAuNrEMfzJq*YH@l<_+>k_jSC4M~UT4y}c^>|$%HA8J z9&OR1f;nUJcdBSa+Ej-nK2<CpKV5-SfJ}@z$?`Z^MC-BLs4pQX_hcs=;V(rCl$mfc z*=jut;Z}T&c#E2Cey$w~Jwd_z)#9OIgx2y*c}L;YfWPqe06a$tP7VVLCrp13b5Umc zk;mb6)Tj&34`dV$3b+e%g1=XNF}EaJ4*a_C?BEuXU9s&76R_`oN#d-*a(4@#<_-6( z=@??vyyV22qA9~`_T*A!4G3dgo7cG_nhi)nMWQ#-#q*3>v3-k|+DIw0r8Mo@OkGx* zDl5N8k7f)PO4nXUZUKe@gzamy)p`=pYxWN2PhjvPDk>}B%I`1Bj4{NqVAkVpoR{cX zY0Z&Smq_%PQe(_Y>DsK6Z10fXtt+*}Mnc~|isB{Colz7aR5{u`VxfSzW+{JbnlioS zXgAgNSt2wsUhO&Ev&zDZ*Q^Q<#=93Gy!-sEk(z#egwOK!w7fmsR7kAqYh3=*n*0OT zQI9`;1RY=v`Hiv`?r}txavtO?utoYWd!!!bT}2vz^d)PFXd&Z$`2$%>!`GsKDCUOl z(HSbRd1=k)jEtxc(CQ~qo2aK)qxw<!p-yPK6_o;d4u7jgC^LW8r1;Qe?)~LNL0svK z{!A)NZS`ytte+GzYvpT73)Xv$afEF5<U|iaQYEVSf(8YIW&jX9cvRsSH^{+%KwUR7 zFgeN@@)iGqDcih!Im&<FlmE(p;NN%+$UUNvE9r`O4J7|1>5-UlLy#nL`j-vE{)E<G z;f)m1RA~s3iV&tdUM2|%f6_Jl+TQdiHxn|8th1<J%5kQv9eE^4h);;NQ|Vu#J#8*J zl0peh#Ocyjb5plAAclJ;OY7EG>lQ{&(_0x2T3dC5izTQ!zn0s;7?&E94uWT`mzwm@ z2BK&YS@oo1>D^W_9i2WYwPkAtnN^6rRIyMGtDAnthMykKT@>m*9<Q8TBw@yQ`u}I+ zIjF|N1TmcWB-!Ih?=~JaRaY+rZ}oVdo!D(W&)x7}jOQr|CB}2I%+LGJs|MsW<r+SI zbz(#xtVCm(lx@mnD^)<QIf#$Rr|jixpzsz5r}MvMJ-3)cB{o(H!&GdwmOLR1srXT| z79<Ac`Wuh!ZLDrS?y=GclP<si;Mb0asPXS8F&c9Q>)NT3SD-`-)@ensd7>%UT4L_B zHm~AavfB9=yOnTb`_oeQTjSxA{-8l#VtyRM$$Y<cu%6zg>E1@isNU?iK9)pCpdLcI z_2uJ<AuRhl3W!8=g?}Yr=Y3Y~S<;6Uq{n{c57$3J$t8t=#BaVOr@@AAuXR$~Q@Ay7 znMPUmW$Rxr$WXRgw=D10?JwD{qNQ}kI^*nk%_<~0raLc`4sa}^J^SQpD$Uqfbkk+s zK)O&Wc@Dak%5UhYMBnj>K)$=mgNQB-*K(qOE1-3@poCswAS>4zp)T5O?K+~m3(B1R zgYJyYQPY%4FF+m9uc!z(d&NAXL(`7jeAH@R=w+>XV|9K%(dfD64rT7pZv8^H32d#$ z8BuZxT2GLjs}Pd(<SU(UC<BM6oZD*tLml}=Q3J={W#*$$!}z=4ZFE%PT~J@^tCsix zw7^SitbkQQW5pE9DHVp)1j#ku78dvmPz{4A7FU^3vX?ty0{yrVqEDc&VrObP`b^I= zF(`1bbjJT#@MMoQK$u8#j}Wj=#<9f;-$TZ`-$CotxP-=0yq~|CRlFHyCxBVze(P~W z5jnqtezREYSg1!SyqLDedAjr-)<&#J+WOsSh1%%Paj9P@O!~-+!5xBETbB*6=U`+; z;2{bNskr1)u-ue_^TBt8793|u$X)rm>LFPi_!BHszp^F=K0|@0B=I#lkTY9j56R2l zm#Mmq&@hVHb^qWeQcG*}=c=|n*69OOfhdf#s`b^=^*ak$z5f95T=Ey&?|-|1cR^Ho z^ghTgJ!%s@zd8)HUR%K;=u2Lk-)25hZ7NgLgv)L=lO`z1I-H5_T1CiwPjE>q@~Bbm zi(($E@F{;^bP+WQy;Jza`_u7v!6)7yjK2#$@gB0@)z+r=0UhpuK+Zd}YdX`3uMn8T zv=)gdwcT2|odM|8H_qHa$HWMCnqCM(u>T_aw_yHPwlr{WSfX&SHO5_v*13s<dBGQ` zsd22r2i!`xK!0QPNp=E#NlzqzQ)0Psv4@)>#1$K*@F|78xIc5Z+!fK*6J@I;24kPw zf{C5q9C4YC$nzHulfS22B7ge~<!{{opgp}WZ=z>tPtW8@r1|#rUOb70pgrBqljuw0 z`2kOcH5zN?h9<R4xa`ZCin?V9@MI%JE{b>5<{u>gsonDr`-c3e`o9zp2$=@!PO)7_ z_Q8*BtL0*`<Tr^g_NdZgZv$B92&6BpE~@{77zk}O(+^Z}D0i6c3W@qewH<MO)lQ*x zB&37ss)N~bJxh{*ip%d@PY%*4`CT=hTgLIaM<NR6z))uSFssQFhtv%5m|fY=Uw-ku zG^bito)muPZmU|i{R5)+NQbYYZFKHe+Chkm^=qMzm;j#OGK`0^Fkj3GE+n)`W?JRN z-sNtF6gys|Fv*iS^DNuAd#hEU$_78eoS|k#Zi;nFam07NBevtK`iTF0Jj*JN9?wFS zIG~G<2hW?-@%&uB9(z1a8ILTrV~^(&RrcGAN9g?;S)>sC6nk}+r%-!#FCDMZ56Slu z$eoKAO#<Y<5%l^9xx{>BinGi6>P%Ls>iKL~Vzwn)6i12p_zPLVPV#oo5Q#-NOkxoh z0c1b6;*|C-kx8+jp2Q1NIL_f`OPDWQ0=YV{q~?GdNhE9fxsl>5P$aA14f8ds$udT5 zNxOLJEN$7m-KvnCUkIvH3Nn4_RqAUMl~IKkETI9ZHP(<=KAOLuRA#Q6AY+O2{v$m> z^}u@CPHs`)v<D_dMyC-!%zW4IcW^;n!B(F!_AO!xRTg44iM7r=Z#Y9Np#HrfxYtBa z)#UaSycv8=*0IE#Al_C=`|4^q75_xHeK8T6X*p6jY;9Mv;r<+f=kGHXJ83rV$XH=Q zvzlE}_b17^wLHiC>it}w_ry2zFXEf|urX$vK&`i)3N&q;0F64VF!O9pb(l*g^lL(O zOIf$MLzgz+h1!A#OjU-pR#jrQ1eOAM>^YgwMS4CnrWfh?%&1^-_C6^v2Apx%`8<YE zAMhA)$2!^Z{{=1MLP?LoVbc(lE<C9~ebQ`(o@Mi0#X1T4-AI$M{{cZV(k{N@9&xwX zgHf3u?n1~M6|+CLl0`0W(DR>)|H__rTRs~#>{|-@&)(SqcVi6@DGLjkCxz8vjIGuJ zOe{Eq3k(kH)Nr5kzc&DD!8x9V<k8WHmO=P@!V9#Z17)>;k5C}oQy_M<tE3|AXxH#7 zcC;JS?|jcT^}EPpso&+Ez5F5!OD9_GmZXjOyz4e}(AEjw;_);jT=q4pEhCh}>Y{|? z3@=xmvWB0`D8!$$-3SF(F)0;3ttylQBwgW6<E|YgJ<rfRKOWmE$ue=YcjUfSj>xt` zfcz1BHAyt;AM`xSuOG9s@$yUhgZBG%_WL~heTw})$9|v6FDI=BM+Q!+KImQO3>+_S zqlw_d{nY+P62M(k2ynx5R!IGN>Jz~I5i=ncMa8fq(v@evWtFqPzRHvAD)%r-Y(`|{ z`Rg$AFB}=jEcCwU4D`xhS4byYYFfC*s3p<Mi@v@}vCENOK1P+&OI7E$82E?7zjola z+f|lIFY&RZm;Unfu`~2ugCAL&Rmv`}O!)?qrzAWsb4++NA$3HzEVKJdW|xv`vdYu5 zQcD`~k}*-w>5|#Wl0~|tn%464P194_T#vh#YV(C;$=qbg9=fDLfb#SwQ%gP?FF8F~ zatM9JHd1=~I<w*pUz=IGuCiRlQ5qhHs-!eLJ$Foa9QjbD_p0y~j2?DZdIf63VZ|i4 zQWJQ;DD_=3bSt3(1+{PqZB=H~3kWhs?Ipl%Un{4_=krinK0T|Eu3_JkWv?U{@mEQ( zF#tGaaecU6LSx5`lr?GnuA|#Zdn|#$-IlKPIErvsnkuT2EX-u+?i8q2U7<+G6f~q+ z!gU#Qe^0wCcxmF#e!Xcm2Z~C=ql;<|j9qp<UyYKr+*;<AB(Z~V*I3@d?@m8Y>#6rX zh48zG=zoetklPV`gQ*c`=708KOC8S(C8v1X+-|ImM^BAEOp8CvP!CFWlVcd~@X=Yu z9L%wl3X(P<xotQiSrZ{UDF9N#X8!!kMvf~}5c(Vl2`#NDEx(rdc%%Ke?~L!HzD#58 z%XG{and&SJSK<6EfyAKfpIAlINm35aC|$FyA^JU6zvoyv`h5r=CC$o|_nN9~ECZTJ z!?T41Ny)+bD?>l#@+hXp|BJnMfseAd_y3<<fEZ&oYSd_{t~QZ?1QI}-AeUWo+hBkQ zAq1s`kPAr-NlbPjc!A(1oUCDi(<%pBYduy^b6RUX)k<nLaucGpig?3Y!7EP;71WBU z2>XA3=XsvZCIrQ{r~kgruTl2%%*=PbGxMGM%y(v_j5#x2+ORU+DrMAhDQ2#)Eofg< z?21H(y<*xf8NOghH4NCHltI~fY1M1lzS=nNJCU}Q|Axf5YZzrm>kg;*vf&&#nswVn z&eq8IZW;OnMQk}$iW9a2#N2&bC~+`9EMIk|FC$O7Io{sKIY=DjYWZqZ(O@M-&F{=S za-mp!7_GiX3un&ARGCE)L*K5+PAc+zd-Z!MsiI~l77SNpz1Zb0acvUK*9Y^3<_*-C zg#}##Zo%6Du3}S^{>Rq5m`Rb#U(Dm&Z?kXHc_Bqny6Y|a`Ikb0zMrsW&I~7gjaaq3 z?)j}5y?nai{WGk7D!*U`Q<_6Fe24Wjh?bP1agu;00+%sF!pBUfM!;XqD|uQ*e<Z0d z2vMHA6#hZh&54~-JyoiW>X|*$nJ-mr))9mISli~?6p<B5XDZx97kZz5?Eu!l#~ft6 zHnDv`%}<&+R^qPT`-$orS{`ISI7p5z^MIISItvteHhOT9&WUvELSsclzduvc<c_4y zIYxSo+mUuA_D}B>{UhZb5UDw{3RIo6nUOlcm>?LbwTZ0*$g^h7oh@nDkDSTbmg5w4 zlbk#;M3^%pOR=mrBi=8AmZP29d3$IEoiiZ9Etm(goaxG(A;F$M7|TRqc~>aQZS0O% z#Y*yg+#oFTvt}ulJO4aLF?#+GEPoctvUUK=eV7NvGN-suv1}NO<w{}sU?|Js16Z!@ z&r%wZN3B9&AB^Q?!t%GFET6ihf5J2Rvy{H<(b?HWs$Bhn96zD{?EMgy+d^3`8^H2? z%pnO^v9ws;Fc`}gVfp(|mfsq{@(2A{s#wm<&(4(`A2Arqal-P&P?ozd?w@dn3SzBl zSpJ$zhFzECC%Rl59ny!=Im%Q(nkd%hWC<<;spk0>7I&XX6K~2wM(NFcl|_lgsw@wY zPtpvEl1&JCQy;lXa-mtbnoaV1`;*_)N3OVA<a14O59C=)F@&z|HWeAE19!XVP?>Q^ zXpC*8LTCAUY>zz4jp<u^5}4Olqi)F5vC{X#>bC=wkgYv&G~)~SXUDpZYbnrFu7h@K zcih$w<FIqv9(iN+TSAMW(YinYZ&`_DJpG5|O-v*!ZI8&V0hZ~^`Kq(p@)O<iP;uGn z_f4<KguznKJ4B+`7lV$?K4=;V?Iv!|U`=8X|57`3R>xqH0NW@UUg@r8F(!NSB2GT3 zhFEDeed78BZE}|HUggR#CytcT(X&oK;vFQOkYVj6h+<|gU%&&aM&E6Ty?pxCCjJ@V zN*CNTkyTdWO)1qZ$YPGfte=4bmk4x2mK20nJ2l1wk5*9#^$01yS&0kaUP&AXU{RLu z{(<r63$yx5!mR5T<{iTcQ)b!+tX5xzsKVCQQs(8jn&hzb&ql;pPJOF$CDEeqdz3?d zq3z%(MAkinLaWvbq-R@3$}HBMi<B?v*;Wtm_z~vr_n3cBe5G4swEFUOA*0pjr>eHZ z);t;-+at|te#o3@u=x`)eoR=%8g_GHs)|5!;-ku{IWgTdcbH~}X@0~sy97(Ox!NAy zAzt<Wc*v+*4>6`Zh1sBlYI$8?dX+a#PGQy;>h)sN>tr+3ubAD1dVT-bMufw~>l160 zENoBQW(dF>$z+Lxq?nK9L=i=2hSA!QsqaadFvm>Nxy_|qc0bHuh#{4nt(MUhWSt>o z46XDrLe|cxrr&yqu^(+7`!#OlNMJWq78Z^<)SQPlPcG`&r9V!iOWBayE5ga{8SML9 zO2YK_z9I2pcjb*?%0r&42)R!;cjaFpSapv2gw=fBC*w76=Unty%q#m@kc(qA_@*i; zS(N!a|AZ^@SqyHNEF$wPlZBla*+Q81KVso77mFydNHZ)7X?0@Q^~u*CBvQUNQM}@A z7l-YUm*i?_hkJtWHED%7rvKd54_J1@<x_6AL8)i^6K^6m{rvN($t;j@kZU-{NLy-X zKUigh)LJMGQBhFqhyRvNSG3_i8F0$_eft$(v3@_VKYinu(93!{D|WnS;QNEIq)yJz zb*r-*vZl_&kOCliaP=f5p)9pren`LMK_#EdUEZE1S^tjryyWyA3txHp@1*DGi8c0% zI3$*p(c@-LrKa0|`jz6*O?uU}O2*R$a*>$fzVrccH||;vdGFB{ymdKvUYKa61w?tT zm(cW=oYDq2C+^3f^hF=_Twgw?Gn%Lnb*?Yd&qm5J6_yEwsDb=W+$uH%Q`c~%irGT7 zt9D4wQW13*Na|KUrhEuT&vVk!zbO7Cm2&^~`y!ij4DyRfuJ>p(@6pqle+YrNz4}YV zdAMp1xrvLFH{}v~>Q$P@cd<3%URqmUV8vY~M;y79vN?`#gTTJLWVS`1XDC<qeUg4% zc*vg6qe9YiR)4!tzIwRwW@~2qkS_f(<+W2T<#w(<w3e}gbL*jqEGF*P1gLsyE6vtS zZ4Ee&><sgq<Mh6d2Ix^j+7-bXnWi?^X}I_EEi$EiOq57N121z)Vd^-VBRT|;OvG)9 zHe;J@&HEDC>MsH|Ru|U4ih--xI=i3|P0F@!Q#<@?6W_orcg6jhY9Jl*0ey9XoFaT! z<&D4SiKfrbUcOLGPk8e4h5i4XtwnJ;kE8jByV=#2>EIDs*{N}~PGIdhbCE0}fR!fJ znb>IHRjyBLam^~sPi&*NRQMvV?xuVMI%NffX{!{Vl%96dE19O!yLzVxO&^_Mq<RR3 zw#+yLu<msPP5Xlky2T%%CdeX@y&@wsy@7MJncQ*lzAK`^E>gSy7s`M0lLn=IP|9SX zyv3yakwKZv<tmYp19_$jWwD}kdpNh0Dpc`(R1%pAr*~4M=1CEZ*SL|qEz@q=ozHi& z`F)1dpSvY1L$|GsCP7XV#_~`!%*wcq1(jZQR*gi^upiP7{M-=2nTSk!`d5z9EriSN ztC10MPCm<58sGg0cEJslCK5uHTl!0b_7{JkP?`I>s=xRX3rc2xv4=)4*kAnS9J9Z; zKTLV(-(URfyp#49-Pg^g6!yPQ>agr*sdrsP>qrzl^lXWTZ+iy`l!XLtkdlr5eM%`r zFq_CwO6e*LB^+t**lBfe{{aK30sOzDe|(eT6q?@04T(zs_%;<InBFJj&GbITa1;;y z)4TcHlcrbNQ}g*wbV-!<YgAiKJkQujpGmLzgq$g6k4O{-^AjB-KTt;*SqAZbKFQaE zO5iK>Nav=ip_!_ES!i-N+t^$4ZlA=~>!ggmtG1v)q(tQjM<{GoSsfh>e=z%-CHqzW z_m}r$RCxU*<QXb&uK!l@o{T(b8P#pz&(qDFAalu#4y*s`c^iFSu1u7s+gXH~N$?>b z`jJY8+WOMVr63>BZ%-jSVZMq`ZR<r5*wCFmpihS+Ex?$_iOQoAHP_YLr=q@3pKLXj z>=YaK$V&u9^w}o6>rn!hT}!)cX~^3O&Rsd8`w0%kq&-f{ff$&JNO_USB#cM8qW^7c zPR7xDbP8K75P6SYxxv=Fo-aM=Y~rFcz^UH_N!lV#p=u6x+!J};;CJMf=+qSSLbQ5^ zB((qI8P2wutPU=7c#qEPFxGgvMcq~UJU3pnMxN{R&5ZAMBMXU-92Nd4AxgZOXwJR8 z(e68$;d?$z`;#i)EVnBOmWrcXLjEm@a_=Pf0&njW-ZQxZAGYQSsPM)4q~>c)5917O z9zE?(-9xc6#t%-80WwfxRge2fOo|>T-lYwa@SLr~c+grof0U-8<2i`)lhQ=(%toj? zhtc99ZT+4z8LjPd`f>`K6mUsyUTIN0kqGPM-aYO}pMqPV-g6f7?$V+H*~@1)V5LKU z6&qoZtS^Lxvu$O8Gh!tw4$KeaGVIboUIbJR1*tL=RZ+Y%qNpH@HQpSD(^nMlD%~T^ zo)MRgUsx>H@}*W*5s|H#qJ>1sUe*JM5*G%@U|X)!WHU2WR7Uh0scO=zFCZ7K5+v&a z1<H(%&Q3K@loN_u<v!MJdNC35_6{-b=aW&r(01C%Mg0tkHNzrxWrgXYN1-GoU9Kve zzM+5Z(nf+>+PF-TDh*Ojl&!gz_FjfY!db?$f6|8&f$sCLHrs)a_J5G~Q=XlGe?zV3 zBAG6XVL5^dCK^32P&nl9F3%F&OviuT;MzTm*AD2LI0vOB6YJ@h6uayw_j76_w@YtB zSUuZ<8a)h!X^vjter{8pahHAvIl$SDYdOcsxRl8}ZCDm#LG=rL-+kihl78c!c)e77 zLHsB=8}NLuEhh0RH~D3EI#O=DPTSL(87ZbAt(ijvhqh)86&%)@$>~I<Lamw1H?k5> zYt1}OFuFA}TJZGN%+qCRA-A2I^~rkMn&&uVZs9^dVm!lrnhE3m7U~+uS!41u-s9ag zQN}o=C#zB!@VwL4bZ?hWYr=9u`pI3g_Y*^h)k^<ZNq=vok$x^y<0iC6UgSEnu-)9l z&E`xZ7lK;m%y6+F$w7-qu^`QcMcN*QO+)*q>}#bjDl~m;bV>XA_0y+XYBPP_F`?<R z%MoF+Ekbf3tThwW3KG~#y1<Cm%-|jH!MDc0JU=2s<J<T(;_EW+>Q{<4c|K|j`Z=OM zw_lZN6o66H=~GaUCWd0+lG~r7q!WtMzbCzhRNx)%3EYYNCV5N4b90z}wdJtWoyRk4 za;<}8ywtE|(tT#|s`iua$*SX*k<eG@?-=<fz8gQ|?FG^p=;<P0_he~jqta-3V;+<E zePz9&%E$v<l;K03r&Y|18(@|G$7qS!leQLl<$!BV+&9e<l`Iz%@~G+lNq>^m&GIk! zB|3*(r98_Ylbk>D5Xvyov;6T?t#EnxtJV4WH1c;;tMjN}c&qaZ!RS`!F-d0}-xstx zkBc1`5In1u5)e629&c!MigFE+`_S_%N$ssiWN`MGehbJ=w0l&?7Hm(H!YtZTF8>YO z5@zY%kay~uHcRP-GvA-;TVbGDvnM^5m_iR-4>>`t^)1OUW3aJH-*K6lV>><D)Apzn z0Vt&0b%zM)h?_+KqCd*nnsqxHlH0=aGd}ika{DbrWO86W0*Abeot|dAtM!7C6Frmi z!98aio^36eWQ)bXej)?pKRAO(i$Qn@gMFJ$h&~n1WFQlj*iV(rUr;h{lDzMe_f2PU zCFPe2ya3-{Ti`PGl&)*es6K(i#27+yY;JSb49#lhDts6yEXeyK&wFWmvW!KNN|KdD zlZ|ph)?5v>gshi>xxz_*l`BRthxCIZRj$}tWSAvcdG%L>VdUKqf(Ydwl>5P+;ijTT z+Uxqh|DcYpv$E@XOanr%u|j_n2}|hCQwsgx;1n9Vdh|rf+`*n0E40!RL({C#YQI)! z=MM;te#IyvA)$S`k=&xdy!o*zFpRcC^r4OUo2l<;&J&O6;XhVWlY~L4A{|%4_SIL) z8%3V|F1c3-)_d+0dN;51Hqi2--({G$VCJ02A^q2e`9aKaV!p>P-;J5U=pp_4hM5~( z8q_5G7Q@_xdAPXOE3>V+nu36xUF^PV+7&Ci8xw=q;YdTSKR5zPb^m<2;U`)Aj57Ts z8g`?_?p)I@&ag`ryKvKv@t=e@LF_*Kky;pN*0GZ{A@BBdb8+!S)8$!QSXYoS2uJk3 zILot-Hn9`Skntg17YcQ0TxStHPP6)8htw-StuKuw*L>}e9!Q2S2jtvC5e#IKlBPz5 zyaFJ^Y-8OGil$t<LNpD;e)SIFWsaBV7e=$?GMp|bojE|f>@7L;p;8=V9QvgDmsq4D zByVrnvZ!5rs}|LNW1=qg!G&wwC$=+rJBFSi#(CsP8Wk=!!J16UW^sUtA|I?talI-Z zbdoaC_hsAV1L<TZ%ZG!HRQYi6kuDzvd^qHzm=BkHEaHP{OP1^pWf#jw9UqJ2qmhqF z7yA!Ql0aW}oqV?%-;K7GU-CuNIC`xSdoCl7bYJE2KE45K&Fv)VC_+hBHS1E9eJvxP zLMWqMZNCv3aeC3%JGM2S9&~FFH<|Mg0f)43tH=eIWf{!EVMd;~6A=svd0g^Dww09p zxDjL=x24Kmz|CA`B6W|+!qnT)A(G`zxFi@{9#eO!diK#$$FOF{vO3xdTRE9I<Q6{* zE#CX#YP<En_(d}`o$2W7d=mF~;@-rk#J$Vd@VB)vpy63Hm?s;|7aGiOIgxo1%p2-& zsFR`rClRG^y33S8O9z~~bEysb@9iub?hdZqAG}Zsg%Yj4;Y0e5T}n*&*VG-KDwgi6 z2gI=AFR+^ry8+={ctpw2)*>?MeubX_9)C>Ix{1L+`};n_UR0E%i#x2=w~X`HNO}H+ zlo4Z+b++_WzAuDqpG>l9Bu_#Q45^kZI9cMupL<-5@Tm^VqkNNZKAZcl_V{))MQD~Z z%KJqG_d@7=%6AD&Pd1-oFv@!_r!eG$Ba6bmcxDwjk&nvEizzcRh@2rHlct=ZAQOn3 zVIY&HoG6e<Q_g81BfFevkV#X{>8b=`I9)#^M|r%xF~%cI@)C^9_Kbn5*&dzZ`2DY* zPf7aK`#zGozHtGQr_DLxeP)?GZO#dqFiF}s=L}U-FpEr`y<tp|I8;B!NLgh6lyRQw z6w}jh{v^G}sm`BNdL9|7P76Ixl2n{pWiFT#hRhiy=Y)eKEhoathzPxcA}o`~fzf6C z=hWu2fA#!H-unm`R|B9Xc)Jwgxp^$igi(;WZ9!h{nvkgHaJvZg!|3W|iR^4zv3&mo zHCf8@uME=@g+gXgD0g0rBd1tf<WZJHTk{ckw(-o&&Qp5+s_=2fdQ8$X_L*}VW7Z|T ztK%YB8jAmhi^T=jvsB>u{^388smup6{E-*9M(#7FGBFG>ogCL?E`y|<M_VJg&xTn{ zYb00TIFEs1eH^?541l<Y0aOrU`qFAlW?UJ6^gPTI%bEzta=~wD;$$Llxft&67RjKG z2A;6?i$|^-ma&GAtj1r@L*i+<>8Tb}GVR%EwI6E!swS<nw#777&0Pl`FG*)vgSC3H zh-VGyU+8D6Q3B!Uh;gBm939~h39Dr^VCh_SHt8(=770}4kY|_?=#y#;`jQ%9&s8IA zSH^3egX(aKu`=?<wJbCG_N6_=wo2%@oguj~aCc?A>ftpOHPw<KxuounZ>si=iy%Dz zL4fXDBN()beGKP=gHII<7rBd<WrTC`KxB6CPLJ^_mgylI4<Tc5;c*GUk}cfQOLdj8 zxEXHbmxQa{lRIhR1_}2MZ6}2L^WkQ=KcjmJ33uq1gu4bdUn{+HPYidQ74BHV6#-n# zF&qYy2U%?FJAc)`JgE~(6e{(6vO2V399R0f<;nMoKAzB6Gf^c;wrP00QP!(j|G8b0 zdL{WR#p%OfaXO%ny;WlRku@)8L_y)wtG;2D7gjA~7nJQrN=<^<4Z%+;rs9{M@qx)t z6@vr%AAO3U?3>E4N`@%kfLop{fc(2+B}*XG`K;T+Ps-$u6Pdhxfnwq*NZS)+5OGol z#V0bj-DJQK8tz|yPi4$cRX!ciS720P>;89a2H79drT#ODFb<(gkAgCQ9{&9=pKmb- zQS+?V{$0(p_F|^-KBPZwn7c5mdDf$bxdU^Yxc}TRw_{fGtREWYO_&MykbbLSZpEzT zSvM%NaTo?WyU<jac8jQbT&6r=p4EE3^ltLbmqWQXB#WPMrk~M<otkG|Xxb$hcBw)a zZQ4Z|c50q=WP>r!I*b7O&$HezU0%lJgn8D^6XoqJl$S*Q%rVbnbG)mP!`gCVcI8Gj zQFe9>lld#>Rb2k~+f^Ixk9636H80ZpL6bl77T>%CU#>kOcer=*^3yKXB7C_M+(nGg zhkU%6sbvc#y-o9FBMEhdKl;OJGBC<JIZvqFQ@uAQhq<qBo6A+|!GZchMy*U4Y%MDZ zUlkE`Go)~>Yk;fNAH}t&U3t&x?|loSXqj<5*)}&OWYB(oud?>!_S|2wp}!9~Khfjw zZ};?3>^l0hIAYEqnwO9XZF6NxU`>opx193DDLa+j%3-uZvd(2rdVDCq1lQv98_$#4 z&J!p!U(#GrQK$o1*8W1@c-<`bT)|*$N&i}!iI6R6_C(b(oM_@(Tci(A(gxiky&VT7 zP_{_>{c+nSBb}q}Tvyvv<4K^`I3%uaKUEI|J!6>S47X0hlwg=16qCG|{4+kxdMvN5 zO6g$_T!F>^JXhN)lgSFp+x}0F1x`jk0(!d<Or8-aSGNY-L-Z>x-{bhG*f7vP``sKn zHTHfvo2X9SI1A-za<w5QBRV}wSf~|mULqu_uF@Vgj+U#NsBqo;O=m`}&F|r^uK)VL z*zI7xwBlUJL0Z_SaBF#eWl|pFG0t|XTpaYEC4;B~ydWrB#a~#=nVh&+D$ae2v==GP z+dUORxu=gZ&RsZw^3!uvDe_Db%Jx3W1ox-`l)pDA&tfEmn%m)!t$EsJ**5+Q9cB-U zifRv8de5F0`})thoe88;u2JI^Jn3VU1b6OJBC<9ASZo;cZjNZXDr9z&t=TrqUWl=q z<9oWommO}rg~NNV>g8A4=9|NL1+4$;uXu`Laer<orzk8Lm0BA`*}Sux853fT!5kZ6 zj@9olBF8dFoSTb}cF+sxoSh|Wnfz8u`a;fUtFA@{n!Rd*Dat8au}W+BXdFp17b_0v zE%9bU+Z*Q|Za(S4nvQkGl~9t6T{2Nz>XK%5b8)z<t&tw4TQOm%AlINyh7Yyhqk57! zc7a{~x?xJc$mM;%SAQ1gp1W1PysK|zUcRB{`~B;aXgU5_GDGr#m)6^6g$Qe?Z8P^U zhDbeUfYb+(c&<piD1-_7xSMlBB%XuBb3-JagT!-VUH+BqgIKwe6KmT%hx9hY>DPX8 zjKt3g?~MDeX`26<^Ze5|)x-{bukW?|umdBvu}`jl8yfR=;o!x;W-?X!=DPef7tP_Z z3g6LFSQ+r0%LQP*96FL&Wc5GlVXs+aZBf*zM6W206MkPwh)@$GC%CmTC{<Pla+#O~ z%@<%E9%AM@_rlhk3vHX{(IqWcLy_0H){`nRoIJRI3`s`IV2GwaY1qPG&Ty48VcY!I zT<V{8(Fu9;BPfjrJ1Ec&ZEk1kVD%rJH(F3zb0JMa8)~|ovCEG9$}~#dMr$t8mrZ6} z^$*OftH`Xmr<7T9<Jzt|mCVYN%$ggLS=nS(W=LjbBWrTO%)He%Yw|c9?I2c}7q(_! z=sD|)C(fsenD6+=gMBjml=ZpS5N@#9qM;nF?-VOpvdgwJn%{i$1^UB5n`DouW8!Zs z;~betH<4j<zs7pppzT|_v~L$d6>Q(`vsvxiMZxxs73zLZR;m6?+Bcmxl=h7x*GQ4; z*S>uRKGMETV#2&2@q#?2;54QNiE95$cccAdfpS3mhjUMp+5UaR;A}&8ZU6C+Xms`6 z3KFHuC`$F^th-#x3|#s{c{jo8-+zxCaq$dqD`0l8Pk#fZN|G!*%Y_(eyh5SRdlB)r zHM%Ir#vmhydz^S6z+sru4bvjSG|Dhl8m8ffsm?IP8m30Wq+ufLn}_GMvE09_MYbK} z&*f{84T-#6*>*Ad9>1Gk(NWrZAYAY1ITmPBHXI6u@<H5M0xQ`Z7|)e_XH5Dwapo*G z`W5H0arm)q)RvEJ-`)B#NBBN*+Rltbp?O<)#$P=9@=9+?j8tP5-_7y*OFWd|D!rK! zmhCb!9pzOF4%e<s>F6~5A(O%^64{IN{~Tabsju(jQm5$jo5jYL-Po2bDus3OE|aS* z8|~XD4Mh7^A=<YJ(Y{saV6!>OI9PlUi>}=9WTz&ezRK=Mb|X(UMYqOB8RIE5N?F8> zj0)rN+H6;a4;2NqKoype9lz=}q>JhRzlDi06&WwvHb1St>9Ka&a<;NvQqh8>KDIUg zoFw9ul^9z=v$eU)xK20Y*_+&k+3hy#jc*1+E#9AGR4-H4$)FUQmst1@)=5!n-)_cs zkr~_WIZ_af6x3OEQ~T^HEj#wH11eTedw$S1Bc43$X)`e6S({(Z3iRwZV#*_nEZ~{( zZ7C3!mnCkm5*Jl1Fi`EE#wbz!zE~GS)o*<7o4hQY=fe@E(H^u7spx0+28NpVtw-^~ z6!!~1`7^n1{b}{PMg6|0eh;eO=j7MO8RM6S;(t2?;XWZgxC4fEOda5~scU-Ex4ExT z*Hu3uObl0{4!TY<JPTXHRTj~Lt{18cm!FWJ4ObN9g07xOt~K89gv3!XQ53fCZ{xDc z<lVN;E$mR7|CINwq1MgPMtnoodkuZq)dx4hR4$?899e>`bsat0$1dBbogdrg4|&-m z%e*KG@(%IGw&Ee{#^VU?#QtO3=)JDeqxwXeLzaDAZ9`JARgbh~v$oa2ab@kdACVuO z{3C}x%VT4ZhjGt>ils632H8zq1QC}evZrT#)X9fv^AILC;ouY{RxU2Uynhp#vOOOh z3#c1cd!nU(_U#?H+qaD!xMbFhQaIF<AEt|5Pr5j?Y~jmcTPL@u$|CV+`gaZ-W3t%B z6PoTPO>LgfbQhMgii%o3XFu3nT|$zw{H4+UIj7@kM(Mi@+A>=sM{}D6i$J6Nb7J_y z&M=%2V#thjZJO3PI@zCT+xn*{>pL#w`%J#Q+s|@s;!R+oRPvKOOcq-b*qfEy;P_w2 zG)3(wee8N(_r4wGI&HUP4sBlXmhNj9XLH}**1y=bN7L}8nxrQRD95Na>-7k#=Ycs) zht*&?uI-%a%agR0Jszc3cI|fW=izEb>^ZE4PHn5A<gJt_U7n9YK#We94erx_cbWu3 zD<h-yefnsOJT>^3RiDhID&`HwdbPZ$m=MLF=$zvdcmcw9i~#9K?@Z*h0xjJAiBX_z zNymwK^$wxkuHK&1pFf?DcmW#S?;J`D$K!sdSbU(KX`|!i-sT~$w$@E4rE)gw5^_zg z3`m#!<a^Q%_vx$q^GE{ftv5+JUNze4l5U~dr+1UP(qODsN$FllSbg(7=R9@1Bu^&M zs;?C-!p1BHni0+;TO!@uxRZOj?U8xWX!iN@!`boP66OA;t8{C=KZXZPpH?bV+rqf{ z>{DM?*2pe@OdKR}UqRw`hC99c!ylCrF15iyZmJKLeAu$PSmY9o<*gjA!MQ*=`y+>m zP<)YzzQdhT(MERtR;mhRK1z>7AW}cL+Vc8}$F;CdwezihCGF*^((dSq^64Y@(sNOh zx66eg2lB)AE8T3dM+XO9c3pq>Sm3e+iFVQ6U>VOdN+j-m2WggW&*OSs?~X>Mgdrt1 zjHrI<^nKWK8<a#{FM_z|6*ZowNHBeq<5w(b9C2Sl0oFdF0FNf-MgeZ60P7D+oir~~ z^~-%qJY*!TpCXZ5{A7rf7T)_j&I#7+v^}cLxtpSqSL(YLP|6XzTp3R>u)NgCVl=l& z+4H<x?N0CKLp-nT8gk9JBoQMM`W?x}4B6@ZAj}<uoUyqUE9vB<@XA9;QZx2T&7dYw zNOukS2HvHy*1snwFu2!qvl<^tsZqDDqkc*%S09uUu2w?NJ91(|fB$|kp~fwpTmu<! zH|CY@kX3DYpimWiGP<p`!zlU5<cB&vBKhzm8AKYp*%wI;?$hs(W<gyo$%{W?M%x_C zVNZ+`y%V@cuDp{puHK<y*4NS)^LO)93imw*`Fh&PLUoB0J!|(bRKd!!*6SphM@eQB z-G=0^tnD8csS>riw@Dg>=EAfskJ`VtMC<I8)Zp+lih~rSJso0ARKzz+6ztEcrl9-C zTgNQ@BeQ?<9XD2Ad~fT2fvvhjFOoW*>f3ELnnwJIit5io=%2Fa&z4p;ZBLSR*gQR8 zyKP&accXtC#J_KF|4k(Ll>F!6pF!7cTg-@>hy9H4h^%+&=K9NVqcP=?P-z=|N98D< zG@B~rD9Y;r#KKbNW$GM?G^!hfkVbVAD2?jfV&>IJz#OGWesocx5Ib$=hcJK<@0Ti` z`U8rg`&UBsY>=vJ09C6&#r>YIb-oy+x@Q2@VnxLxb+kl6`FfDDaR6nyNqM<Rxj#rb za{y(mL8%ncyXhVR8yFaTq4Z$BuqAKh9I1M~W?mSr@oBqhmcy-&2=%cYZL!=4mw#Ts z(aKh+9=7#(6t|XpKKg{xLIyG@W<BW{+MvR*Nj!a9#P3}0GoRzyHPo?`qDk5I*<8EA z9oH@4*4xNL_Yk!r-zio9303{C<S0gGfbvVL;PMTLfrHBzq2IfM)!AJHz__S)3}<n9 zeL5~p9$Oj;g$h~aBE4#xE6$%2=G_(Ud-$v@!l~ey?P%}L@LkPkWf2EhbA0|R7cN=8 zElw8rKilgK+>EQsbVcPMI^1^G7N$Ot+`~E4>Fqsz<^8U(=P_L8RKfUjB>*^wxk_KD z*ySYZ{0=30n|u>mBz3zYTO`GjCVx)2cW30T$lEOoAD^MYSNM1V*1I)|XxP@v{vII? zS@|Pn{Dl|?4>L@K8TNMwQ?9=^!aPY(bm=6Ig7`Nl?{x$+Xi!dWF+-F*CQMMge*4!3 z#c)hXa+O;J^OFH7vVu`5Vh`+Z4(1Fa7_<CSF#JUkRx*rYL1O$1C%86=2vzE6PWqP; z>52Wh;SfZtc*TTqSnFoxBUbr{3)6h@q2<c(5#cWyil?&_O}xkq6N~=*CJgQ)(qD8M zuIv)=JKXefq4JN;%wS;*@fXEFdx@e!iBpAfDJd8vK12OQHUv6|%P@ZtV|3F6cFD-3 z=p3_>7>S9(dX$P6V;8>VfP|zcRoRUjJUyrRixQxjpkjB0=_6g4CJvsSXn)Z+@G(ho zonrcMC?8yLJXqXM_ZMA=k1XYbs-j}$Qa+{+E{7O@(Z%@4SLv9k%JLvGIm2I+7?g=A z3Pv}Sgjj!3a?k}v1tP7{{YY$BbM%y7)=c>=GUHXOOxFyIm%%sAUz7^%0+o{Qnm!gO zABzXd*YI(szi0wJ%2Y@drjJVH<9mbqILlv@j*n_ZQ)Bw5Qzo9M?Jr*=jI;eklknkI zv07&OXjDFK2<8X`HzArL2OlfLtmf5V5MQxtbrXUUFRO3i!^qXu&6eF7^)Xo3=lF}V z@YHHi-rDDTt@^}q-AR3)>o0Oau)*^EeLkcQ!0tBn$;U=Mf~n}2h3EN;@*$A%m5TWf zl^5mvPRs7Dllo5Z7Zu?9Zj16BKFqN1<wJzI`oGl2VCg>JUsMP|I|M3hS<n*6o3uFH zkBtbtxL=$vz~uq#75fMIP`-byK2*#fw(K5JRD*^64S&%B*mPKwkM{X~OnJhw^Q69q z`->Jqutj;|W1FH>VejBm3hL^e%5Jc*zv(Y3gP;on74xSRrSkoZW%uk!eP8G=s>Jth zi*iq&?-$i4jxV3o_eK7q>QD*qRh0gsx_%P2!{aqvR6<05M}7PeFlxr?{d_9%zs<+s z_55OgksCJe;;d5nzWPw9)cI7tKj33<-<SA{8u5M5qLk|w%&-~h8@@kQc7sXyTmGV( z@cm~9RLqYkN)>i5pDOInmEB;z6a5>TaD>4ZiiQuF{+Pjo27_=uf{h6@bg?-2H#Qr7 z>1J{6C)OmWWLl)ck5(TlPIR?~A3EATmi@e5>fb2s0}SYf4F>eMd?*HVyZFQL+><gG z;om5Y2{iP|27?Rw7|;tFc67rhi9xb|qqH$Fuv^6R$NZ@nB&tswFIA3%iFKrZqclj+ z(D53f$%{!QgVB7dB#b#JgHisC(oVr3)nY)8tQeT#;Y2SCZ~sPVz4}S;G90h4{Lwob zF__4QnX&TBq2fM8IS!VD(f*Bh8#E4!!L&XGS?ZHu=%3*}7=sl5MrjzKq3<?gFujjK zzGX*ueG&#^{2QgcgaQ4r!C<!fP`N-iY&g;rpM=3!|3+z5VL&f!Fu10V!2&*2F3>Tb zgh8r*qqMo9jmRQJ?B6KuZa<l)5e%KW5lor&K^KmViZH#n5gr{mfBi)^1RH<uIR8d@ z0t-%b=f(#;I)91*ow~t*ew~lO7>xICl$IO@Zi@jOyv2Y%-f+BukAaz{Vz6er(3ZXc zgPRl$AN2l)uO{o`7VD##4<ceruOMB6SylK}i{e)6W3BbEPSKdNGYNFnWd8%wKde3` z)6i8m-#6FWlbEdzPgHYNedHl72H=f|U7ZR4t!}k){ponXnEzk6`&d9fP2734dRM2; zM4VNE<e>ZU=VTSJ3FekQljs+HW-M}XpOQLbo$L*Sxzlayc7<~YCBQw`(nom%5o$e* zm+pyF+Mn`Dcjbj~Fvwb33to)mAAY;ASCi@dwu`xUqWd?;1O5hCQ<Eum>FaskgJF6h zmaN9bsX28Pde!Wl#(%eBgSR`(`<H-wtSjT?hVi2CCztjnP6~5hG3mH_Vuc)O=nnH| zr8lJoDtt_}c7{Xlc^-0GbER5;;J)sMIir6q2G*ZeACh*wr+xJ<!HNw%cbynP*MJD> zn_<99=vL&2+JyP0*u00ryfAK_fpA<IA2qC3@so%WHQzSx+pChA2*|ufVoQ_fS?}j7 zxdKjP`S~ijKjM3Q`loF*@2u~6;KcZJNbub6j#4~V0m^+|Tuq=>zMquU;wboQ`q_tQ z=|rlB5UD=IjB!5O9tqjL-h7tQjOe2)K3}PnoBKs9nlND`1$)UySH@p#-UdESmI~=M zyriN_rJ@B&QekU;M*Olj({@#yvu%Rc*%p6`_royn@qqg$Sm*iUojs?U>u(v)Eo-xF z4#!z`a?Mmj>3Ofajx6#|Q%5n*?EWdMoaC2_UBfm1!8h?_7E3T(>@SBk-dFFGvi-U4 zSH#Ki2E8Y?d!%H0#&fncc0Nw@#*8-565z-YtG)inmqd7!%Pju{RZd00d<-s5|93f~ zdc;@*`u0QAAe0eV0D4mY`LDT+Vmpz+BYU=Swq^}_UJB+q7B)c>EBMVyl;;R21>sxY zX5lLM9>EdM8{K<Qd(u4|r|5M3T-NR6MzoE_fdO`P7W@xoRXtmu@sX`%3Y@$D6Avms zC~H!%RH5I}WHRl(L1HVF!bw^Oalb$<7yrfclkQ>|<xzx;I^;bRE)j&=S!ylK;x`I@ zeN-?VoNPN}$lE!u^KM!-V>5+g465CkJBNJ?wpH}wq(+^>?>Wt^FTNhRK_t%q3-QH` zdy-y8$Fe~dC$HSR^{6;>lF^zgqA^ZCNLw{otlaEC@?eE>9=WZ}8Kt)WoLtJWXc*0l z41x9azgG*==sEH@5!H&Ta>O1P>&;K&L}fs!4aERa?YS6l61PgK&?KnTeoTV(VV4gn zf5f&@U)Dno%NIviA}7CdY#2T<*;*bMO0dP2D>t9wuAKBt%TlboM-5wB^S{A%RjT(W z&FF{3aD#3A`%;N|!mMVvc~2x!K|5P^e~4W-Q_g_*=;_=!W6*cQ!FzOwN$+`4fAs?* zSGpHs?kmEF(gQKl>z1>W()0@}yZ)1B5JDK2j;h<v^t%m@eV%5CkmUBloJD$O@Vip~ zcJRASzl?9Lm02WvhQb`;Mm<LuQ$r%K!_f$oZ#|{IL!F9^IK=mNXbd_Wl{{2&TrIW! zXpF7di$qo*J;16A?PUwfpeiTrasY|d^;Gw$?6#HhSy$ea$PF|l^qBg2y1Jnd<<VU{ zdD7Wvbc<>4%k4Kgg{-ijE?4NV(keIRxHz(ys-a0q{-)}qC8;XUZ|No+B~O*%ww9-f zMxJ-&BDv^@Y}bSbN;!Py?OG$lVfhokar#DiT2F18h3cc~V}+$Kms@=Lib_I=HPNw3 zP*|V!nkHc#bUC1#eAs8tN$<0NPV7~b*%{w%TQ`+D>c5dC;n&f=(Xa24q^VqE6E>$9 zk?Vi3q|G%y#XBPtxZevu`Wh<$_{WEq>ZQRDOriXSToL~4L!H^5zeD(^h&WYlJ|xZF z7>h4`e=s%YTb7)3?z4^Pv(1SMjlu^9f<oNUNB*MNhUV6Ai5Q(`C9kJ(qa{0u7h9@P zS#*hQ6*Sy2LPO7(FwGx%pX6S~v?yE45$c(2&$WFoPP$izIJm;L$hS*<^HHEas8q>v z)jvC#oMRR%9y1YA9D@2ia`DoUog(@|&gHU$M`heT-Iw)+LqGK7F&-y;*S3z+xHMMT zX<O1b?(h`5om@nTp0j)0hE<u~V`1)$v@I18(xpi6mzD88H_o_cbHqFxx@_OmPTya$ zDC)M&TRhKY`XjZ9k-a_78T~C=3Ozf#$0FP{-eZx{KmKN#KfXnx>W^HNHF8hb7R<L+ zjAWy%=T3Et$P9n=88rF3=t~0J)_<k+rnJruDYyxg8+F3l#fLiBUBHK3+>7~0)ql*R zj@@0K%l!^pM)q=`A}g$`+X)MO{QJRdqez8h^abJ&nsYKq$S-|Qwy`@A&{h6PiSVX4 zZPy>bEF$E&f*e;*Jo~w}=5Ij0Gh!yvP}1SfE-!=H=1d|X@j@{vF6?EOzaXr_$MN|> zu_%C&msH55O7Gh?6eZjjtbEA(d8Dmb7COA2M|mFD8IdU*H}w2sX9RU}dsxpsdfj`W zNeF4{=ZQmT5`F?3bZ1;)0sZI>_VlP9J0;4t=KDFrq4K%sqDcYwbe@#W_GiWIN8B0v z*uEKRYrYi<8OKUy5LezHzM7j;i1(!9o@eCvqV18{YCnvFE6#||Xx&Lh&u>p~G3@_y zXM|ItFG~M`oe{a}`$fL>kKdLd2u&j;k|D_1a%e!ZSbw$MxX|S-@)G^|?vWfA;T=nT zEA|_@zmFECsq1eiX=ZnUf{=b@&{!!t9^pYFt^SkxCkz<!+GaWs1C9MQCxaQM8aY>y zQ6$q)mqRaG)a8n0WJGUmw>=UeF>Vd#8Z|j_#@h^u^470$t=bOCDAzsF3D~I^VLd+& z^&=$8NoaP4YjT^KVzDzakq>qKV_46w{$AiN++-M~u3y8S@^1PSZzw&4#>@;vMM^j; zZ{pwdDnWLCS5>0W^q7&}7G_-XW=1LKSpw}&7GI@%rEUGqHl*iWS*anuMeeKktkc}( zKqGgAs_xkL8j7BGZB?DK^uL%k7$)g-G2LRAq^HH?#?+l9MGfxrgu5@NlJ=qJUa`nA zEE<^~-6Q5J409dkHfx|_OdHj+P?DJ4+*2(3+g!$EooY26OG96X8mbh~C|w@wKBYU= zg{`u=eVEE3o7=J)myeklGx%^~l)}dnWs!?bZ{f0CUF}GLk8yXj74hf|mxMRr&HZ!H zNWIV1mXq)VZ94hhoG3jq7IyiTr6RtQ<@;{qJ5}0|W_5Fht8`b}+QcShf7=f6$8dG? zwByVL@((k;l!=PWDtjoi8P9okyHGuiq3d0iu76X6Dq{kvZE@Lc-(^G~3$7}!Y|Xzn zKI@qOZ81I@`TPx^PJd=VP0E~%{pdZ?v7^a2oEP@7(|eTmOWJ5U<wa>vp_~+%n$2GC zknGm*|KZV>oJy=>uzJcpG`lsLl8+rqnUhi-%>lNDTPGS;qG_7iyhm)#!p8d-TFWkG zi#$5Upo$N<z4-@X!POEGtIn0ExR{vb(XOgUwA@Guq}xij{R#!to@gtcX?sk0Q4wPD zOL4<xf=U4&cKPr}=52i|oIC3$`6DyE+c}w2$W8TJgzwLq=0H{pXqsdEku8j=M4{;> zj1vfHf$dk#iA~tasLakIH;Hn_g=WdFPrLUxy^5*WaNm85<@^sPZWK~;c<b~YjMrmu z*ohsDr@d1R)Z6BxT(nPrVIO7Pe`92)yfdjkiHV_5BQ{Zbhhd1p5TpOXpo=p+d$-4P z-Ugq<ZIRr$2&=5i$`WJrIpn-6VnN~}MM&5(?53@X)T^MUr4#LPxu!ox^c+)r&X<!@ zTkMkq1iviG%lm)f-Y2=1h}rB1VcyRJo_+Z5jFHGC8&Qa4dh|^`iKj#@N{=(_W2~sf z>Bs+QIwM&I-ZMoJX%$M!fu0McaPe%;S$VWSBK%6a7>39(?uCB$x%-KX3VMs(w{7Id zjhC(d{1_pxd|LIGJ2lb^L*MSLz1++f*2>Wr@Ae3(<&`}h%IUM$l;h5b;{)9{sR6Ev zqP~#mIorM)r)JUq(LW{#ne*w)?WMjHP;3+Y9@Xs>pt59ET5MHCl}gLEs=#*}->FuW z)f3?%No30jC#g*S(b|l*YvSZqg0%;w60hVX%-7U#N)4;_^u)+~)%Q6=C8zJOZF8DZ zx7Zpsk}Hq4hO4p4Zl~|#3g^ge^u(MelSi*!_56YB)Gk8+a<AaANY771L<MS^+g2In zU$9hTN$Xrmk>9xFSzZ~~Lhvq%XP3gq5<3J*ak7gy7sMcc`l2_bU@<;q-A12tk6CaT zB}(ZnpeE%D89tf?`Qx+I_@aQ%j>9PHG4khXyPi^x+H0QgMQa2kE2E4F$H-u!Lf*j6 z<YtF;Pcgc!@J`WeEs`sbLZgWX4s%1+@~4%jdq2N<)li{uAMow=?q4NcZdhSreja^V z&reZGdPBS%4O_WPF5!{H<ok;_<<IjM`EnqvbUO-d;d$J*>)V>oE!iT2{D`%NOt38t z%WmW3&Q0=Y#;Y^@k-0rlsO}-)UE$_pUq1TbTE&&a+y`ioXpFc>sT+Ni512-Wd7g0k zTbf{5K}}j-?zBDeBrk3y9{1`^-0sG*iy<Ps?FjGYva3K=#+xgj@$L0?;ZE;PlqEuK z@!_&`BnpTk>^fGdvcm3Ef|hi$z~^L1Y2=gLzk&sUyd;4He7l{kg^A(R3M(v;zl0Uh zy+*>KWpGISNT!VBtKu19#0QW}1jGk-M@Ko;T;n^me`;bNrDwNtdf({5+NQ;|8J(My zd2!Mg$$TB|1+KONa+?zaSH)qR)Dus2uDFu>%-4~nQkYeb)x%Zp0nfXtzH-Vouk@gP z{4U0P&_J|ZEfYNcno$HR;gjlQWigI?i1PNtT}I2U|HN`t@1uKr>^R2gzJ9h?#p%l| zE4u9_#eP@3USe6&YD1Nv7g!c%1Ga0pJ{c>y*sqcSk3B2nomG>hWE5nLe22$P^jSn# zRS-R!ua?&vhp-T`YAhq|31Qt&Gk8(Ow?oQs_gv<!B5|4yw7d`HwbjSzzxti1NKf}K zNYRWS%@%sstI|TREN0MPYyL01>)DTr<{fXUF*R}8ezMEiR#b>)bLcvO`9}OcntHq5 z0te|$cpoO;f8B81gW1`(tU$HXm4=~E^(WUV!y`&6{u|@;tHf;Eyeu8pczrS^J`!jZ z$B9G6!Ic+e(}|x$UsLQVeUp?hUds!6Q~%au9JU#G5dF^6ZR<X#u&ESDO8rYC^-uS* zRw5TfIsFR~zu+=H5+!CjdK8$nPFXw=ZQ4IT=knhi$p~<p@fl?_)ej4U9{QQ=7+dR) zU@xW8F2awyY+9UeT9kg)Z)FZkx2lBhD!radNmj6&md})7&8tR6+4Vc`RCgf^KO(Dx zSxB~xllnfj`;fq(o{7fKnSB_$6HS|${-$qr+B&;DHixZqSH@P)Fk9!gjICU%Weh6P zsUO<bx5K;Jn7nhF_v7)HnPhigOB7`|qVhfyNBt54>U=ObpUDgcb3VaXm$Z<1aeCJ) zs@J?J&wq1Np8q>>`ewr-28$T|=NRNYh#1@2tKhDBd(&(mVE&ZIgu2Vdh%y_wR7jDO zL4p6eNR=&yq^HBb`#Pep<U^)(4#Arc9M;G5MTD3wjYCaOzo5@9Mn3~X237N>Y*`Xq z_c4nq!a)smyiZ1Ydm{A@UWWha7JvQpmk`VTpjbw8SEM2Ra4xS`!x~u=qB%LFH+9I6 zraEzvRQ{g3D1wa!0mG*<<;HNQ`x^nNJj?2WPI*Bmxvl}H%AnJjpc7h@;<PB}bav3` zhd2e#^aK?*&1pu+Y{H+keS@8|6V@}#YQn+9L(Mu^Zccaln8m!Lr#(zE{6jWEoHueu z-qtT7<o=QiWq^UcDE&B!*F4w3+Yo`XX$Pb7G7frlX(cJpUv|rmiX#_Eyf^1}#YYy? zgmQUO+mP`D!_`g!cf66G-kzwyZdV)ARyHX<Vi7Rv+NaQC6>9xgQiZVDPKKL*VM-&@ zGJ%0rxqYVnPZ;0EB9x{bo>~-}^6MWT+Bem(k8+sqTMXQ9+Rt}n*Vot9Pqce#${Xv- zOWoyV_R`9d`VzkC?IV&(N7&0e^;I=X>~$se4T7~5_6E1Ixg@FKlF{~MCDopC`z1*g zmqaVpe;Yr0NljUhWtp%ntgl+SlvpK|*_T$;j8<6EXrDaAUbdp9WNB5Yy}qPoNx8kM z0jDuzAgih=t@bojEh|?Mn%hvaq<o^is=C^P|B`VH^%eGOYwO%qwKWajv5#8VP=5Uw zcca@rX3Q8xZ|5&1Pk#B!D{#)XSJc)oEpZDF)N*@SiMs?!aZah1U;dnBWkI)zhLs(T zV;7FPv8u*Bx~8H0W(h<B5Z9F1Ce57ds_IVgc%nahioLA7qQp}T2j#!c^e^Go)z_Am zH#8t3i5a1fYN%Q=PNgZto8hm(^ryld=rQQ8PYxcFer`j#y{@u^Ur!BhtJE6>MZ&Wu z6PkTlgIxk0Y00J3UQu0(%rf!gu5z!iS5#F?fl96~FDYxVPcoeiTVh`8af@I1lMqvQ zm*Z6YFD<FR4&NmW_QfS-CIjWaOn&*B<#E?}-1ZS=weE%y_GD9tl;H|1I8De>Y9)f@ z7JY-=U27j9HY55ZZy({NR+Kl4p#Y7r(n+$f69yvB2K$JH>qZchhVlk`MSbm3>Pbnx zTPjR>Nol2>g61i&DJ>6SnQHMFXD?k*3ZKHta`_@EHJ+u55ttM@H<sh57Ih_6^=AHG zUtzDPfj+lfmCNNN^^`wEYcDOSu3B7QBGveM58onsiAn|eaJ`Yp5fwF7{3Yt@FL~Mu ztAtS{>gpG(;zO14NV%%2X>h~b5Sh@YTu;ob@axN$mDf`;{)+HZt}nHhRZ)o~9gAz- zmG<jNfGWpEv?b|FsL3_<<lOAp&it&A<Yko<zuJ0YTvabAG5(B%n7_$|l|;TCi9<|w zl9efvF-S!MkgRR6r=&>9p%#>RN>wWHP+cyCJZ(&Bzw!~}J+szLTjCbxMiYX-Yeo=v zDu!@(*Dfh1&h_@?RV1cQ=nZDR)z~YRy5W{%G%2)S<@N?oMMYI3{-t%51do7bgq`NN zq^5yZ%3klGJP^~0+Un}s<qZ>!BnRUpA4y4N_Q@i*a(lAM?|M&-y>7W=*#Nqw&@H7n zR@G3(B>1nOuZLckndNaHwNYP#VI(D0LtkAY%vAwCA$&LPk{u^=r)9S{+DmI|>&s}Z z-9{TOIUEc_K9Z7FK)2!)=t`k0t@YGM>qAp)RCJNx0Dk#nlae_4kyOmT`TWboA2Kgl zT)V7%w0$v+NL7u!vb@pgBuxJ)GY84fy83eR^U9!avxN2wuY8I95<JiL)TE^@L}>hT zFSMuBkg)N^6Zx5M_NHcgxU|B^teKKyG$>L`(i+^VNgzAvj~i8?9%Hxn)#T`YLDH+t zP=sR}2(4^k>bQl5N2%(g?aL{(<*FP}wuQZ9q9j(Bq%5sJF?^b&zbOJqNvY$?zB&&5 zQz63x<x%>3iDpGrJ#sMGOmax9thUm~s+<x^o77BdEbT~A!<Z#EOthER*VoieWW=EL zxyuNr+&;nRdW<F<3a;Byf2z`#)YVm2m6pihfqGk4S6lC<C8()hfj5RtH8thc4T`H4 z!gon|O}RA5G&PGuT4S?Z^o1X!lQwE$nn9|*={ij6LHR10aVMeAto2lvNgGu{>p|4Z z?Mus-O6w_IOH#wwq%wo`Jm>70c{6h-+EYrcwha+8ma1J^M}ikqWmTh=k~zknx1^?4 z4FOX!gYoL~pZVqfOGEva2J6!)`@g;-ltHG&K#e;o#?rP(S0t@zX>CnK)siudORFU# zC1V7GQI>pdQklz7Ug!XES=yNN=xA-0F-)YzRkh%H`Q`6wPgOZ1F$qO0oL`Ww&B-sG zDL;AIoJ?nac2X&&rlGdFyipA|$CPTNw1)P{lkGRS>r<xGlva9bu4~YeQb#q)Pnnii z!zj8+O19D1k4Q>l<Q=Webk2Yo86_S3#DXi$u6ANUQmG190!k{Km6J0^1u1b+A4_gv zSea5<#y~4+%%}!!fSDR#6;H~s2;^ItE@U%n+H@)et))?5REKVifJLaJNn}`M#<jX+ z1*0~RC)V;qK-S2?FkD}`MA{aOmPa|#{Pr_5D(+`C-N)1geV7#3C<fNJHfU1br3_2h zQVaT7(8vYth{G7_cgfNQEm$Fp`mQ>`5lIb*JDbKu8dp-=N5wc)#@N){zWNemp&VrZ zd{Rdeb#h127wVWlODk|`{bnjs5VeBYvvOxUXDrOiva*fVtc0OIP?%j@NYg`siq`V- z^XJaUo9SGb>s&a)SvWhdcwx@Gtih~#V!EGorpq~}Ft2caKTGC5&KYyGzG1JH)HpF| zg_g8*VN(6Xr0R)D?un9Becj4{UPVjMQu4HvdM#zPmQtss6lf_PE#-PGrAAAcsio9v zDGgf6IE}N+DVf+;@DJMSF)rnMDc_aa^2Hh=7&9(io92=6beUFQ%y-mi$tai6T8^4t z(99>LBNa7HkJjeZGg_1S8fwYB(fCWcV$8S-DqLNO%$=gO<_w2w3LO8!|0m>-IMK-O zGfn(!^F7k^|MDr8o2LfQJvP8RFdn}$-8Y!{)FdO`%S<ev+}~{3TNpOw%iS%yzZHM{ z4+`g>J^j)pEUcn$S!gWB&@$K5F0YXhXKlUqufKmu;9nB>zaWA7a+WB{>lZSl4<_di z&pb2v56|RJ`QaUROyPS94pV=4$N5voj~_o3`>7Qb72q?IAIN=c^7?I`PVTsH$dr)_ zY|x)SCHj?bO}R0C%#?#yr%ze1ej5Jsr%aBXH|2rck|`IpTsLL?HV^!orgU7`GUfWo zx8iU8l(%lUO@%eP<1YOFbjtQm+u`xRl=0&qf=|bkd+Q#D*S0C~5A0I$Y3X?$p07+f zlKcjI-<ncU@jkqJro8gg!|?xfitDY<Rh$>B51&fhrp7-oZ0hxsqlt6ORN^_crRU74 zZ`}|-b#nB1DqTmChfkf|apBYlaxb1r{7K)XQ@4MbJoTcM%chc+sjvJrRi%CXw#%oI zuBooKCQiM#ZZdlhj;W-PFtQ0FmoTO)`HWmJi!iPxj6%YgM;P;`9!Xw67~ds~62d4| zGTi=YC1G4g7&U}ZM;HxLkq==s62=XLar4x<R=dj#R!s&OqO;(^957nD_~Pu@vuDk| z_~K~Im_jjsdElDD*=Iyw5S$!3ZgQx6b(`3AvtfS7#Jfzi=>CO<eEzS<!Dr^L+r))m zk>Arz_sdPR51>EYG#@d`lO?Bp1I&Lg&5xLPXOk&c6Yn$el3NV>4^|s!H|_t0|F`5Z z)Xe85GoSA?vBSjY2jqXJSq@$_@q+>7LNn>lAK-7?0P{@Kyu?IJ{na^)MW%xJv*(#h zPzCd6&SD8@vaBP?Qj{!LWNL*5eb=;%4{wWoIk0c)@9%Xet0oga9bmTXExhQy{`8jp z-y8G)LE-$fr#~mJct$pQ04zya3(*VdIm_7~cPEdOrKZK6s%qJ)t+&g3M%)_M5vez~ zXbNj<*@>uGVQ*Nmba8F9+C#0VQrjkrtK2Eo<uyy#5;M2tmX_DJ&2?B7b=+*?SF#I+ zcOys^^o9FE6{l;z!&c0V!G3w{D0_BLQ-QT<_V?5-84*mXkmb9o8rkw4HP-ZjJDY{& zig5!8QLFV;OY5r3B@!$d$<p04Db=z-n>C*`*St)-Yi>@?4ChRxj*vIAFne~sGc!BO zvKH3X_`;01iZOe<Y&IvAv6eU)W;xEhe3sPVJ2_granAf13$thCj7}O~cJpYvcB3d) z1PxeP-#1?wtqqWdO8;rB(4GdJJ*m{5G!96e(5OZ;b8F142ofW5vm3IO<?d*0G0C@2 zn#^u+dHo74ud<<%^|aJ9Ej4Z2_z9O^@$K}ClEtO$i-%Y^r)6ek=L8d2QojUNrP11) zIkR){JYK6Pt*&h-Pi7-LWlBZeNL8&h!&j~=Z~9gFGiJ^zxO(=S!nsBBisxU`7nD#M z!7Zt*`rdWbOKWQDu4n(ovut_eiW~aVO=Gv>I>}FK0_|Q=$KEJH8)J7aX5)ngK*@(+ zyyp<M+N<yW3%^Vb&iDVZ^7-Ei?*lWxzb^k%rT;3rh*K<Y7M~Xm7;>L&%Kv{Gzoq~0 zhIjVY<R5X0^q>5l<n)fo=fPu!9L_xcFVy%unH+`${;~4;-wMxT=JVI(f2#CfMfX3a zSk5dyi&1Z>U$L+O1tJYKHR<V$jrm~5YpfX0tTmU8o%Qu4?Am*(tAqQ+bj=<$lu~=q z3)K!kyUh*trG`bBr%pp<$zEPl>seB1@;5ikPe0u$#X=im;?Zcs{E>+VOx$nc%O*Z! z;x-e1YvO|@{>;QNGSsMFtoCYIUMZ`sVW7xri|j|wT<j^mt{l|~Ms_ktnW>bgWM9rO zJD0I{Us-}a2j+@s4K+f(mzC6yG0aIx=yWPkm;_7F2xZh0WMFuZQIf?{J2=5e-;~P@ z%rmjj#8MNlGw}u!eJ0*%V!MgIGx1py$Czk^^L;bCL#F+ECMK9T{0bu;ktTj_+7C4` z&a@Ahd_FZX*|Z-RPOIs@(nPn3OHC{_alVPOOmvwz#l#6FjxzC`Oe3D#Oza(Cw(KoD zBdb5XW&iiaOa4LO{IjS36_+9J4|5Id8DO^TEew2xyG8f6;@Nrq<Mp@lJDLA~_VjNr zGUPD9#DfFOmc51N%<E5Y+5f$9%0DQafA;j3lrC|5>Q^kiu3`D&vdU#O&dl7xxwGfb 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≷|(6)ecIuTh;CnC$~Vq_P_jqX7) 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 diff --git a/deep_sequencing_unit/source/bash/lanes2srf b/deep_sequencing_unit/source/bash/lanes2srf deleted file mode 100755 index 15dbeec0312..00000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SRF_DIR=Srf -[ -d $SRF_DIR ] || mkdir -p $SRF_DIR ] -for a in 1 2 3 4 5 6 7 8; do - echo Converting Lane $a to SRF - time /dsf/illumina2srf -I -b -o $SRF_DIR/s_${a}.srf s_${a}_*_qseq.txt ; -done diff --git a/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 b/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 deleted file mode 100755 index 2d035d0a163..00000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf-pre1.3 +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -mkdir Srf -for a in 1 2 3 4 5 6 7 8; do - echo Converting Lane $a to SRF - time illumina2srf -r -p -C 0.6 -o Srf/s_${a}.srf -N %r:%l:%t: -n %x:%y s_${a}_*_seq.txt ; -done diff --git a/deep_sequencing_unit/source/bash/lanes2srf_RTA b/deep_sequencing_unit/source/bash/lanes2srf_RTA deleted file mode 100755 index 16617c2ba2e..00000000000 --- a/deep_sequencing_unit/source/bash/lanes2srf_RTA +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -export BUSTARD=$1 -export NUMBER_OF_LANES=$2 -export SRF_DIR=Srf -export ILLUMINA2SRF=/usr/local/dsu/bin/illumina2srf - -export PRG=`basename $0` -export USAGE="Usage: ${PRG} <Path_to_Bustard_Folder> <Number_of_Lanes> \n\nEXAMPLE: ${PRG} /array0/Runs/090720_42HUDAAXX/Data/Intensities/Bustard/ 8" - -if [ -z "${BUSTARD}" -o -z "${NUMBER_OF_LANES}" ] -then - echo "${USAGE}" - exit 1 -fi - -[ -d $SRF_DIR ] || mkdir $SRF_DIR -for (( a=1; a<=$NUMBER_OF_LANES; a++ )); do - echo Converting Lane $a to SRF - $ILLUMINA2SRF -b -o $SRF_DIR/s_${a}.srf $BUSTARD/s_${a}_*_qseq.txt & -done \ No newline at end of file diff --git a/deep_sequencing_unit/source/bash/rm_p.sh b/deep_sequencing_unit/source/bash/rm_p.sh deleted file mode 100755 index edd0d46ad08..00000000000 --- a/deep_sequencing_unit/source/bash/rm_p.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# Simply removes the p from the int and nse files - -for i in `ls *.p`; do - j=`echo $i | cut -c 1-16` - mv $i $j - echo -e "Moving $i to $j"; -done diff --git a/deep_sequencing_unit/source/core-plugins/core-plugins.properties b/deep_sequencing_unit/source/core-plugins/core-plugins.properties deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css deleted file mode 100644 index 451a137bcce..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/body-style.css +++ /dev/null @@ -1,60 +0,0 @@ - -input { -border: 0px solid; -height: 25px; -border-color:#000000; -outline: none; -font: 18px "Trebuchet MS"; -} - -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { -font: 16px; -color:#999999; - } -h3 { font: 12px; } - -.greytext {font: 18px "Trebuchet MS";} -.greytext:link {color:#BDBDBD; text-decoration:none} -.greytext:visited {color:#BDBDBD; text-decoration:none} -.greytext:active {color:#BDBDBD; text-decoration:none} -.greytext:hover {color:#000000; text-decoration:none} -.greytext input {color:#999999; text-decoration:none} - - -.box { -background-color: white; -text-rendering: optimizeLegibility; --webkit-border-radius: 6px; -height: 50px; -width: 480px; -margin-top: 30px; -padding: 8px 8px 8px 50px; -border: 3px solid #999999; -box-sizing: border-box; --webkit-box-sizing: border-box; --moz-box-sizing: border-box; -border-radius: 6px 6px 6px 6px; -} - -.loginname { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px 10px; -} - -.password { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px -30px; -} - -.loginbutton { -margin-top: 30px; -} - -div -{ -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css deleted file mode 100644 index cbb0dec6eb3..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/button.css +++ /dev/null @@ -1,39 +0,0 @@ -button { - font: 18px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 6px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; - width: 150px; -} - -button.first { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -button.last { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js deleted file mode 100755 index 13abb6dbc6f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.js +++ /dev/null @@ -1,4013 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.1.3"}; // semver -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - percentage = false, - integer = false; - - if (precision) precision = precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": percentage = true; type = "f"; break; - case "p": percentage = true; type = "r"; break; - case "d": integer = true; precision = "0"; break; - } - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - var number = percentage ? value * 100 : +value, - negative = (number < 0) && (number = -number) ? "\u2212" : sign; - - // Return the empty string for floats formatted as ints. - if (integer && (number % 1)) return ""; - - // Convert the input value to the desired precision. - value = type(number, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - if (percentage) value += "%"; - - return value; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { - var n = 1 + Math.floor(1e-15 + Math.log(x) / Math.LN10); - return d3.round(x, p - n).toFixed(Math.max(0, Math.min(20, p - n))); - } -}; - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "rgb(" + Math.round(ar + br * t) - + "," + Math.round(ag + bg * t) - + "," + Math.round(ab + bb * t) - + ")"; - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.max(0, Math.floor(k * this.r)), - Math.max(0, Math.floor(k * this.g)), - Math.max(0, Math.floor(k * this.b))); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 ? "0" + v.toString(16) : v.toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return "hsl(" + this.h + "," + this.s * 100 + "%," + this.l * 100 + "%)"; -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node, node.__data__, i)); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -}; -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([selector]); // assume node[] -}; -function d3_transition(groups, id) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase, - then = Date.now(); - - groups.id = id; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, then); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, then); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, then); - - return groups; -} - -function d3_transitionTween(b) { - return typeof b === "function" - ? function(d, i, a) { var v = b.call(this, d, i) + ""; return a != v && d3.interpolate(a, v); } - : (b = b + "", function(d, i, a) { return a != b && d3.interpolate(a, b); }); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = selector.call(node.node, node.node.__data__, i)); - for (var k = -1, o = subgroup.length; ++k < o;) { - subgroup[k] = {node: subgroup[k], delay: node.delay, duration: node.duration}; - } - } - } - } - - return d3_transition(subgroups, this.id).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(name, tween) { - name = d3.ns.qualify(name); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f && function(t) { - this.setAttribute(name, f(t)); - }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f && function(t) { - this.setAttributeNS(name.space, name.local, f(t)); - }; - } - - return this.tween("attr." + name, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f && function(t) { - this.style.setProperty(name, f(t), priority); - }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - nice = nice(x1 - x0); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = pow(extent[0]), - v = pow(extent[1]); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function() { - return d3_scale_logTickFormat; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; - -function d3_scale_logTickFormat(d) { - return d.toPrecision(1); -} -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var path = [], - i = 0, - n = points.length, - p = points[0]; - path.push(p[0], ",", p[1]); - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var path = [], - i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]]; - path.push(x0, ",", y0); - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + interpolator(projection(points1), tension) - + "L" + interpolator(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = x]; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area; -} - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? Array.prototype.map.call(touches, function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", tickMinorSize); - tickEnter.select("text").attr("dy", ".71em").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", tickMajorSize); - tickUpdate.select("text").attr("y", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("y2", -tickMinorSize); - tickEnter.select("text").attr("text-anchor", "middle"); - tickUpdate.select("line").attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize); - tickEnter.select("text").attr("dy", ".32em").attr("text-anchor", "end"); - tickUpdate.select("line").attr("x2", -tickMajorSize); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize); - tickEnter.select("text").attr("dy", ".32em"); - tickUpdate.select("line").attr("x2", tickMajorSize); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - - function transition(o) { - return selection.delay ? o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()) : o; - } - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved) d3_behavior_zoomStopClick = true; - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js deleted file mode 100755 index 6cc1d716167..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.layout.js +++ /dev/null @@ -1,1865 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[i][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords(a.target.value, b.target.value); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths; - - function repulse(node, kc) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = kc * quad.count * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = kc * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (k = alpha * charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes)); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o, k)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad) { - var cx = 0, - cy = 0; - quad.count = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c); - quad.count += c.count; - cx += c.count * c.cx; - cy += c.count * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - quad.count++; - cx += quad.point.x; - cy += quad.point.y; - } - quad.cx = cx / quad.count; - quad.cy = cy / quad.count; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children) { - var i = -1, - n = children.length, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children) { - var i = -1, - n = children.length; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2Ï€. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs) { - var i = -1, - n = childs.length, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children) { - var i = -1, - n = children.length, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var da = b.r + c.r, - db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y, - dc = Math.sqrt(dx * dx + dy * dy), - cos = (db * db + dc * dc - da * da) / (2 * db * dc), - theta = Math.acos(cos), - x = cos * db, - h = Math.sin(theta) * db; - dx /= dc; - dy /= dc; - c.x = a.x + x * dx + h * dy; - c.y = a.y + x * dy - h * dx; -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - if (node.children) { - node.x = d3_layout_clusterX(node.children); - node.y = d3_layout_clusterY(node.children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children; - return children ? d3_layout_clusterRight(children[children.length - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children) { - var i = -1, - n = children.length; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - return node.children ? node.children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - return node.children ? node.children[node.children.length - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children) { - var child, - n = children.length, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children) { - var child, - previousChild = null, - i = -1, - n = children.length; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - if (!node.children) return; - var rect = pad(node), - row = [], - children = node.children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = children.length) > 0) { - row.push(child = children[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - children.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - node.children.forEach(squarify); - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - if (!node.children) return; - var rect = pad(node), - children = node.children.slice(), // copy-on-write - child, - row = []; - scale(children, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = children.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !children.length); - row.length = row.area = 0; - } - } - node.children.forEach(stickify); - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js deleted file mode 100644 index e1c0831c88e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg deleted file mode 100644 index 70ac6c77f27..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/images/sprite.png deleted file mode 100644 index b9e19ef18acf68223cf6878c397ffa47ae933478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmV<I0u%j-P)<h;3K|Lk000e1NJLTq0015U0027(1^@s6Y*9KV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!j!8s8RCwC#na@ibK@`Vl6BD5ZHtofu z7QO2^C$YDj(pzsvXmj$QAhd`2qop?wrpKf`M0zSH_$MgX9Bm3YDws=KDWofGL4_p! zzWTPTVSmhKC*(2@-p(-l-h6i6&b-~7HF~|C7=?_<8dj^-X%q!kk_NO~DwQq<0UI(S z2DC^JsOfR~J>aX#!GO-A_!`pB8sOz9;Dm(Dwj!Iz-~|aAlOv-PY)bZ(RSmw9?8{OO zK9sO&VRAKwF}cD<T~t1~I6=?^Yk8cuq06v28cG6jt?7Q_XMlblO6KBJN#S1dF*&C5 zQAZsJ29#3auB)jHedJLm*@Ld)0<2i~7|>cDR50i_^s)~sI3h=}CKsTEfY3gKPWqgi zgKv4DP{WZj&_#rd<t2~99+zGtF2saNJv98laiuT_ctHW!<XaZ$)u$oU$aGL&#;9KQ z5@JN6!5XZ=8mz$@tic+r!5XYy#(cgOU!$0HHJ#xj?43&Ry%%}_*HFCl`3(I7-M|Ix zDg^_&iQ<if&lccsm4E?#j{1iPelGz3sA6)h+`AgX=!E#K#2#^_Qkmi%0FljRZ}a(l zI+MwWdcA(zY&O#Yz8$`BBLc6>KIe3J>a;pgl3XsAHcitG=p-2tN^;HR{{MBHOeSv} zs3WOV%7_uoUmk4_XmwzIydv<Ae{t({#womxg>BoS-ENOd0M5kS9+#uE|3!OUJJ3&D zr(1c+_NVSy{nJ^y6kd!zVOdtX+wJ=OETLO)z)P#umwfUl*3rJ`TBhG=6`;N^?tY-0 zIN+M_-`DbzJvbLtB@hbPjD*iQptC9;5>KFCLhQe>o!VT@Bd07zVWgiM6P%-I_ofy% eTe;=000RI_wd#yk{QvO)0000<MNUMnLSTaTC|&6Q diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html deleted file mode 100644 index f7fb7d9adfb..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/index.html +++ /dev/null @@ -1,9 +0,0 @@ -<!DOCTYPE html> -<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta HTTP-EQUIV="REFRESH" content="0; url=openbis-dsu-downloader.html"> -</head> -<body> -</body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html deleted file mode 100644 index 081ee156543..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu-downloader.html +++ /dev/null @@ -1,835 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>Quantitative Genomics Facility</title> - - <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="google" value="notranslate"> - - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="tree.css" /> - <script type="text/javascript" src="d3.js"></script> - <script type="text/javascript" src="d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="/openbis/resources/js/openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - -//After logout the URL redirected to, just go to current URL in this case -var logouturl = $(location).attr('href'); - -// A helper function for drawing the lines between nodes -var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x] }); - -// The tree visualization -var vis; - -// The node inspectors -var inspectors; - -var inspectorsWidth = 500; - -// The root of the tree -var root = { code : "QGF", label: "QGF", children : [], type: 'ROOT' }; - -// The inspected elements -var inspected = []; - -// A date formatter for grouping samples by registration year / month -var yearmonthformat = d3.time.format("%Y-%m"); - -/// -/// FUNCTIONS FOR PUTTING DATA INTO THE TREE -/// - -function initTree(){ - dsu.retrieveSequencingSamples(function(data){ - addSamplesToTree(data.result); - showSpaces(); - updateDiagram(500); - }); -} - -function addSamplesToTree(samples) -{ - if (samples == null){ - return; - } - - // Create sample nodes - samples = samples.map(function(sample) { - return { - code : sample.permId, - label: sample.properties["EXTERNAL_SAMPLE_NAME"] + " [" + sample.code + "]", - bis: sample, - type: 'SAMPLE' - } - }); - - sortArray(samples, 'code', false); - - // Create sample group nodes (group by registration date) - var sampleGroupsMap = []; - var sampleGroups = []; - - samples.forEach(function(sample) { - var date = yearmonthformat(new Date(sample.bis.registrationDetails.registrationDate)); - var sampleGroup = sampleGroupsMap[date]; - - if (undefined === sampleGroup) { - sampleGroup = { - code: date, - label: date, - samples: [], - type: 'SAMPLE_GROUP' - }; - sampleGroupsMap[date] = sampleGroup; - sampleGroups.push(sampleGroup); - } - sampleGroup.samples.push(sample); - }); - - // Sort sample groups from newest to oldest - sortArray(sampleGroups, 'code', false); - - // Create space nodes - var isFirstSampleGroup = true; - sampleGroups.forEach(function(sampleGroup){ - var spacesMap = []; - var spaces = []; - - sampleGroup.samples.forEach(function(sample){ - var spaceCode = sample.bis.spaceCode; - var space = spacesMap[spaceCode]; - - if(undefined == space){ - space = { - code: sampleGroup.code + "#" + spaceCode, - label: spaceCode, - _children: [], - type: 'SPACE' - } - spacesMap[spaceCode] = space; - spaces.push(space); - } - space._children.push(sample); - }); - - // Sort spacees - spaces.sort(function(space1, space2) { - if (space1.label == space2.label) return 0; - return (space1.label < space2.label) ? -1 : 1; - }); - - if(spaces.length > 1){ - sortArray(spaces, 'label', true); - sampleGroup._children = spaces; - }else{ - sampleGroup._children = sampleGroup.samples; - } - - if(isFirstSampleGroup){ - openAllForNode(sampleGroup); - isFirstSampleGroup = false; - } - }); - - if (samples.length > 0){ - root.children = sampleGroups; - } - -} - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 20); -} - -function getAppWidth(){ - return $(window).width(); -} - -function closeAll(){ - root.children.forEach(function(sampleGroup){ - closeAllForNode(sampleGroup); - }); - - if(inspected.length > 0){ - var inspectedCopy = inspected.slice(0); - inspectedCopy.forEach(function(elem){ - if(elem.inspected){ - toggle_inspected(elem); - } - }); - }else{ - updateDiagram(500); - } -} - -function closeAllForNode(node){ - closeChildren(node); - getChildren(node).forEach(function(child){ - closeAllForNode(child); - }); -} - -function openAllForNode(node){ - openChildren(node); - getChildren(node).forEach(function(child){ - openAllForNode(child); - }); -} - -function getVisibleLeafsCountForNode(node){ - if(node.children){ - var count = 0; - node.children.forEach(function(child){ - count += getVisibleLeafsCountForNode(child); - }); - return count; - }else{ - return 1; - } -} - -function getVisibleLabelsMaxLength(node){ - if(node.children){ - var length = 0; - node.children.forEach(function(child){ - var childLength = getVisibleLabelsMaxLength(child); - if(childLength > length){ - length = childLength; - } - }); - return length; - }else{ - return node.label.length * 13; - } -} - -function showSpaces() -{ - // Don't show anything yet, just initialize the visualization - createVis(); -} - - -var didCreateVis = false; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - visgroup = d3.select("#main").append("div"); - - // An svg element for the tree visualization - vis = visgroup.append("svg:svg") - .attr("id","mainVis") - .append("svg:g") - .attr("transform", "translate(40, 0)"); - - var legend = vis.append("svg:g") - .attr("class","legend") - .attr("transform", "translate(-30, 0)"); - - var legendSeq = legend.append("svg:g").attr("class","sequenced").attr("transform","translate(0, 20)"); - legendSeq.append("svg:circle").attr("r", 5.5); - legendSeq.append("svg:text").text("Sequenced").attr("dx", 10).attr("dy",4); - - var legendNotSeq = legend.append("svg:g").attr("class","notsequenced").attr("transform","translate(0, 40)"); - legendNotSeq.append("svg:circle").attr("r", 5.5); - legendNotSeq.append("svg:text").text("Not Sequenced").attr("dx", 10).attr("dy",4); - - // An element for the inspectors. - inspectors = visgroup.append("span") - .attr("id","inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - - -/** - * Draw / update the tree - */ -function updateDiagram(duration) -{ - log('Updating diagram'); - - var inspectorsSize = inspected.length > 0 ? inspectorsWidth : 0; - var labelsSize = getVisibleLabelsMaxLength(root); - - var treeWidth = Math.max(300, getAppWidth() - inspectorsSize - labelsSize); - var treeHeight = Math.max(100, getAppHeight()); - - var visWidth = treeWidth + labelsSize - 20; - var visHeight = treeHeight; - - var mainWidth = visWidth + inspectorsSize; - var mainHeight = visHeight; - - // Adjust a size of the vis - d3.select("#mainVis") - .attr("width", visWidth) - .attr("height", visHeight); - - d3.select("#main") - .style("width", mainWidth) - .style("height", mainHeight); - - // Adjust a size of the tree - tree = d3.layout.tree().size([treeHeight, treeWidth]) - - // Update the root and compute the new layout - var nodes = tree.nodes(root); - - // Draw / update the links - var link = vis.selectAll("path.link").data(tree.links(nodes), function(d) { return d.code }); - - link.enter().append("svg:path") - .attr("class", "link") - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .transition() - .duration(duration) - .attr("d", diagonal); - - link.transition() - .duration(duration) - .attr("d", diagonal); - - link.exit().transition() - .duration(duration) - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .remove(); - - // Draw / update the nodes - var node = vis.selectAll("g.node").data(nodes, function(d) { return d.code }); - - var nodeEnter = - node.enter().append("svg:g") - .attr("class", classForNode) - .attr("transform", translateSrc) - .on("click", toggle_open); - - nodeEnter.append("svg:circle") - .attr("r", 5.5); - - nodeEnter.append("svg:text") - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("dy", 3) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }) - .text(function(d) { return d.label }); - - nodeEnter - .transition() - .duration(duration) - .attr("transform", translateDst); - - - // Transition nodes to their new position. - node.transition() - .duration(duration) - .attr("class", classForNode) - .attr("transform", translateDst); - - // Move the text elements to the appropriate position - node.selectAll("text").transition() - .duration(duration) - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }); - - node.exit().transition() - .duration(duration) - .attr("transform", translateSrc) - .remove(); -} - -function classForNode(d) { - // Use whether the node has open children or not to compute the class - var cssClass = "node " + d.type; - if (d.inspected) cssClass = cssClass + " inspected"; - if(d.hasFilesLoaded){ - if (d.hasFiles) { - cssClass = cssClass + " sequenced"; - } else { - cssClass = cssClass + " notsequenced"; - } - } - return cssClass; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -function getChildren(d){ - if(d.children != null){ - return d.children; - }else if(d._children != null){ - return d._children; - }else{ - return []; - } -} - -function hasChildren(d) -{ - return d.children != null || d._children != null; -} - -function hasChildrenOpen(d){ - return d.children != null; -} - -function hasChildrenClosed(d){ - return d._children != null; -} - -function closeChildren(d){ - if(hasChildrenOpen(d)){ - d._children = d.children; - d.children = null; - } -} - -function openChildren(d){ - if(hasChildrenClosed(d)){ - d.children = d._children; - d._children = null; - - var hasSampleChildren = d.children && d.children[0].type == 'SAMPLE'; - - if(hasSampleChildren && !d.hasFilesLoaded && !d.hasFilesLoading){ - d.hasFilesLoading = true; - - // Get datasets for each sequencing sample - var sampleDeferrer = - new openbisActionDeferrer( - function() { - log("Loaded HAS_FILES for all samples"); - d.hasFilesLoaded = true; - d.hasFilesLoading = false; - updateDiagram(500); - }, - d.children.map(function(samp) { return samp.bis.code; })); - - d.children.forEach(function(sample) { - loadHasFilesForSample(sample, function(){ - sampleDeferrer.dependencyCompleted(sample.bis.code); - }); - }); - } - } -} - -function loadHasFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - }else{ - var listFiles = function(dataset){ - dsu.server.listFilesForDataSet(dataset.code, "/", true, function(data) { - var files = data.result; - - log("Got " + (files ? files.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + dataset.code); - - if (!files || files.length == 0) { - if(datasets.length > 0){ - log("Sample: " + sample.bis.code + " no files found yet - will try in the next dataset"); - listFiles(datasets.pop()); - }else{ - log("Sample: " + sample.bis.code + " HAS_NO_FILES"); - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - } - }else{ - log("Sample: " + sample.bis.code + " HAS_FILES"); - sample.hasFiles = true; - sample.hasFilesLoaded = true; - callback(); - } - }); - }; - listFiles(datasets.pop()); - } - }); -} - -function loadFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.files = []; - sample.filesLoaded = true; - callback(); - }else{ - sample.datasets = data.result.map(function(bisds) { return {bis : bisds} }); - sample.files = []; - sample.filesLoaded = false; - - // Get all the files from the sequencing sample's datasets - var datasetDeferrer = - new openbisActionDeferrer( - function() { - log("Loaded ALL datasets' files for sample: " + sample.bis.code); - sortArray(sample.files, 'label', true); - sample.filesLoaded = true; - callback(); - }, - sample.datasets.map(function(ds) { return ds.bis.code; })); - - sample.datasets.forEach(function(ds) { - dsu.server.listFilesForDataSet(ds.bis.code, "/", true, function(data) { - log("Got " + (data.result ? data.result.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + ds.bis.code); - - if (!data.result || data.result.length == 0) { - datasetDeferrer.dependencyCompleted(ds.bis.code); - return; - } - data.result.forEach(function (file) { - file.dataset = ds; - file.label = file.pathInListing.split("/").pop(); - }); - - data.result = data.result.filter(function(file) { - var regex= /gz/; - return (regex.test(file.pathInListing) & !file.isDirectory); }); - sample.files = sample.files.concat(data.result); - datasetDeferrer.dependencyCompleted(ds.bis.code); - }) - }); - } - }); -} - -function getTextAnchorType(d){ - return d.type == 'SAMPLE' ? 'start' : 'end'; -} - -// Toggle children on click. -function toggle_open(d) { - if (!hasChildren(d)) { - d.svgNode = this; - return toggle_inspected.call(this, d); - } - - if (hasChildrenOpen(d)) { - closeChildren(d); - } else { - openChildren(d); - } - updateDiagram(500); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspected, function (d) { return d.code }); - var box = inspector.enter().append("div") - .attr("class", "inspector") - .text(function(d) { return d.label }); - - box.append("span") - .attr("class", "close") - .on("click", toggle_inspected) - .text("x"); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.bis.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - inspector.exit().transition() - .duration(duration) - .style("opacity", "0") - .remove(); -} - -// Toggle children on click. -function toggle_inspected(d) { - var count = inspected.length; - - if (d.inspected) { - var index = inspected.indexOf(d) - if (index > -1) inspected.splice(index, 1); - d.inspected = false; - d3.select(d.svgNode).attr("class", classForNode(d)) - } else { - d.inspected = true; - inspected.push(d); - d3.select(d.svgNode).attr("class", classForNode(d)) - if(!d.filesLoaded){ - loadFilesForSample(d, function(){ - updateInspectors(500); - }); - } - } - - if(inspected.length > 0){ - $("#inspectorsContainer").show(); - }else{ - $("#inspectorsContainer").hide(); - } - - if(count == 0 && inspected.length > 0 || count > 0 && inspected.length == 0){ - updateDiagram(500); - setTimeout(function(){ - updateInspectors(500); - }, 500); - }else{ - updateInspectors(500); - } -} - -function sortArray(array, sortingFieldName, ascending){ - array.sort(function(item1, item2){ - var value1 = item1[sortingFieldName]; - var value2 = item2[sortingFieldName]; - - if(value1){ - value1 = new String(value1).toLowerCase(); - } - if(value2){ - value2 = new String(value2).toLowerCase(); - } - - if(ascending){ - return (value1 >= value2) ? 1: -1; - }else{ - return (value1 <= value2) ? 1: -1; - } - }); -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - - -function downloadTableCaption(d) -{ - if(d.filesLoaded){ - if(d.files && d.files.length > 0){ - return ["Files"] - }else{ - return ["Not Yet Sequenced"]; - } - } -} - -function downloadTableFile(d) -{ - // If there is no dataset, this is just a marker for loading - if (!d.dataset) return; - - var action = function(data) { - try { - document.location.href = data.result - } catch (err) { - // just ignore errors - } - }; - dsu.server.getDownloadUrlForFileForDataSet(d.dataset.bis.code, d.pathInDataSet, action); -} - -function filesForSequencingSample(d) -{ - return d.filesLoaded ? d.files : [{ label : "Loading..." }]; -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#loginname").focus(); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - initTree(); - - $('#openbis-logo').height(30); - $('#openbis-logo').hide(); - -} - - -$(document).ready(function() { - if ( $.browser.msie ) { - alert("Currently no Internet Explorer is supported!"); - } - $('#main').hide() - - $('#logout-button').click(function() { - dsu.server.logout(function(data) {$(location).attr('href',logouturl)}); - }); - - $('#login-form').submit(function() { - dsu.server.login( $.trim($('#loginname').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - - dsu.server.ifRestoredSessionActive(function(data) { enterApp(data) }); -}); - -// set the focus -function onPageLoad(){ - if(loginname.value.length==0) { - $("#loginname").focus(); - } - else { - $("#login-button").focus(); - } -} - -function log(msg){ - /* - if(console){ - console.log(msg); - } - */ -} - - - </script> -</head> -<body onload="onPageLoad()"> -<img id="openbis-logo" src="images/openBIS_Logo.svg" alt="openBIS" style="position: absolute; left: 330px; top: 230px; height: 70px;"/> -<link rel="shortcut icon" href="../images/favicon.ico" /> -<link rel="icon" type="image/png" href="../images/favicon.png" /> - -<div id="login-form-div"> - <h1>BSSE - Quantitative Genomics Facility</h1> - <form id="login-form" action="javascript:"> - <div class="box greytext loginname"> - <input value="Login Name" type="text" required="required" maxlength="40" size="40" onfocus="this.value=(this.value=='Login Name') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Login Name' : this.value;" id="loginname"> </input> - </div> - <div class="box greytext password"> - <input value="Password" id="password" type="password" required="required" size="40" onfocus="this.value=(this.value=='Password') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Password' : this.value;" id="password"> </input> - </div> - <div class="loginbutton"> - <button id="login-button" type="submit">Login</button> - </div> - <br> - <a href="https://crowd-bsse.ethz.ch/crowd/console/forgottenlogindetails!default.action" id="resetpassword" class="greytext">Reset password</a> - </form> -</div> - -<div id="main"> - <div id="button-group"> - <button id="logout-button">Logout</button> - <button id="close-all-button" onclick="closeAll();">Close All</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js deleted file mode 100644 index 52e7336254a..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css deleted file mode 100644 index 8617fd5fb4d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/html/tree.css +++ /dev/null @@ -1,138 +0,0 @@ -.node circle { - fill: #fff; - stroke: #444444; - stroke-width: 1.5px; -} - -.node { - font: 14px "Verdana", sans-serif; - z-index: 1; - cursor: pointer; - left: -15px; -} - -.node:hover circle{ - fill: #444444; -} - -.node:hover{ - font-weight: bold; -} - -.link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - z-index: -1; -} - -.SAMPLE.inspected { - font-weight: bold -} - -.SAMPLE.sequenced circle { - stroke: DarkGreen; -} - -.SAMPLE.sequenced:hover circle { - fill: DarkGreen; -} - -.SAMPLE.notsequenced circle { - stroke: DarkRed; -} - -.SAMPLE.notsequenced:hover circle { - fill: DarkRed; -} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; -} - -.properties { - width: 100%; -} - -.properties tr:nth-child(odd) { - background-color:#eee; -} - -.properties tr:nth-child(even) { - background-color:#fff; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 14px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} - diff --git a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties b/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties deleted file mode 100644 index cb40f34f644..00000000000 --- a/deep_sequencing_unit/source/core-plugins/downloader/1/as/webapps/downloader/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py deleted file mode 100644 index 5321fedca37..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/as/initialize-master-data.py +++ /dev/null @@ -1,3385 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.getOrCreateNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -vocabulary_AGILENT_KIT = tr.getOrCreateNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setInternalNamespace(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.getOrCreateNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setInternalNamespace(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(2) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(4) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_CASAVA_VERSION = tr.getOrCreateNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setInternalNamespace(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(3) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(4) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(5) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(6) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_CLUSTER_STATION = tr.getOrCreateNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_CBOT2 = tr.createNewVocabularyTerm('CBOT2') -vocabulary_term_CLUSTER_STATION_CBOT2.setDescription('Second cBot') -vocabulary_term_CLUSTER_STATION_CBOT2.setLabel('cBot2') -vocabulary_term_CLUSTER_STATION_CBOT2.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT2) - -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_STATION_SOFTWARE_VERSION') -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setDescription(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360 = tr.createNewVocabularyTerm('CBOT_1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setLabel('cBot 1.4.36.0') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360.setOrdinal(1) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_CBOT_14360) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06 = tr.createNewVocabularyTerm('GALAXY_0.6') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setDescription('Old Cluster Station') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setLabel('Galaxy 0.6 Build 98') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06.setOrdinal(2) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_GALAXY_06) - -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN = tr.createNewVocabularyTerm('NOT_KNOWN') -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setDescription(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setLabel(None) -vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN.setOrdinal(3) -vocabulary_CLUSTER_STATION_SOFTWARE_VERSION.addTerm(vocabulary_term_CLUSTER_STATION_SOFTWARE_VERSION_NOT_KNOWN) - -vocabulary_CONTROL_LANE = tr.getOrCreateNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setInternalNamespace(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_CYCLES = tr.getOrCreateNewVocabulary('CYCLES') -vocabulary_CYCLES.setDescription('Number of cycles') -vocabulary_CYCLES.setUrlTemplate(None) -vocabulary_CYCLES.setManagedInternally(False) -vocabulary_CYCLES.setInternalNamespace(False) -vocabulary_CYCLES.setChosenFromList(True) - -vocabulary_term_CYCLES_36 = tr.createNewVocabularyTerm('36') -vocabulary_term_CYCLES_36.setDescription(None) -vocabulary_term_CYCLES_36.setLabel(None) -vocabulary_term_CYCLES_36.setOrdinal(1) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_36) - -vocabulary_term_CYCLES_50 = tr.createNewVocabularyTerm('50') -vocabulary_term_CYCLES_50.setDescription(None) -vocabulary_term_CYCLES_50.setLabel(None) -vocabulary_term_CYCLES_50.setOrdinal(2) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_50) - -vocabulary_term_CYCLES_76 = tr.createNewVocabularyTerm('76') -vocabulary_term_CYCLES_76.setDescription(None) -vocabulary_term_CYCLES_76.setLabel(None) -vocabulary_term_CYCLES_76.setOrdinal(3) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_76) - -vocabulary_term_CYCLES_101 = tr.createNewVocabularyTerm('101') -vocabulary_term_CYCLES_101.setDescription(None) -vocabulary_term_CYCLES_101.setLabel(None) -vocabulary_term_CYCLES_101.setOrdinal(4) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_101) - -vocabulary_term_CYCLES_51 = tr.createNewVocabularyTerm('51') -vocabulary_term_CYCLES_51.setDescription(None) -vocabulary_term_CYCLES_51.setLabel(None) -vocabulary_term_CYCLES_51.setOrdinal(5) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_51) - -vocabulary_term_CYCLES_58 = tr.createNewVocabularyTerm('58') -vocabulary_term_CYCLES_58.setDescription(None) -vocabulary_term_CYCLES_58.setLabel(None) -vocabulary_term_CYCLES_58.setOrdinal(6) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_58) - -vocabulary_term_CYCLES_125 = tr.createNewVocabularyTerm('125') -vocabulary_term_CYCLES_125.setDescription(None) -vocabulary_term_CYCLES_125.setLabel(None) -vocabulary_term_CYCLES_125.setOrdinal(7) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_125) - -vocabulary_term_CYCLES_151 = tr.createNewVocabularyTerm('151') -vocabulary_term_CYCLES_151.setDescription(None) -vocabulary_term_CYCLES_151.setLabel(None) -vocabulary_term_CYCLES_151.setOrdinal(8) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_151) - -vocabulary_term_CYCLES_100 = tr.createNewVocabularyTerm('100') -vocabulary_term_CYCLES_100.setDescription(None) -vocabulary_term_CYCLES_100.setLabel(None) -vocabulary_term_CYCLES_100.setOrdinal(9) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_100) - -vocabulary_term_CYCLES_108 = tr.createNewVocabularyTerm('108') -vocabulary_term_CYCLES_108.setDescription(None) -vocabulary_term_CYCLES_108.setLabel(None) -vocabulary_term_CYCLES_108.setOrdinal(10) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_108) - -vocabulary_term_CYCLES_150 = tr.createNewVocabularyTerm('150') -vocabulary_term_CYCLES_150.setDescription(None) -vocabulary_term_CYCLES_150.setLabel(None) -vocabulary_term_CYCLES_150.setOrdinal(11) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_150) - -vocabulary_term_CYCLES_49 = tr.createNewVocabularyTerm('49') -vocabulary_term_CYCLES_49.setDescription(None) -vocabulary_term_CYCLES_49.setLabel(None) -vocabulary_term_CYCLES_49.setOrdinal(12) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_49) - -vocabulary_term_CYCLES_55 = tr.createNewVocabularyTerm('55') -vocabulary_term_CYCLES_55.setDescription(None) -vocabulary_term_CYCLES_55.setLabel(None) -vocabulary_term_CYCLES_55.setOrdinal(13) -vocabulary_CYCLES.addTerm(vocabulary_term_CYCLES_55) - -vocabulary_END_TYPE = tr.getOrCreateNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setInternalNamespace(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(1) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_EXPERIMENT_DESIGN = tr.getOrCreateNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setInternalNamespace(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_INDEX1 = tr.getOrCreateNewVocabulary('INDEX1') -vocabulary_INDEX1.setDescription('Index 1 for Illumina Indexing') -vocabulary_INDEX1.setUrlTemplate(None) -vocabulary_INDEX1.setManagedInternally(False) -vocabulary_INDEX1.setInternalNamespace(False) -vocabulary_INDEX1.setChosenFromList(True) - -vocabulary_term_INDEX1_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setOrdinal(1) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATCACGA) - -vocabulary_term_INDEX1_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setOrdinal(2) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGATGTA) - -vocabulary_term_INDEX1_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setOrdinal(3) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTAGGCA) - -vocabulary_term_INDEX1_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setOrdinal(4) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TGACCAA) - -vocabulary_term_INDEX1_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setOrdinal(5) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACAGTGA) - -vocabulary_term_INDEX1_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setOrdinal(6) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCCAATA) - -vocabulary_term_INDEX1_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setOrdinal(7) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATCA) - -vocabulary_term_INDEX1_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setOrdinal(8) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTGAA) - -vocabulary_term_INDEX1_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setOrdinal(9) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GATCAGA) - -vocabulary_term_INDEX1_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setOrdinal(10) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGCTTA) - -vocabulary_term_INDEX1_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setOrdinal(11) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGCTACA) - -vocabulary_term_INDEX1_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setOrdinal(12) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTTGTAA) - -vocabulary_term_INDEX1_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_INDEX1_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_INDEX1_AGATACA.setOrdinal(13) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGATACA) - -vocabulary_term_INDEX1_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setOrdinal(14) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTTCCG) - -vocabulary_term_INDEX1_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setOrdinal(15) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAG) - -vocabulary_term_INDEX1_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setOrdinal(16) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCC) - -vocabulary_term_INDEX1_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setOrdinal(17) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCCGCA) - -vocabulary_term_INDEX1_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setOrdinal(18) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAC) - -vocabulary_term_INDEX1_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setOrdinal(19) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCT) - -vocabulary_term_INDEX1_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setOrdinal(20) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGG) - -vocabulary_term_INDEX1_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setOrdinal(21) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGT) - -vocabulary_term_INDEX1_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setOrdinal(22) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAGTGGA) - -vocabulary_term_INDEX1_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setOrdinal(23) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTGATA) - -vocabulary_term_INDEX1_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setOrdinal(24) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTT) - -vocabulary_term_INDEX1_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setOrdinal(25) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGGCGA) - -vocabulary_term_INDEX1_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setOrdinal(26) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACTAG) - -vocabulary_term_INDEX1_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setOrdinal(27) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGCAGAA) - -vocabulary_term_INDEX1_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setOrdinal(28) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTGAGC) - -vocabulary_term_INDEX1_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setOrdinal(29) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGACTCCT) - -vocabulary_term_INDEX1_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setOrdinal(30) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGGCATG) - -vocabulary_term_INDEX1_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setOrdinal(31) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCTCTAC) - -vocabulary_term_INDEX1_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setOrdinal(32) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGAGAGG) - -vocabulary_term_INDEX1_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setOrdinal(33) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTACGCT) - -vocabulary_term_INDEX1_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setOrdinal(34) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGAGGCTG) - -vocabulary_term_INDEX1_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setOrdinal(35) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGAGGCA) - -vocabulary_term_INDEX1_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setOrdinal(36) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGGA) - -vocabulary_term_INDEX1_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_INDEX1_AAGACTA.setDescription(None) -vocabulary_term_INDEX1_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_INDEX1_AAGACTA.setOrdinal(37) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGACTA) - -vocabulary_term_INDEX1_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_INDEX1_ACTTCAA.setDescription(None) -vocabulary_term_INDEX1_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_INDEX1_ACTTCAA.setOrdinal(38) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTCAA) - -vocabulary_term_INDEX1_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_INDEX1_AGGTTGA.setDescription(None) -vocabulary_term_INDEX1_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_INDEX1_AGGTTGA.setOrdinal(39) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGTTGA) - -vocabulary_term_INDEX1_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setDescription(None) -vocabulary_term_INDEX1_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setOrdinal(40) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCGTCA) - -vocabulary_term_INDEX1_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setDescription(None) -vocabulary_term_INDEX1_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setOrdinal(41) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGCATAA) - -vocabulary_term_INDEX1_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_INDEX1_ATACGCA.setDescription(None) -vocabulary_term_INDEX1_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_INDEX1_ATACGCA.setOrdinal(42) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATACGCA) - -vocabulary_term_INDEX1_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_INDEX1_CAGATGA.setDescription(None) -vocabulary_term_INDEX1_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_INDEX1_CAGATGA.setOrdinal(43) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATGA) - -vocabulary_term_INDEX1_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_INDEX1_CCGAATA.setDescription(None) -vocabulary_term_INDEX1_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_INDEX1_CCGAATA.setOrdinal(44) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGAATA) - -vocabulary_term_INDEX1_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_INDEX1_CGCTCGA.setDescription(None) -vocabulary_term_INDEX1_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_INDEX1_CGCTCGA.setOrdinal(45) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGCTCGA) - -vocabulary_term_INDEX1_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_INDEX1_CGTATTA.setDescription(None) -vocabulary_term_INDEX1_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_INDEX1_CGTATTA.setOrdinal(46) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTATTA) - -vocabulary_term_INDEX1_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setDescription(None) -vocabulary_term_INDEX1_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setOrdinal(47) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCATGAA) - -vocabulary_term_INDEX1_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_INDEX1_CTGACCA.setDescription(None) -vocabulary_term_INDEX1_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_INDEX1_CTGACCA.setOrdinal(48) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTGACCA) - -vocabulary_term_INDEX1_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_INDEX1_GAAGCCA.setDescription(None) -vocabulary_term_INDEX1_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_INDEX1_GAAGCCA.setOrdinal(49) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAAGCCA) - -vocabulary_term_INDEX1_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_INDEX1_GCTGAAA.setDescription(None) -vocabulary_term_INDEX1_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_INDEX1_GCTGAAA.setOrdinal(50) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTGAAA) - -vocabulary_term_INDEX1_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_INDEX1_GTCGCGA.setDescription(None) -vocabulary_term_INDEX1_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_INDEX1_GTCGCGA.setOrdinal(51) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCGCGA) - -vocabulary_term_INDEX1_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_INDEX1_TAAGATA.setDescription(None) -vocabulary_term_INDEX1_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_INDEX1_TAAGATA.setOrdinal(52) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGATA) - -vocabulary_term_INDEX1_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setDescription(None) -vocabulary_term_INDEX1_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setOrdinal(53) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCGCTGA) - -vocabulary_term_INDEX1_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_INDEX1_TATCGTA.setDescription(None) -vocabulary_term_INDEX1_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_INDEX1_TATCGTA.setOrdinal(54) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATCGTA) - -vocabulary_term_INDEX1_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_INDEX1_TCCTACA.setDescription(None) -vocabulary_term_INDEX1_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_INDEX1_TCCTACA.setOrdinal(55) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTACA) - -vocabulary_term_INDEX1_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_INDEX1_TCTATAA.setDescription(None) -vocabulary_term_INDEX1_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_INDEX1_TCTATAA.setOrdinal(56) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCTATAA) - -vocabulary_term_INDEX1_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_INDEX1_TTACTTA.setDescription(None) -vocabulary_term_INDEX1_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_INDEX1_TTACTTA.setOrdinal(57) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTACTTA) - -vocabulary_term_INDEX1_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_INDEX1_TTCCGAA.setDescription(None) -vocabulary_term_INDEX1_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_INDEX1_TTCCGAA.setOrdinal(58) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCCGAA) - -vocabulary_term_INDEX1_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_INDEX1_ATGTCAA.setDescription(None) -vocabulary_term_INDEX1_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_INDEX1_ATGTCAA.setOrdinal(59) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAA) - -vocabulary_term_INDEX1_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_INDEX1_CCGTCCA.setDescription(None) -vocabulary_term_INDEX1_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_INDEX1_CCGTCCA.setOrdinal(60) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCA) - -vocabulary_term_INDEX1_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_INDEX1_GTAGAGA.setDescription(None) -vocabulary_term_INDEX1_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_INDEX1_GTAGAGA.setOrdinal(61) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGA) - -vocabulary_term_INDEX1_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_INDEX1_GTGAAAA.setDescription(None) -vocabulary_term_INDEX1_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_INDEX1_GTGAAAA.setOrdinal(62) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAA) - -vocabulary_term_INDEX1_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_INDEX1_GTGGCCA.setDescription(None) -vocabulary_term_INDEX1_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_INDEX1_GTGGCCA.setOrdinal(63) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCA) - -vocabulary_term_INDEX1_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_INDEX1_GTTTCGA.setDescription(None) -vocabulary_term_INDEX1_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_INDEX1_GTTTCGA.setOrdinal(64) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGA) - -vocabulary_term_INDEX1_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_INDEX1_CGTACGA.setDescription(None) -vocabulary_term_INDEX1_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_INDEX1_CGTACGA.setOrdinal(65) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGA) - -vocabulary_term_INDEX1_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_INDEX1_GGTAGCA.setDescription(None) -vocabulary_term_INDEX1_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_INDEX1_GGTAGCA.setOrdinal(66) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGTAGCA) - -vocabulary_term_INDEX1_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_INDEX1_ATGAGCA.setDescription(None) -vocabulary_term_INDEX1_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_INDEX1_ATGAGCA.setOrdinal(67) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGAGCA) - -vocabulary_term_INDEX1_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_INDEX1_ATTCCTA.setDescription(None) -vocabulary_term_INDEX1_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_INDEX1_ATTCCTA.setOrdinal(68) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTA) - -vocabulary_term_INDEX1_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_INDEX1_CAAAAGA.setDescription(None) -vocabulary_term_INDEX1_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_INDEX1_CAAAAGA.setOrdinal(69) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAAAAGA) - -vocabulary_term_INDEX1_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_INDEX1_CAACTAA.setDescription(None) -vocabulary_term_INDEX1_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_INDEX1_CAACTAA.setOrdinal(70) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAACTAA) - -vocabulary_term_INDEX1_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_INDEX1_CACCGGA.setDescription(None) -vocabulary_term_INDEX1_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_INDEX1_CACCGGA.setOrdinal(71) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACCGGA) - -vocabulary_term_INDEX1_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_INDEX1_CACGATA.setDescription(None) -vocabulary_term_INDEX1_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_INDEX1_CACGATA.setOrdinal(72) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACGATA) - -vocabulary_term_INDEX1_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_INDEX1_CACTCAA.setDescription(None) -vocabulary_term_INDEX1_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_INDEX1_CACTCAA.setOrdinal(73) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACTCAA) - -vocabulary_term_INDEX1_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_INDEX1_CAGGCGA.setDescription(None) -vocabulary_term_INDEX1_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_INDEX1_CAGGCGA.setOrdinal(74) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGGCGA) - -vocabulary_term_INDEX1_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_INDEX1_CATGGCA.setDescription(None) -vocabulary_term_INDEX1_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_INDEX1_CATGGCA.setOrdinal(75) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATGGCA) - -vocabulary_term_INDEX1_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_INDEX1_CATTTTA.setDescription(None) -vocabulary_term_INDEX1_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_INDEX1_CATTTTA.setOrdinal(76) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATTTTA) - -vocabulary_term_INDEX1_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_INDEX1_CCAACAA.setDescription(None) -vocabulary_term_INDEX1_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_INDEX1_CCAACAA.setOrdinal(77) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCAACAA) - -vocabulary_term_INDEX1_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_INDEX1_CGGAATA.setDescription(None) -vocabulary_term_INDEX1_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_INDEX1_CGGAATA.setOrdinal(78) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGGAATA) - -vocabulary_term_INDEX1_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_INDEX1_CTAGCTA.setDescription(None) -vocabulary_term_INDEX1_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_INDEX1_CTAGCTA.setOrdinal(79) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTAGCTA) - -vocabulary_term_INDEX1_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_INDEX1_CTATACA.setDescription(None) -vocabulary_term_INDEX1_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_INDEX1_CTATACA.setOrdinal(80) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTATACA) - -vocabulary_term_INDEX1_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_INDEX1_CTCAGAA.setDescription(None) -vocabulary_term_INDEX1_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_INDEX1_CTCAGAA.setOrdinal(81) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCAGAA) - -vocabulary_term_INDEX1_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_INDEX1_GACGACA.setDescription(None) -vocabulary_term_INDEX1_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_INDEX1_GACGACA.setOrdinal(82) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GACGACA) - -vocabulary_term_INDEX1_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_INDEX1_TAATCGA.setDescription(None) -vocabulary_term_INDEX1_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_INDEX1_TAATCGA.setOrdinal(83) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAATCGA) - -vocabulary_term_INDEX1_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_INDEX1_TACAGCA.setDescription(None) -vocabulary_term_INDEX1_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_INDEX1_TACAGCA.setOrdinal(84) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TACAGCA) - -vocabulary_term_INDEX1_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_INDEX1_TATAATA.setDescription(None) -vocabulary_term_INDEX1_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_INDEX1_TATAATA.setOrdinal(85) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATAATA) - -vocabulary_term_INDEX1_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_INDEX1_TCATTCA.setDescription(None) -vocabulary_term_INDEX1_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_INDEX1_TCATTCA.setOrdinal(86) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCATTCA) - -vocabulary_term_INDEX1_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_INDEX1_TCCCGAA.setDescription(None) -vocabulary_term_INDEX1_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_INDEX1_TCCCGAA.setOrdinal(87) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCCGAA) - -vocabulary_term_INDEX1_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_INDEX1_TCGAAGA.setDescription(None) -vocabulary_term_INDEX1_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_INDEX1_TCGAAGA.setOrdinal(88) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGAAGA) - -vocabulary_term_INDEX1_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_INDEX1_TCGGCAA.setDescription(None) -vocabulary_term_INDEX1_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_INDEX1_TCGGCAA.setOrdinal(89) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGGCAA) - -vocabulary_term_INDEX1_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setDescription(None) -vocabulary_term_INDEX1_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setOrdinal(90) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTCAAC) - -vocabulary_term_INDEX1_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setDescription(None) -vocabulary_term_INDEX1_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setOrdinal(91) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AATGCGA) - -vocabulary_INDEX2 = tr.getOrCreateNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setInternalNamespace(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_KIT = tr.getOrCreateNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setInternalNamespace(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(4) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(5) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(6) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(7) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(8) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(9) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(10) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(11) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(12) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(13) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_MACS_VERSION = tr.getOrCreateNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setInternalNamespace(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(1) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(2) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_MISMATCH_IN_INDEX = tr.getOrCreateNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setInternalNamespace(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_NANO_DROP = tr.getOrCreateNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setInternalNamespace(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.getOrCreateNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setInternalNamespace(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\ Inherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\ Inherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription('Genbank common name: baker\'s yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\ Inherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(10) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(11) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(12) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(13) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(14) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(15) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(16) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(17) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\ Pasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\ Ebert D, Rainey P, Embley TM, Scholz D. Development, life\ cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate \ endoparasite of Daphnia magna Straus. Philos Trans R Soc \ Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(22) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('Common name: cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('Common name: bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription('Common name: water flea') -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription('Common name: earwig') -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel('Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_PIPELINE_VERSION = tr.getOrCreateNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setInternalNamespace(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(7) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(8) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(9) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(10) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(11) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(12) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(15) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_REQUIRED_LANES = tr.getOrCreateNewVocabulary('REQUIRED_LANES') -vocabulary_REQUIRED_LANES.setDescription('Amount of lanes needed for this probe') -vocabulary_REQUIRED_LANES.setUrlTemplate(None) -vocabulary_REQUIRED_LANES.setManagedInternally(False) -vocabulary_REQUIRED_LANES.setInternalNamespace(False) -vocabulary_REQUIRED_LANES.setChosenFromList(True) - -vocabulary_term_REQUIRED_LANES_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_REQUIRED_LANES_1.setDescription(None) -vocabulary_term_REQUIRED_LANES_1.setLabel(None) -vocabulary_term_REQUIRED_LANES_1.setOrdinal(1) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_1) - -vocabulary_term_REQUIRED_LANES_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_REQUIRED_LANES_2.setDescription(None) -vocabulary_term_REQUIRED_LANES_2.setLabel(None) -vocabulary_term_REQUIRED_LANES_2.setOrdinal(2) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_2) - -vocabulary_term_REQUIRED_LANES_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_REQUIRED_LANES_3.setDescription(None) -vocabulary_term_REQUIRED_LANES_3.setLabel(None) -vocabulary_term_REQUIRED_LANES_3.setOrdinal(3) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_3) - -vocabulary_term_REQUIRED_LANES_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_REQUIRED_LANES_4.setDescription(None) -vocabulary_term_REQUIRED_LANES_4.setLabel(None) -vocabulary_term_REQUIRED_LANES_4.setOrdinal(4) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_4) - -vocabulary_term_REQUIRED_LANES_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_REQUIRED_LANES_5.setDescription(None) -vocabulary_term_REQUIRED_LANES_5.setLabel(None) -vocabulary_term_REQUIRED_LANES_5.setOrdinal(5) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_5) - -vocabulary_term_REQUIRED_LANES_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_REQUIRED_LANES_6.setDescription(None) -vocabulary_term_REQUIRED_LANES_6.setLabel(None) -vocabulary_term_REQUIRED_LANES_6.setOrdinal(6) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_6) - -vocabulary_term_REQUIRED_LANES_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_REQUIRED_LANES_7.setDescription(None) -vocabulary_term_REQUIRED_LANES_7.setLabel(None) -vocabulary_term_REQUIRED_LANES_7.setOrdinal(7) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_7) - -vocabulary_term_REQUIRED_LANES_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_REQUIRED_LANES_8.setDescription(None) -vocabulary_term_REQUIRED_LANES_8.setLabel(None) -vocabulary_term_REQUIRED_LANES_8.setOrdinal(8) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_8) - -vocabulary_term_REQUIRED_LANES_9 = tr.createNewVocabularyTerm('9') -vocabulary_term_REQUIRED_LANES_9.setDescription(None) -vocabulary_term_REQUIRED_LANES_9.setLabel(None) -vocabulary_term_REQUIRED_LANES_9.setOrdinal(9) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_9) - -vocabulary_term_REQUIRED_LANES_10 = tr.createNewVocabularyTerm('10') -vocabulary_term_REQUIRED_LANES_10.setDescription(None) -vocabulary_term_REQUIRED_LANES_10.setLabel(None) -vocabulary_term_REQUIRED_LANES_10.setOrdinal(10) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_10) - -vocabulary_term_REQUIRED_LANES_11 = tr.createNewVocabularyTerm('11') -vocabulary_term_REQUIRED_LANES_11.setDescription(None) -vocabulary_term_REQUIRED_LANES_11.setLabel(None) -vocabulary_term_REQUIRED_LANES_11.setOrdinal(11) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_11) - -vocabulary_term_REQUIRED_LANES_12 = tr.createNewVocabularyTerm('12') -vocabulary_term_REQUIRED_LANES_12.setDescription(None) -vocabulary_term_REQUIRED_LANES_12.setLabel(None) -vocabulary_term_REQUIRED_LANES_12.setOrdinal(12) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_12) - -vocabulary_term_REQUIRED_LANES_13 = tr.createNewVocabularyTerm('13') -vocabulary_term_REQUIRED_LANES_13.setDescription(None) -vocabulary_term_REQUIRED_LANES_13.setLabel(None) -vocabulary_term_REQUIRED_LANES_13.setOrdinal(13) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_13) - -vocabulary_term_REQUIRED_LANES_14 = tr.createNewVocabularyTerm('14') -vocabulary_term_REQUIRED_LANES_14.setDescription(None) -vocabulary_term_REQUIRED_LANES_14.setLabel(None) -vocabulary_term_REQUIRED_LANES_14.setOrdinal(14) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_14) - -vocabulary_term_REQUIRED_LANES_15 = tr.createNewVocabularyTerm('15') -vocabulary_term_REQUIRED_LANES_15.setDescription(None) -vocabulary_term_REQUIRED_LANES_15.setLabel(None) -vocabulary_term_REQUIRED_LANES_15.setOrdinal(15) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_15) - -vocabulary_term_REQUIRED_LANES_16 = tr.createNewVocabularyTerm('16') -vocabulary_term_REQUIRED_LANES_16.setDescription(None) -vocabulary_term_REQUIRED_LANES_16.setLabel(None) -vocabulary_term_REQUIRED_LANES_16.setOrdinal(16) -vocabulary_REQUIRED_LANES.addTerm(vocabulary_term_REQUIRED_LANES_16) - -vocabulary_SAMPLE_LIBRARY_SELECTION = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_SELECTION') -vocabulary_SAMPLE_LIBRARY_SELECTION.setDescription('Describes whether any method was used to select and/or enrich the material being sequenced.') -vocabulary_SAMPLE_LIBRARY_SELECTION.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SELECTION.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setDescription('Chromatin immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setLabel('ChIP') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CHIP) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE = tr.createNewVocabularyTerm('MNASE') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setDescription('Micrococcal Nuclease (MNase) digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setLabel('MNase') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MNASE) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST = tr.createNewVocabularyTerm('RESTRICTION_DIGEST') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setDescription('Restriction enzyme digestion') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setLabel('Restriction Digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RESTRICTION_DIGEST) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY = tr.createNewVocabularyTerm('5-METHYLCYTIDINE_ANTIBODY') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setDescription('Methylated DNA immunoprecipitation') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setLabel('5-methylcytidine antibody') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_5METHYLCYTIDINE_ANTIBODY) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM = tr.createNewVocabularyTerm('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setDescription('Random shearing only') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setLabel('RANDOM') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF = tr.createNewVocabularyTerm('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setDescription('Methyl Filtrated') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setLabel('MF') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MF) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL = tr.createNewVocabularyTerm('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setDescription('Methylation Spanning Linking Library') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setLabel('MSLL') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_MSLL) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR = tr.createNewVocabularyTerm('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setDescription('Hypo-methylated partial restriction digest') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setLabel('HMPR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_HMPR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA = tr.createNewVocabularyTerm('CDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setDescription('complementary DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setLabel('cDNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CDNA) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR = tr.createNewVocabularyTerm('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setDescription('Source material was selected by designed primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setLabel('PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR = tr.createNewVocabularyTerm('RANDOM_PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setDescription('Source material was selected by randomly generated primers') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setLabel('RANDOM PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RANDOM_PCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR = tr.createNewVocabularyTerm('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setDescription('Source material was selected by reverse transcription PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setLabel('RT-PCR') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_RTPCR) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS = tr.createNewVocabularyTerm('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setDescription('Cot-filtered single/low-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setLabel('CF-S') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFS) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM = tr.createNewVocabularyTerm('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setDescription('Cot-filtered moderately repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setLabel('CF-M') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFM) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH = tr.createNewVocabularyTerm('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setDescription('Cot-filtered highly repetitive genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setLabel('CF-H') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFH) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT = tr.createNewVocabularyTerm('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setDescription('Cot-filtered theoretical single-copy genomic DNA') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setLabel('CF-T') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_CFT) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setLabel('other') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_OTHER) - -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED = tr.createNewVocabularyTerm('UNSPECIFIED') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setLabel('unspecified') -vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED.setOrdinal(18) -vocabulary_SAMPLE_LIBRARY_SELECTION.addTerm(vocabulary_term_SAMPLE_LIBRARY_SELECTION_UNSPECIFIED) - -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_SOURCE_VOC') -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setDescription(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC = tr.createNewVocabularyTerm('GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_GENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_NONGENOMIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_SYNTHETIC) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_VIRAL) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA = tr.createNewVocabularyTerm('RNA') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_RNA) - -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setDescription(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setLabel(None) -vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_SOURCE_VOC.addTerm(vocabulary_term_SAMPLE_LIBRARY_SOURCE_VOC_OTHER) - -vocabulary_SAMPLE_LIBRARY_STRATEGY = tr.getOrCreateNewVocabulary('SAMPLE_LIBRARY_STRATEGY') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setDescription('Sequencing technique for this library.') -vocabulary_SAMPLE_LIBRARY_STRATEGY.setUrlTemplate(None) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) -vocabulary_SAMPLE_LIBRARY_STRATEGY.setChosenFromList(True) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ = tr.createNewVocabularyTerm('CHIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setDescription('Direct sequencing of chromatin immunoprecipitates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setLabel('ChIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ.setOrdinal(1) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CHIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ = tr.createNewVocabularyTerm('RNA-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setDescription('RNA sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setLabel('RNA-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ.setOrdinal(2) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_RNASEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ = tr.createNewVocabularyTerm('MEDIP-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setDescription('Methylated DNA immunoprecipitation sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setLabel('MeDIP-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ.setOrdinal(3) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MEDIPSEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ = tr.createNewVocabularyTerm('MNASE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setDescription('Direct sequencing following MNase digestion') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setLabel('MNase-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ.setOrdinal(4) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MNASESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ = tr.createNewVocabularyTerm('MRE-SEQ') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setDescription('Methylation-sensitive restriction enzyme sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setLabel('MRE-Seq') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ.setOrdinal(5) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_MRESEQ) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST = tr.createNewVocabularyTerm('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setDescription('Single pass sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setLabel('EST') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST.setOrdinal(6) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_EST) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA = tr.createNewVocabularyTerm('FL-CDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setDescription('Full-length sequencing of cDNA templates') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setLabel('FL-cDNA') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA.setOrdinal(7) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FLCDNA) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS = tr.createNewVocabularyTerm('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setDescription('Concatenated Tag Sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setLabel('CTS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS.setOrdinal(8) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CTS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE = tr.createNewVocabularyTerm('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setDescription('Sequencing of products that have been tagged with a short identifying sequence (barcode)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setLabel('BARCODE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE.setOrdinal(9) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_BARCODE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND = tr.createNewVocabularyTerm('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setDescription('"Clone end (5\', 3\', or both) sequencing"') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setLabel('CLONEEND') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND.setOrdinal(10) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONEEND) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS = tr.createNewVocabularyTerm('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setDescription('Whole genome shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setLabel('WGS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS.setOrdinal(11) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WGS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS = tr.createNewVocabularyTerm('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setDescription('Whole chromosome (or other replicon) shotgun') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setLabel('WCS') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS.setOrdinal(12) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_WCS) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE = tr.createNewVocabularyTerm('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setDescription('Genomic clone based (hierarchical) sequencing') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setLabel('CLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE.setOrdinal(13) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_CLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE = tr.createNewVocabularyTerm('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setDescription('Shotgun of pooled clones (usually BACs and Fosmids)') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setLabel('POOLCLONE') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE.setOrdinal(14) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_POOLCLONE) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON = tr.createNewVocabularyTerm('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setDescription('Sequencing of overlapping or distinct PCR or RT-PCR products') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setLabel('AMPLICON') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON.setOrdinal(15) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_AMPLICON) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING = tr.createNewVocabularyTerm('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setDescription('Sequencing intended to finish (close) gaps in existing coverage') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setLabel('FINISHING') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING.setOrdinal(16) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_FINISHING) - -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setDescription('Library strategy not listed') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setLabel('OTHER') -vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER.setOrdinal(17) -vocabulary_SAMPLE_LIBRARY_STRATEGY.addTerm(vocabulary_term_SAMPLE_LIBRARY_STRATEGY_OTHER) - -vocabulary_SAMPLE_MOLECULE = tr.getOrCreateNewVocabulary('SAMPLE_MOLECULE') -vocabulary_SAMPLE_MOLECULE.setDescription(None) -vocabulary_SAMPLE_MOLECULE.setUrlTemplate(None) -vocabulary_SAMPLE_MOLECULE.setManagedInternally(False) -vocabulary_SAMPLE_MOLECULE.setInternalNamespace(False) -vocabulary_SAMPLE_MOLECULE.setChosenFromList(True) - -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA.setOrdinal(1) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_TOTAL_RNA) - -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA = tr.createNewVocabularyTerm('POLYA_RNA') -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA.setOrdinal(2) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_POLYA_RNA) - -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA = tr.createNewVocabularyTerm('CYTOPLASMIC_RNA') -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA.setOrdinal(3) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_CYTOPLASMIC_RNA) - -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA = tr.createNewVocabularyTerm('NUCLEAR_RNA') -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA.setOrdinal(4) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_NUCLEAR_RNA) - -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA.setOrdinal(5) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_MOLECULE_PROTEIN = tr.createNewVocabularyTerm('PROTEIN') -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_PROTEIN.setOrdinal(6) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_PROTEIN) - -vocabulary_term_SAMPLE_MOLECULE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_MOLECULE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_MOLECULE_OTHER.setOrdinal(7) -vocabulary_SAMPLE_MOLECULE.addTerm(vocabulary_term_SAMPLE_MOLECULE_OTHER) - -vocabulary_SAMPLE_TYPE = tr.getOrCreateNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setInternalNamespace(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(12) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(2) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_SCS_PROTOCOL_VERSION = tr.getOrCreateNewVocabulary('SCS_PROTOCOL_VERSION') -vocabulary_SCS_PROTOCOL_VERSION.setDescription('THE Illumina protocol') -vocabulary_SCS_PROTOCOL_VERSION.setUrlTemplate(None) -vocabulary_SCS_PROTOCOL_VERSION.setManagedInternally(False) -vocabulary_SCS_PROTOCOL_VERSION.setInternalNamespace(False) -vocabulary_SCS_PROTOCOL_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_PROTOCOL_VERSION_V8 = tr.createNewVocabularyTerm('V8') -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V8.setOrdinal(1) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V8) - -vocabulary_term_SCS_PROTOCOL_VERSION_V6 = tr.createNewVocabularyTerm('V6') -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V6.setOrdinal(2) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V6) - -vocabulary_term_SCS_PROTOCOL_VERSION_V7 = tr.createNewVocabularyTerm('V7') -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setDescription(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setLabel(None) -vocabulary_term_SCS_PROTOCOL_VERSION_V7.setOrdinal(3) -vocabulary_SCS_PROTOCOL_VERSION.addTerm(vocabulary_term_SCS_PROTOCOL_VERSION_V7) - -vocabulary_SCS_SOFTWARE_VERSION = tr.getOrCreateNewVocabulary('SCS_SOFTWARE_VERSION') -vocabulary_SCS_SOFTWARE_VERSION.setDescription('Software version of the Sequencing PC attached to the GA') -vocabulary_SCS_SOFTWARE_VERSION.setUrlTemplate(None) -vocabulary_SCS_SOFTWARE_VERSION.setManagedInternally(False) -vocabulary_SCS_SOFTWARE_VERSION.setInternalNamespace(False) -vocabulary_SCS_SOFTWARE_VERSION.setChosenFromList(True) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515 = tr.createNewVocabularyTerm('HCS_1.5.15') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setLabel('HCS 1.5.15/1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515.setOrdinal(1) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_1515) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145 = tr.createNewVocabularyTerm('HCS_1.4.5') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setLabel('HCS 1.4.5/RTA 1.12.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145.setOrdinal(2) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_145) - -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14 = tr.createNewVocabularyTerm('HCS_1.4') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setLabel('HCS 1.4/RTA 1.12') -vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14.setOrdinal(3) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_HCS_14) - -vocabulary_term_SCS_SOFTWARE_VERSION_210 = tr.createNewVocabularyTerm('2.10') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_210.setLabel('2.10/RTA 1.13.48') -vocabulary_term_SCS_SOFTWARE_VERSION_210.setOrdinal(4) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_210) - -vocabulary_term_SCS_SOFTWARE_VERSION_29 = tr.createNewVocabularyTerm('2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_29.setLabel('2.9/RTA2.9') -vocabulary_term_SCS_SOFTWARE_VERSION_29.setOrdinal(5) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_29) - -vocabulary_term_SCS_SOFTWARE_VERSION_28 = tr.createNewVocabularyTerm('2.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_28.setLabel('2.8/RTA 1.8') -vocabulary_term_SCS_SOFTWARE_VERSION_28.setOrdinal(6) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_28) - -vocabulary_term_SCS_SOFTWARE_VERSION_26 = tr.createNewVocabularyTerm('2.6') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_26.setLabel('2.6/RTA 1.6 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_26.setOrdinal(7) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_26) - -vocabulary_term_SCS_SOFTWARE_VERSION_25 = tr.createNewVocabularyTerm('2.5') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_25.setLabel('2.5 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_25.setOrdinal(8) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_25) - -vocabulary_term_SCS_SOFTWARE_VERSION_24 = tr.createNewVocabularyTerm('2.4') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setDescription(None) -vocabulary_term_SCS_SOFTWARE_VERSION_24.setLabel('2.4 (no longer in use)') -vocabulary_term_SCS_SOFTWARE_VERSION_24.setOrdinal(9) -vocabulary_SCS_SOFTWARE_VERSION.addTerm(vocabulary_term_SCS_SOFTWARE_VERSION_24) - -vocabulary_SEQUENCER = tr.getOrCreateNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setInternalNamespace(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_HISEQ2500 = tr.createNewVocabularyTerm('HISEQ2500') -vocabulary_term_SEQUENCER_HISEQ2500.setDescription(None) -vocabulary_term_SEQUENCER_HISEQ2500.setLabel(None) -vocabulary_term_SEQUENCER_HISEQ2500.setOrdinal(3) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_HISEQ2500) - -vocabulary_term_SEQUENCER_HISEQ2000 = tr.createNewVocabularyTerm('HISEQ2000') -vocabulary_term_SEQUENCER_HISEQ2000.setDescription(None) -vocabulary_term_SEQUENCER_HISEQ2000.setLabel(None) -vocabulary_term_SEQUENCER_HISEQ2000.setOrdinal(4) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_HISEQ2000) - -vocabulary_SEQUENCING_APPLICATION = tr.getOrCreateNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setInternalNamespace(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -exp_type_HT_SEQUENCING = tr.getOrCreateNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina HiSeq, Illumina GA)') - -samp_type_ILLUMINA_FLOW_CELL = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Container of ILLUMINA_FLOW_LANES') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setShowContainer(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParents(False) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('FLOWCELL-') - -samp_type_ILLUMINA_FLOW_LANE = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Child of LIBRARY or POOL') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setShowContainer(True) -samp_type_ILLUMINA_FLOW_LANE.setShowParents(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('FLOWLANE-') - -samp_type_LIBRARY = tr.getOrCreateNewSampleType('LIBRARY') -samp_type_LIBRARY.setDescription('Child of RAW and potential parent of POOL') -samp_type_LIBRARY.setListable(True) -samp_type_LIBRARY.setShowContainer(False) -samp_type_LIBRARY.setShowParents(True) -samp_type_LIBRARY.setSubcodeUnique(False) -samp_type_LIBRARY.setAutoGeneratedCode(True) -samp_type_LIBRARY.setGeneratedCodePrefix('QGF-LIBRARY-') - -samp_type_MASTER = tr.getOrCreateNewSampleType('MASTER') -samp_type_MASTER.setDescription('Sample Type holding Master Data and a parent to RAW') -samp_type_MASTER.setListable(True) -samp_type_MASTER.setShowContainer(False) -samp_type_MASTER.setShowParents(False) -samp_type_MASTER.setSubcodeUnique(False) -samp_type_MASTER.setAutoGeneratedCode(True) -samp_type_MASTER.setGeneratedCodePrefix('QGF-MASTER-') - -samp_type_POOL = tr.getOrCreateNewSampleType('POOL') -samp_type_POOL.setDescription('Child of several LIBRARY samples, used for multiplexing') -samp_type_POOL.setListable(True) -samp_type_POOL.setShowContainer(False) -samp_type_POOL.setShowParents(True) -samp_type_POOL.setSubcodeUnique(False) -samp_type_POOL.setAutoGeneratedCode(True) -samp_type_POOL.setGeneratedCodePrefix('QGF-POOL-') - -samp_type_RAW = tr.getOrCreateNewSampleType('RAW') -samp_type_RAW.setDescription('Child of MASTER') -samp_type_RAW.setListable(True) -samp_type_RAW.setShowContainer(False) -samp_type_RAW.setShowParents(True) -samp_type_RAW.setSubcodeUnique(False) -samp_type_RAW.setAutoGeneratedCode(True) -samp_type_RAW.setGeneratedCodePrefix('QGF-RAW-') - -data_set_type_ALIGNMENT = tr.getOrCreateNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') - -data_set_type_BASECALL_STATS = tr.getOrCreateNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics from the Illumina Pipeline (configureBclToFastq.pl)') - -data_set_type_BIGWIGGLE = tr.getOrCreateNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('Visualization') - -data_set_type_ELAND_ALIGNMENT = tr.getOrCreateNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') - -data_set_type_FASTQ_GZ = tr.getOrCreateNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') - -data_set_type_ILLUMINA_GA_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_GA_OUTPUT') -data_set_type_ILLUMINA_GA_OUTPUT.setDescription('The directory structure as produced by the Illumina GA Pipeline (whatever Illumina spits out)\ ') - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') - -data_set_type_MACS_OUTPUT = tr.getOrCreateNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') - -data_set_type_QUALITY_JPGS = tr.getOrCreateNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') - -data_set_type_QUALITY_PDFS = tr.getOrCreateNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') - -data_set_type_QUALITY_SVG = tr.getOrCreateNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') - -data_set_type_RUNINFO = tr.getOrCreateNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') - -data_set_type_THUMBNAILS = tr.getOrCreateNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') - -data_set_type_TSV = tr.getOrCreateNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') - -prop_type_AGILENT_KIT = tr.getOrCreateNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) -prop_type_AGILENT_KIT.setInternalNamespace(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.getOrCreateNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) -prop_type_ALIGNMENT_SOFTWARE.setInternalNamespace(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.getOrCreateNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) -prop_type_ANALYSIS_FINISHED.setInternalNamespace(False) - - -prop_type_BARCODE = tr.getOrCreateNewPropertyType('BARCODE', DataType.CONTROLLEDVOCABULARY) -prop_type_BARCODE.setLabel('Index 1') -prop_type_BARCODE.setManagedInternally(False) -prop_type_BARCODE.setInternalNamespace(False) - -prop_type_BARCODE.setVocabulary(vocabulary_INDEX1) - -prop_type_BARCODES = tr.getOrCreateNewPropertyType('BARCODES', DataType.MULTILINE_VARCHAR) -prop_type_BARCODES.setLabel('Adaptor and Barcodes') -prop_type_BARCODES.setManagedInternally(False) -prop_type_BARCODES.setInternalNamespace(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.getOrCreateNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) -prop_type_BARCODE_COMPLEXITY_CHECKER.setInternalNamespace(False) - - -prop_type_BARCODE_LENGTH = tr.getOrCreateNewPropertyType('BARCODE_LENGTH', DataType.INTEGER) -prop_type_BARCODE_LENGTH.setLabel('Barcode Length (+ recognition site)') -prop_type_BARCODE_LENGTH.setManagedInternally(False) -prop_type_BARCODE_LENGTH.setInternalNamespace(False) - - -prop_type_BAREBACKED = tr.getOrCreateNewPropertyType('BAREBACKED', DataType.BOOLEAN) -prop_type_BAREBACKED.setLabel('Barebacked?') -prop_type_BAREBACKED.setManagedInternally(False) -prop_type_BAREBACKED.setInternalNamespace(False) - - -prop_type_BASESCOVERED = tr.getOrCreateNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) -prop_type_BASESCOVERED.setInternalNamespace(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.getOrCreateNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setInternalNamespace(False) - - -prop_type_CALCLUATED_EXAMPLE = tr.getOrCreateNewPropertyType('CALCLUATED_EXAMPLE', DataType.REAL) -prop_type_CALCLUATED_EXAMPLE.setLabel('Calcluated_example') -prop_type_CALCLUATED_EXAMPLE.setManagedInternally(False) -prop_type_CALCLUATED_EXAMPLE.setInternalNamespace(False) - - -prop_type_CASAVA_VERSION = tr.getOrCreateNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) -prop_type_CASAVA_VERSION.setInternalNamespace(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.getOrCreateNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) -prop_type_CELL_PLASTICITY_SYSTEMSX.setInternalNamespace(False) - - -prop_type_CHROMCOUNT = tr.getOrCreateNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) -prop_type_CHROMCOUNT.setInternalNamespace(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.getOrCreateNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) -prop_type_CLUSTER_STATION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_STATION_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setLabel('CS Software version') -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_CLUSTER_STATION_SOFTWARE_VERSION.setVocabulary(vocabulary_CLUSTER_STATION_SOFTWARE_VERSION) - -prop_type_CONCENTRATION_FLOWLANE = tr.getOrCreateNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) -prop_type_CONCENTRATION_FLOWLANE.setInternalNamespace(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/\u03bcl]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel(u'Concentration (prepared) [ng/\u03bcl]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_CONCENTRATION_TOTAL = tr.getOrCreateNewPropertyType('CONCENTRATION_TOTAL', DataType.INTEGER) -prop_type_CONCENTRATION_TOTAL.setLabel(u'DNA concentration of library (ng/\u03bcl)') -prop_type_CONCENTRATION_TOTAL.setManagedInternally(False) -prop_type_CONCENTRATION_TOTAL.setInternalNamespace(False) - - -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY = tr.getOrCreateNewPropertyType('CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY', DataType.INTEGER) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setLabel('Conc. if sample="proc. DNA library" (nM)') -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setManagedInternally(False) -prop_type_CONC_IF_SAMPLE_PROCESSED_DNA_LIBRARY.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.getOrCreateNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) -prop_type_CONTACT_PERSON_EMAIL.setInternalNamespace(False) - - -prop_type_CONTACT_PERSON_NAME = tr.getOrCreateNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) -prop_type_CONTACT_PERSON_NAME.setInternalNamespace(False) - - -prop_type_CONTROL_LANE = tr.getOrCreateNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) -prop_type_CONTROL_LANE.setInternalNamespace(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.getOrCreateNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) -prop_type_CREATED_ON_CS.setInternalNamespace(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_CS_PROTOCOL_VERSION.setInternalNamespace(False) - - -prop_type_CYCLES = tr.getOrCreateNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Number of Cycles') -prop_type_CYCLES.setManagedInternally(False) -prop_type_CYCLES.setInternalNamespace(False) - - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER = tr.getOrCreateNewPropertyType('CYCLES_REQUESTED_BY_CUSTOMER', DataType.CONTROLLEDVOCABULARY) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setLabel('Cycles') -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setManagedInternally(False) -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setInternalNamespace(False) - -prop_type_CYCLES_REQUESTED_BY_CUSTOMER.setVocabulary(vocabulary_CYCLES) - -prop_type_DATA_TRANSFERRED = tr.getOrCreateNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) -prop_type_DATA_TRANSFERRED.setInternalNamespace(False) - - -prop_type_DESCRIPTION = tr.getOrCreateNewPropertyType('DESCRIPTION', DataType.VARCHAR) -prop_type_DESCRIPTION.setLabel('Description') -prop_type_DESCRIPTION.setManagedInternally(False) -prop_type_DESCRIPTION.setInternalNamespace(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setInternalNamespace(False) - - -prop_type_END_TYPE = tr.getOrCreateNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) -prop_type_END_TYPE.setInternalNamespace(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.getOrCreateNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) -prop_type_EXPERIMENT_DESIGN.setInternalNamespace(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.getOrCreateNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) -prop_type_EXTERNAL_SAMPLE_NAME.setInternalNamespace(False) - - -prop_type_FLOWCELLTYPE = tr.getOrCreateNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) -prop_type_FLOWCELLTYPE.setInternalNamespace(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.getOrCreateNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing date') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) -prop_type_FLOW_CELL_SEQUENCED_ON.setInternalNamespace(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setInternalNamespace(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.getOrCreateNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) -prop_type_ILLUMINA_PIPELINE_VERSION.setInternalNamespace(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX2 = tr.getOrCreateNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) -prop_type_INDEX2.setInternalNamespace(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.getOrCreateNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Length of Index Read1') -prop_type_INDEXREAD.setManagedInternally(False) -prop_type_INDEXREAD.setInternalNamespace(False) - - -prop_type_INDEXREAD2 = tr.getOrCreateNewPropertyType('INDEXREAD2', DataType.INTEGER) -prop_type_INDEXREAD2.setLabel('Length of Index Read2') -prop_type_INDEXREAD2.setManagedInternally(False) -prop_type_INDEXREAD2.setInternalNamespace(False) - - -prop_type_INVOICE = tr.getOrCreateNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) -prop_type_INVOICE.setInternalNamespace(False) - - -prop_type_ISCOMPRESSED = tr.getOrCreateNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) -prop_type_ISCOMPRESSED.setInternalNamespace(False) - - -prop_type_ISSUED_COMMAND = tr.getOrCreateNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) -prop_type_ISSUED_COMMAND.setInternalNamespace(False) - - -prop_type_ISSWAPPED = tr.getOrCreateNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) -prop_type_ISSWAPPED.setInternalNamespace(False) - - -prop_type_KIT = tr.getOrCreateNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) -prop_type_KIT.setInternalNamespace(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_ARRIVED = tr.getOrCreateNewPropertyType('KIT_ARRIVED', DataType.TIMESTAMP) -prop_type_KIT_ARRIVED.setLabel('Kit arrived') -prop_type_KIT_ARRIVED.setManagedInternally(False) -prop_type_KIT_ARRIVED.setInternalNamespace(False) - - -prop_type_KIT_PREPARED = tr.getOrCreateNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) -prop_type_KIT_PREPARED.setInternalNamespace(False) - - -prop_type_LANECOUNT = tr.getOrCreateNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) -prop_type_LANECOUNT.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_FAILED.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_POSSIBLE', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setLabel('Library Processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_POSSIBLE.setInternalNamespace(False) - - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setInternalNamespace(False) - - -prop_type_LOT = tr.getOrCreateNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) -prop_type_LOT.setInternalNamespace(False) - - -prop_type_MACS_VERSION = tr.getOrCreateNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) -prop_type_MACS_VERSION.setInternalNamespace(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.getOrCreateNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) -prop_type_MAPPED_READS.setInternalNamespace(False) - - -prop_type_MAX = tr.getOrCreateNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) -prop_type_MAX.setInternalNamespace(False) - - -prop_type_MEAN = tr.getOrCreateNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) -prop_type_MEAN.setInternalNamespace(False) - - -prop_type_MIN = tr.getOrCreateNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) -prop_type_MIN.setInternalNamespace(False) - - -prop_type_MISMATCH_IN_INDEX = tr.getOrCreateNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) -prop_type_MISMATCH_IN_INDEX.setInternalNamespace(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.getOrCreateNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) -prop_type_NANO_DROP.setInternalNamespace(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.getOrCreateNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) -prop_type_NCBI_ORGANISM_TAXONOMY.setInternalNamespace(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.getOrCreateNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) -prop_type_NM_DNA.setInternalNamespace(False) - - -prop_type_NOTES = tr.getOrCreateNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) -prop_type_NOTES.setInternalNamespace(False) - - -prop_type_NOTES_CUSTOMER = tr.getOrCreateNewPropertyType('NOTES_CUSTOMER', DataType.MULTILINE_VARCHAR) -prop_type_NOTES_CUSTOMER.setLabel('Notes Customer') -prop_type_NOTES_CUSTOMER.setManagedInternally(False) -prop_type_NOTES_CUSTOMER.setInternalNamespace(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.getOrCreateNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) -prop_type_NUMBER_OF_ATTACHMENTS.setInternalNamespace(False) - - -prop_type_ORGANISM_FREE = tr.getOrCreateNewPropertyType('ORGANISM_FREE', DataType.VARCHAR) -prop_type_ORGANISM_FREE.setLabel('Organism (if OTHER)') -prop_type_ORGANISM_FREE.setManagedInternally(False) -prop_type_ORGANISM_FREE.setInternalNamespace(False) - - -prop_type_OTRS = tr.getOrCreateNewPropertyType('OTRS', DataType.INTEGER) -prop_type_OTRS.setLabel('OTRS ID #') -prop_type_OTRS.setManagedInternally(False) -prop_type_OTRS.setInternalNamespace(False) - - -prop_type_PAIRED_END_KIT = tr.getOrCreateNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) -prop_type_PAIRED_END_KIT.setInternalNamespace(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.getOrCreateNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.getOrCreateNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) -prop_type_PERCENTAGE_PASSED_FILTERING.setInternalNamespace(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.getOrCreateNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setInternalNamespace(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.getOrCreateNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setInternalNamespace(False) - - -prop_type_PREPARED_BY = tr.getOrCreateNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) -prop_type_PREPARED_BY.setInternalNamespace(False) - - -prop_type_PRIMARYDATASIZE = tr.getOrCreateNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) -prop_type_PRIMARYDATASIZE.setInternalNamespace(False) - - -prop_type_PRIMARYINDEXSIZE = tr.getOrCreateNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) -prop_type_PRIMARYINDEXSIZE.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setInternalNamespace(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setInternalNamespace(False) - - -prop_type_REQUIRED_LANES = tr.getOrCreateNewPropertyType('REQUIRED_LANES', DataType.CONTROLLEDVOCABULARY) -prop_type_REQUIRED_LANES.setLabel('Number of Required Lanes') -prop_type_REQUIRED_LANES.setManagedInternally(False) -prop_type_REQUIRED_LANES.setInternalNamespace(False) - -prop_type_REQUIRED_LANES.setVocabulary(vocabulary_REQUIRED_LANES) - -prop_type_SAMPLE_CHARACTERISTICS = tr.getOrCreateNewPropertyType('SAMPLE_CHARACTERISTICS', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_CHARACTERISTICS.setLabel('Sample characteristics') -prop_type_SAMPLE_CHARACTERISTICS.setManagedInternally(False) -prop_type_SAMPLE_CHARACTERISTICS.setInternalNamespace(False) - - -prop_type_SAMPLE_DATA_PROCESSING = tr.getOrCreateNewPropertyType('SAMPLE_DATA_PROCESSING', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_DATA_PROCESSING.setLabel('Sample Data Processing') -prop_type_SAMPLE_DATA_PROCESSING.setManagedInternally(False) -prop_type_SAMPLE_DATA_PROCESSING.setInternalNamespace(False) - - -prop_type_SAMPLE_EXTRACT_PROTOCOL = tr.getOrCreateNewPropertyType('SAMPLE_EXTRACT_PROTOCOL', DataType.MULTILINE_VARCHAR) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setLabel('Sample Extract Protocol') -prop_type_SAMPLE_EXTRACT_PROTOCOL.setManagedInternally(False) -prop_type_SAMPLE_EXTRACT_PROTOCOL.setInternalNamespace(False) - - -prop_type_SAMPLE_ID = tr.getOrCreateNewPropertyType('SAMPLE_ID', DataType.VARCHAR) -prop_type_SAMPLE_ID.setLabel('Sample ID') -prop_type_SAMPLE_ID.setManagedInternally(False) -prop_type_SAMPLE_ID.setInternalNamespace(False) - - -prop_type_SAMPLE_KIND = tr.getOrCreateNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) -prop_type_SAMPLE_KIND.setInternalNamespace(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMPLE_LIBRARY_SELECTION = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_SELECTION', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SELECTION.setLabel('Sample Library Selection') -prop_type_SAMPLE_LIBRARY_SELECTION.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SELECTION.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SELECTION.setVocabulary(vocabulary_SAMPLE_LIBRARY_SELECTION) - -prop_type_SAMPLE_LIBRARY_SOURCE = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_SOURCE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_SOURCE.setLabel('Sample Library Source') -prop_type_SAMPLE_LIBRARY_SOURCE.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_SOURCE.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_SOURCE.setVocabulary(vocabulary_SAMPLE_LIBRARY_SOURCE_VOC) - -prop_type_SAMPLE_LIBRARY_STRATEGY = tr.getOrCreateNewPropertyType('SAMPLE_LIBRARY_STRATEGY', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_LIBRARY_STRATEGY.setLabel('Sample Library Strategy') -prop_type_SAMPLE_LIBRARY_STRATEGY.setManagedInternally(False) -prop_type_SAMPLE_LIBRARY_STRATEGY.setInternalNamespace(False) - -prop_type_SAMPLE_LIBRARY_STRATEGY.setVocabulary(vocabulary_SAMPLE_LIBRARY_STRATEGY) - -prop_type_SAMPLE_MOLECULE = tr.getOrCreateNewPropertyType('SAMPLE_MOLECULE', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_MOLECULE.setLabel('Sample molecule') -prop_type_SAMPLE_MOLECULE.setManagedInternally(False) -prop_type_SAMPLE_MOLECULE.setInternalNamespace(False) - -prop_type_SAMPLE_MOLECULE.setVocabulary(vocabulary_SAMPLE_MOLECULE) - -prop_type_SAMPLE_SOURCE_NAME = tr.getOrCreateNewPropertyType('SAMPLE_SOURCE_NAME', DataType.VARCHAR) -prop_type_SAMPLE_SOURCE_NAME.setLabel('Sample Source Name') -prop_type_SAMPLE_SOURCE_NAME.setManagedInternally(False) -prop_type_SAMPLE_SOURCE_NAME.setInternalNamespace(False) - - -prop_type_SAMTOOLS_FLAGSTAT = tr.getOrCreateNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) -prop_type_SAMTOOLS_FLAGSTAT.setInternalNamespace(False) - - -prop_type_SBS_KIT = tr.getOrCreateNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) -prop_type_SBS_KIT.setInternalNamespace(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -prop_type_SBS_SEQUENCING_KIT_VERSION.setInternalNamespace(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SCRIPT_TYPE = tr.getOrCreateNewPropertyType('SCRIPT_TYPE', DataType.REAL) -prop_type_SCRIPT_TYPE.setLabel('Script Type') -prop_type_SCRIPT_TYPE.setManagedInternally(False) -prop_type_SCRIPT_TYPE.setInternalNamespace(False) - - -prop_type_SCS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('SCS_PROTOCOL_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_PROTOCOL_VERSION.setLabel('SCS Protocol Version') -prop_type_SCS_PROTOCOL_VERSION.setManagedInternally(False) -prop_type_SCS_PROTOCOL_VERSION.setInternalNamespace(False) - -prop_type_SCS_PROTOCOL_VERSION.setVocabulary(vocabulary_SCS_PROTOCOL_VERSION) - -prop_type_SCS_SOFTWARE_VERSION = tr.getOrCreateNewPropertyType('SCS_SOFTWARE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SCS_SOFTWARE_VERSION.setLabel('SCS Software Version') -prop_type_SCS_SOFTWARE_VERSION.setManagedInternally(False) -prop_type_SCS_SOFTWARE_VERSION.setInternalNamespace(False) - -prop_type_SCS_SOFTWARE_VERSION.setVocabulary(vocabulary_SCS_SOFTWARE_VERSION) - -prop_type_SEQUENCER = tr.getOrCreateNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) -prop_type_SEQUENCER.setInternalNamespace(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.getOrCreateNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) -prop_type_SEQUENCER_FINISHED.setInternalNamespace(False) - - -prop_type_SEQUENCING_APPLICATION = tr.getOrCreateNewPropertyType('SEQUENCING_APPLICATION', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCING_APPLICATION.setLabel('Sequencing Application') -prop_type_SEQUENCING_APPLICATION.setManagedInternally(False) -prop_type_SEQUENCING_APPLICATION.setInternalNamespace(False) - -prop_type_SEQUENCING_APPLICATION.setVocabulary(vocabulary_SEQUENCING_APPLICATION) - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.getOrCreateNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setInternalNamespace(False) - - -prop_type_STD = tr.getOrCreateNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) -prop_type_STD.setInternalNamespace(False) - - -prop_type_SURFACECOUNT = tr.getOrCreateNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) -prop_type_SURFACECOUNT.setInternalNamespace(False) - - -prop_type_SWATHCOUNT = tr.getOrCreateNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) -prop_type_SWATHCOUNT.setInternalNamespace(False) - - -prop_type_TILECOUNT = tr.getOrCreateNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) -prop_type_TILECOUNT.setInternalNamespace(False) - - -prop_type_TOTAL_READS = tr.getOrCreateNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) -prop_type_TOTAL_READS.setInternalNamespace(False) - - -prop_type_UL_DNA = tr.getOrCreateNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) -prop_type_UL_DNA.setInternalNamespace(False) - - -prop_type_UL_EB = tr.getOrCreateNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) -prop_type_UL_EB.setInternalNamespace(False) - - -prop_type_UL_STOCK = tr.getOrCreateNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) -prop_type_UL_STOCK.setInternalNamespace(False) - - -prop_type_UNIQUE_BARCODES = tr.getOrCreateNewPropertyType('UNIQUE_BARCODES', DataType.VARCHAR) -prop_type_UNIQUE_BARCODES.setLabel('Unique Barcodes in Pool?') -prop_type_UNIQUE_BARCODES.setManagedInternally(False) -prop_type_UNIQUE_BARCODES.setInternalNamespace(False) - - -prop_type_VERSION = tr.getOrCreateNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) -prop_type_VERSION.setInternalNamespace(False) - - -prop_type_YIELD_MBASES = tr.getOrCreateNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) -prop_type_YIELD_MBASES.setInternalNamespace(False) - - -prop_type_ZOOMLEVELS = tr.getOrCreateNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) -prop_type_ZOOMLEVELS.setInternalNamespace(False) - - -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(7) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(8) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(9) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(13) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(14) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(15) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_BARCODE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_BARCODE) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_BARCODE.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(7) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(8) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(9) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(4) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(6) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2 = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD2) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(15) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(16) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(18) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(22) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(23) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_DATA_TRANSFERRED.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CREATED_ON_CS.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CS_PROTOCOL_VERSION.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(10) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CLUSTER_STATION_SOFTWARE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CLUSTER_STATION_SOFTWARE_VERSION.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setPositionInForms(12) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_SCS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SCS_PROTOCOL_VERSION.setPositionInForms(13) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(15) - -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND = tr.assignPropertyType(data_set_type_ILLUMINA_GA_OUTPUT, prop_type_SAMPLE_KIND) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setMandatory(False) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setSection(None) -assignment_DATA_SET_ILLUMINA_GA_OUTPUT_SAMPLE_KIND.setPositionInForms(3) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_BARCODE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_BARCODE) -assignment_SAMPLE_LIBRARY_BARCODE.setMandatory(False) -assignment_SAMPLE_LIBRARY_BARCODE.setSection(None) -assignment_SAMPLE_LIBRARY_BARCODE.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_INDEX2 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX2) -assignment_SAMPLE_LIBRARY_INDEX2.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX2.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX2.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setSection(None) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setPositionInForms(5) - -assignment_SAMPLE_LIBRARY_KIT_PREPARED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT_PREPARED) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setSection(None) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setPositionInForms(6) - -assignment_SAMPLE_LIBRARY_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT) -assignment_SAMPLE_LIBRARY_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_KIT.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_LOT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LOT) -assignment_SAMPLE_LIBRARY_LOT.setMandatory(False) -assignment_SAMPLE_LIBRARY_LOT.setSection(None) -assignment_SAMPLE_LIBRARY_LOT.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_LIBRARY, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection(None) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setSection(None) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_NANO_DROP.setSection(None) -assignment_SAMPLE_LIBRARY_NANO_DROP.setPositionInForms(11) - -assignment_SAMPLE_LIBRARY_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setPositionInForms(12) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setSection(None) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(13) - -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setPositionInForms(14) - -assignment_SAMPLE_LIBRARY_INVOICE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_INVOICE.setPositionInForms(15) - -assignment_SAMPLE_LIBRARY_NOTES = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_NOTES.setPositionInForms(16) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(3) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(4) - -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setSection(None) -assignment_SAMPLE_MASTER_CONTACT_PERSON_NAME.setPositionInForms(2) - -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_MASTER, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setMandatory(False) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_CONTACT_PERSON_EMAIL.setPositionInForms(3) - -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setSection(None) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(4) - -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_MASTER, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(False) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(5) - -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_MASTER, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_MASTER_EXTERNAL_SAMPLE_NAME.setPositionInForms(6) - -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_MASTER, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(False) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setSection(None) -assignment_SAMPLE_MASTER_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(7) - -assignment_SAMPLE_MASTER_SAMPLE_KIND = tr.assignPropertyType(samp_type_MASTER, prop_type_SAMPLE_KIND) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setMandatory(False) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_KIND.setPositionInForms(8) - -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION = tr.assignPropertyType(samp_type_MASTER, prop_type_SEQUENCING_APPLICATION) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setMandatory(False) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setSection(None) -assignment_SAMPLE_MASTER_SEQUENCING_APPLICATION.setPositionInForms(9) - -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_MASTER, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setMandatory(False) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setSection(None) -assignment_SAMPLE_MASTER_NCBI_ORGANISM_TAXONOMY.setPositionInForms(10) - -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_RAW, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setSection(None) -assignment_SAMPLE_RAW_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(2) - -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER = tr.assignPropertyType(samp_type_RAW, prop_type_CYCLES_REQUESTED_BY_CUSTOMER) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setMandatory(False) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setSection(None) -assignment_SAMPLE_RAW_CYCLES_REQUESTED_BY_CUSTOMER.setPositionInForms(3) - -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE = tr.assignPropertyType(samp_type_RAW, prop_type_LIBRARY_PROCESSING_POSSIBLE) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setMandatory(False) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setSection(None) -assignment_SAMPLE_RAW_LIBRARY_PROCESSING_POSSIBLE.setPositionInForms(4) - -assignment_SAMPLE_RAW_PREPARED_BY = tr.assignPropertyType(samp_type_RAW, prop_type_PREPARED_BY) -assignment_SAMPLE_RAW_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_RAW_PREPARED_BY.setSection(None) -assignment_SAMPLE_RAW_PREPARED_BY.setPositionInForms(5) - -assignment_SAMPLE_RAW_KIT_PREPARED = tr.assignPropertyType(samp_type_RAW, prop_type_KIT_PREPARED) -assignment_SAMPLE_RAW_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_RAW_KIT_PREPARED.setSection(None) -assignment_SAMPLE_RAW_KIT_PREPARED.setPositionInForms(6) - -assignment_SAMPLE_RAW_INVOICE = tr.assignPropertyType(samp_type_RAW, prop_type_INVOICE) -assignment_SAMPLE_RAW_INVOICE.setMandatory(False) -assignment_SAMPLE_RAW_INVOICE.setSection(None) -assignment_SAMPLE_RAW_INVOICE.setPositionInForms(7) - -assignment_SAMPLE_RAW_NOTES = tr.assignPropertyType(samp_type_RAW, prop_type_NOTES) -assignment_SAMPLE_RAW_NOTES.setMandatory(False) -assignment_SAMPLE_RAW_NOTES.setSection(None) -assignment_SAMPLE_RAW_NOTES.setPositionInForms(8) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/data-sources/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/data-sources/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py deleted file mode 100755 index 9b7f600f561..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/create-flowcell-dropbox.py +++ /dev/null @@ -1,195 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='TEST' -FLOWCELL_PROJECT='TEST-PROJECT' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -INSTRUMENT = {'SN792':'HISEQ2500'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - # Get the incoming name - name = incoming.getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - pass - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - space.setDescription("A test space") - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - project.setDescription("A demo project") - expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - newFlowCell.setExperiment(exp) - - if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", INSTRUMENT[sequencer[0].text]) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties deleted file mode 100644 index 9480a66c84c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-dropbox/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/incoming-create-flowcell -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index a63f60f88c0..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,194 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - # Get the incoming name - name = incoming.getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - pass - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - space.setDescription("A test space") - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - project.setDescription("A demo project") - expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - newFlowCell.setExperiment(exp) - - if IS_HISEQ_RUN: - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - if IS_HISEQ_RUN: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - else: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py deleted file mode 100755 index 6188431519d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py +++ /dev/null @@ -1,199 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -RUNPARAMETERS = 'RunParameters.xml' -#RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - - # ----------------------------------------------------------------------------- - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - print RTAversion - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", readMap['1'][0]) - - indexCount = 0 - readCount = 0 - - for e in readMap: - if readMap[e][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if indexCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - [registerFlowLane(lane, transaction, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties deleted file mode 100644 index 1c15a550f60..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/dss/create-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties deleted file mode 100644 index 1337bde948b..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py deleted file mode 100755 index df7c525e37c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py +++ /dev/null @@ -1,538 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - def sampleSearch(Code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, Code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -#-------------------------------------------------------------------------------------------------------------------------------------- - - def searchDataSetsofSample(sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -#-------------------------------------------------------------------------------------------------------------------------------------- - - def getIndexesofDataSetsofSample(sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - - - flowcell, lanes, numberOfLanes = sampleSearch(name) - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1[:-1]] - try: - searchIndex1 = searchIndex1[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-1]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index ef56111b768..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 1e68261b6de..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 6efcd1eb5df..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,72 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX -expected incoming Name for MiSeq runs: 121218_M00721_0017_000000000-A0T19 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingPath)) - foundSamples = search_service.searchForSamples(sc) - - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties deleted file mode 100644 index 26d6bb1da8d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bigwig/ -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bigwig.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py deleted file mode 100755 index 31a0863709f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bigwig/register-bigwig.py +++ /dev/null @@ -1,140 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(prop)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BIGWIGGLE") - dataSet.setMeasuredData(False) - - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw - split=name.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BWs: - for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = BIGWIGINFO + matches[0] - #print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - dictProp = convertListToDict(properties) - #print(dictProp) - - dataSet.setPropertyValue("VERSION", dictProp['version']) - dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) - dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) - dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) - dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) - dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) - dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) - dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) - dataSet.setPropertyValue("MEAN", dictProp['mean']) - dataSet.setPropertyValue("MIN", dictProp['min']) - dataSet.setPropertyValue("MAX", dictProp['max']) - dataSet.setPropertyValue("STD", dictProp['std']) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties deleted file mode 100644 index f0fac2c142a..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bowtie -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bowtie.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py deleted file mode 100644 index 11f72f74faf..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-bowtie/register-bowtie.py +++ /dev/null @@ -1,130 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bowtie/' -SAMTOOLS='/links/application/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def programParameters (programList): - ''' - Extracts the aligner datils from the bam header - ''' - elements = {} - for program in range(0, len(programList)): - line = programList[program].split('\t') - - for element in range (1, len(line)): - key, value = line[element].split(":") - elements[key] = value - - return elements - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - - # Get the incoming name - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/Sample_BSSE-DSU-1662/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bam - split=incomingPath.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BAMS: - for root, dirnames, filenames in os.walk(FOLDER + incomingPath): - for filename in fnmatch.filter(filenames, BAM_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = SAMTOOLS + ' view -H ' + matches[0] - print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - for s in range (0, len(searchStrings)): - programList = listSearch (properties, searchStrings[s]) - print(programList) - - e = programParameters (programList) - - dataSet.setPropertyValue("ALIGNMENT_SOFTWARE", e['ID']) - dataSet.setPropertyValue("VERSION", e['VN']) - dataSet.setPropertyValue("ISSUED_COMMAND", e['CL']) - - - arguments = SAMTOOLS + ' flagstat ' + matches[0] - - cmdResult=os.popen(arguments).read() - totalReads=cmdResult.split('\n')[0].split(' ')[0] - mappedReads=cmdResult.split('\n')[2].split(' ')[0] - - dataSet.setPropertyValue("SAMTOOLS_FLAGSTAT", cmdResult) - dataSet.setPropertyValue("TOTAL_READS", totalReads) - dataSet.setPropertyValue("MAPPED_READS", mappedReads) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 353a2b7aa8a..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index 26c09f2d4af..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - fcAndLane = incomingFolder.split("_",1)[-1] - flowCell, flowLane = fcAndLane.rsplit("_",1) - print flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties deleted file mode 100644 index 9c4e3bbc2c1..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/incoming-register-flowcell -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py deleted file mode 100644 index 48c1f20c76e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-dropbox/register-flowcell-dropbox.py +++ /dev/null @@ -1,66 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN = False - -DATASET_TYPE_HISEQ = "ILLUMINA_HISEQ_OUTPUT" -DATASET_TYPE_GA = "ILLUMINA_GA_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - - # Get the incoming name - name = transaction.getIncoming().getName() - - split = name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet(DATASET_TYPE_HISEQ) - IS_HISEQ_RUN = True - if (len(split) == 2): - dataSet = transaction.createNewDataSet(DATASET_TYPE_GA) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties deleted file mode 100644 index 8730e628162..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py deleted file mode 100644 index 3048b4473d3..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py +++ /dev/null @@ -1,97 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False - -RUNINFO_FOLDER='/links/shared/dsu/dss/register-runstatistics/' -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - IS_HISEQ_RUN=True - if (len(split) == 2): - dataSet = transaction.createNewDataSet("ILLUMINA_GA_OUTPUT") - - #move RunInfo into a different drop box - runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) - runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) - runInfoList = runInfoSample + runInfoReport - os.makedirs(RUNINFO_FOLDER + name + '/Data/') - for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, RUNINFO_FOLDER + name + '/Data/' + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, RUNINFO_FOLDER + name + '/Data/') - except (IOError, os.error), why: - print (runInfo, RUNINFO_FOLDER + name, str(why)) - - touch_markerfile(RUNINFO_FOLDER+MARKER_STRING+name) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties deleted file mode 100644 index 7f274a70db5..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py deleted file mode 100644 index c9321e6c87e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py +++ /dev/null @@ -1,60 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_MISEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - flowCellId = transaction.getIncoming().getName() - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 8279053de36..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,279 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane - # expected Project_120112_63537AAXX_1 - if (len(split) ==4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ flowCellId + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - # ------------------------------------------------------------------------------- - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - # BSSE-1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - # BSSE_QGF_10002_121130_SN792_0189_AD1FBTACXX_1_NoIndex_L001_R1_001.fastq.gz - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - - print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - print "Folder split: " + folderSplit - print str(parentCode) - - if (parentCode == folderSplit): - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - print parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - extraCopy (affiliation_name, file) - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties deleted file mode 100644 index 51c2eec3813..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py deleted file mode 100755 index 5174af1295c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py +++ /dev/null @@ -1,203 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from itertools import islice, chain -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliationName, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - - -# ------------------------------------------------------------------------------- - -def searchForLane(lane, search_service): - - sc = SearchCriteria() - print('Processing sample: '+ str(lane)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, lane)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + lane) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + lane) - else : - foundLane = foundSamples[0] - - return foundLane - - -# ------------------------------------------------------------------------------- - -def searchForParents (parents, search_service): - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -# ------------------------------------------------------------------------------- -''' -def batch(iterable, size): - sourceiter = iter(iterable) - while True: - batchiter = islice(sourceiter, size) - yield chain([batchiter.next()], batchiter) -''' -# ------------------------------------------------------------------------------- - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - - # Get the incoming name - name = transaction.getIncoming().getName() - miSeqLane = name + ':1' - - # Get the search service - search_service = transaction.getSearchService() - - lane = searchForLane(miSeqLane, search_service) - - # get all fastqs in this dataSet - fastqFileList=getFileNames(incomingPath) - fastqFileList.sort() - - while fastqFileList: - - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - if len(fastqFileList) == 1: - transaction.moveFile(fastqFileList.pop(0) , dataSet) - else: - try: - currentFullPath , currentFilename = os.path.split(fastqFileList[0]) - nextFullPath , nextFilename = os.path.split(fastqFileList[1]) - - newpath = currentFullPath + "/fastq" - if not os.path.exists(newpath): - os.makedirs(newpath) - - if currentFilename.rsplit('_',2)[0] == nextFilename.rsplit('_',2)[0]: - shutil.move(fastqFileList.pop(0), newpath) - shutil.move(fastqFileList.pop(0), newpath) - transaction.moveFile(newpath , dataSet) - else: - transaction.moveFile(fastqFileList.pop(0) , dataSet) - except: - pass - dataSet.setSample(lane) - - sa = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties deleted file mode 100644 index 9d5511bd58c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-macs -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-macs.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py deleted file mode 100755 index 17a9d5b074c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-macs/register-macs.py +++ /dev/null @@ -1,22 +0,0 @@ - -def process(transaction): - # Create a data set and set type - dataSet = transaction.createNewDataSet("MACS_OUTPUT") - dataSet.setPropertyValue("MACS_VERSION", "1.4.0RC2") - dataSet.setMeasuredData(False) - - incomingPath = incoming.getAbsolutePath() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # rsplit not in Python 2.2 - #sampleName = ":".join(incomingPath.split("/")[-1].rsplit("_",1)) - flowCell = "_".join((incomingPath.split("/")[-1].split("_")[2:-1])) - lane = (incomingPath.split("/")[-1]).split("_")[-1] - sampleName = flowCell + ":" + lane - - # Set the owner of the data set -- the specified sample - sample = transaction.getSample("/BSSE_BEISEL/" + sampleName) - - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f224..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index d7b8b8400d3..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=incomingFolder.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - IS_HISEQ_RUN=False - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties deleted file mode 100644 index 5b89e279f2f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-thumbnails -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-thumbnails.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py deleted file mode 100644 index 60937ed4520..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py +++ /dev/null @@ -1,55 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("THUMBNAILS") - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index 8b820561056..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,179 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-hiseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] - if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - - #move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) - # move all files is data set - [transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] - # move base call stat dir into data set - print("flowcell: "+flowcell) - transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/maintenance-tasks/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/maintenance-tasks/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/reporting-plugins/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/reporting-plugins/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/services/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/1/dss/services/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py deleted file mode 100644 index 9ce62f58469..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/as/initialize-master-data.py +++ /dev/null @@ -1,2792 +0,0 @@ -# -*- coding: utf-8 -*- -import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.DataType as DataType - -print ("Importing Master Data...") - -tr = service.transaction() - - -file_type_FASTQ_PHRED_64 = tr.getOrCreateNewFileFormatType('FASTQ_PHRED_64') -file_type_FASTQ_PHRED_64.setDescription('FastQ Format with PHRED+64 quality values (as deliverd by Illumina GA Pipeline >= 1.3)') - -print "Imported 7 File Formats" -vocabulary_AGILENT_KIT = tr.getOrCreateNewVocabulary('AGILENT_KIT') -vocabulary_AGILENT_KIT.setDescription(None) -vocabulary_AGILENT_KIT.setUrlTemplate(None) -vocabulary_AGILENT_KIT.setManagedInternally(False) -vocabulary_AGILENT_KIT.setChosenFromList(True) - -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000 = tr.createNewVocabularyTerm('AGILENT_DNA_KIT_1000') -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000.setOrdinal(1) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_DNA_KIT_1000) - -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT = tr.createNewVocabularyTerm('AGILENT_HIGH_SENSITIVITY_DNA_KIT') -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setDescription(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setLabel(None) -vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT.setOrdinal(2) -vocabulary_AGILENT_KIT.addTerm(vocabulary_term_AGILENT_KIT_AGILENT_HIGH_SENSITIVITY_DNA_KIT) - -vocabulary_ALIGNMENT_SOFTWARE = tr.getOrCreateNewVocabulary('ALIGNMENT_SOFTWARE') -vocabulary_ALIGNMENT_SOFTWARE.setDescription('If an alignment is requested, which software package should be use?') -vocabulary_ALIGNMENT_SOFTWARE.setUrlTemplate(None) -vocabulary_ALIGNMENT_SOFTWARE.setManagedInternally(False) -vocabulary_ALIGNMENT_SOFTWARE.setChosenFromList(True) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED = tr.createNewVocabularyTerm('NOT_NEEDED') -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED.setOrdinal(1) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOT_NEEDED) - -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND = tr.createNewVocabularyTerm('ELAND') -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_ELAND.setOrdinal(2) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_ELAND) - -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ = tr.createNewVocabularyTerm('MAQ') -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_MAQ.setOrdinal(3) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_MAQ) - -vocabulary_term_ALIGNMENT_SOFTWARE_BWA = tr.createNewVocabularyTerm('BWA') -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BWA.setOrdinal(4) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BWA) - -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN = tr.createNewVocabularyTerm('NOVOALIGN') -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN.setOrdinal(6) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_NOVOALIGN) - -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE = tr.createNewVocabularyTerm('BOWTIE') -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setDescription(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setLabel(None) -vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE.setOrdinal(7) -vocabulary_ALIGNMENT_SOFTWARE.addTerm(vocabulary_term_ALIGNMENT_SOFTWARE_BOWTIE) - -vocabulary_CASAVA_VERSION = tr.getOrCreateNewVocabulary('CASAVA_VERSION') -vocabulary_CASAVA_VERSION.setDescription('Post analyzing software') -vocabulary_CASAVA_VERSION.setUrlTemplate(None) -vocabulary_CASAVA_VERSION.setManagedInternally(False) -vocabulary_CASAVA_VERSION.setChosenFromList(True) - -vocabulary_term_CASAVA_VERSION_18 = tr.createNewVocabularyTerm('1.8') -vocabulary_term_CASAVA_VERSION_18.setDescription(None) -vocabulary_term_CASAVA_VERSION_18.setLabel(None) -vocabulary_term_CASAVA_VERSION_18.setOrdinal(1) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_18) - -vocabulary_term_CASAVA_VERSION_17 = tr.createNewVocabularyTerm('1.7') -vocabulary_term_CASAVA_VERSION_17.setDescription(None) -vocabulary_term_CASAVA_VERSION_17.setLabel(None) -vocabulary_term_CASAVA_VERSION_17.setOrdinal(2) -vocabulary_CASAVA_VERSION.addTerm(vocabulary_term_CASAVA_VERSION_17) - -vocabulary_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewVocabulary('CLUSTER_GENERATION_KIT_VERSION') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setDescription('Version of the Cluster Generation Kit') -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setUrlTemplate(None) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setLabel('TruSeq cBot-HS v3') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3.setOrdinal(1) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V3) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_HS_V2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setLabel('TruSeq cBot-HS v2.5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25.setOrdinal(2) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_HS_V25) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2 = tr.createNewVocabularyTerm('TRUSEQ_CBOT_GA_V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setLabel('TrueSeq cBot-GA v2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2.setOrdinal(3) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CBOT_GA_V2) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5 = tr.createNewVocabularyTerm('TRUSEQ_CS_GA_V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setLabel('TrueSeq CS-GA v5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5.setOrdinal(4) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_TRUSEQ_CS_GA_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5.setOrdinal(5) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V5) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4.setOrdinal(6) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V4) - -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2 = tr.createNewVocabularyTerm('V2') -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setDescription(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setLabel(None) -vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2.setOrdinal(7) -vocabulary_CLUSTER_GENERATION_KIT_VERSION.addTerm(vocabulary_term_CLUSTER_GENERATION_KIT_VERSION_V2) - -vocabulary_CLUSTER_STATION = tr.getOrCreateNewVocabulary('CLUSTER_STATION') -vocabulary_CLUSTER_STATION.setDescription('Cluster Station') -vocabulary_CLUSTER_STATION.setUrlTemplate(None) -vocabulary_CLUSTER_STATION.setManagedInternally(False) -vocabulary_CLUSTER_STATION.setChosenFromList(True) - -vocabulary_term_CLUSTER_STATION_CBOT = tr.createNewVocabularyTerm('CBOT') -vocabulary_term_CLUSTER_STATION_CBOT.setDescription(None) -vocabulary_term_CLUSTER_STATION_CBOT.setLabel('cBot') -vocabulary_term_CLUSTER_STATION_CBOT.setOrdinal(1) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT) - -vocabulary_term_CLUSTER_STATION_CBOT2 = tr.createNewVocabularyTerm('CBOT2') -vocabulary_term_CLUSTER_STATION_CBOT2.setDescription('Second cBot') -vocabulary_term_CLUSTER_STATION_CBOT2.setLabel('cBot2') -vocabulary_term_CLUSTER_STATION_CBOT2.setOrdinal(2) -vocabulary_CLUSTER_STATION.addTerm(vocabulary_term_CLUSTER_STATION_CBOT2) - -vocabulary_CONTROL_LANE = tr.getOrCreateNewVocabulary('CONTROL_LANE') -vocabulary_CONTROL_LANE.setDescription(None) -vocabulary_CONTROL_LANE.setUrlTemplate(None) -vocabulary_CONTROL_LANE.setManagedInternally(False) -vocabulary_CONTROL_LANE.setChosenFromList(True) - -vocabulary_term_CONTROL_LANE_1 = tr.createNewVocabularyTerm('1') -vocabulary_term_CONTROL_LANE_1.setDescription(None) -vocabulary_term_CONTROL_LANE_1.setLabel(None) -vocabulary_term_CONTROL_LANE_1.setOrdinal(1) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_1) - -vocabulary_term_CONTROL_LANE_2 = tr.createNewVocabularyTerm('2') -vocabulary_term_CONTROL_LANE_2.setDescription(None) -vocabulary_term_CONTROL_LANE_2.setLabel(None) -vocabulary_term_CONTROL_LANE_2.setOrdinal(2) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_2) - -vocabulary_term_CONTROL_LANE_3 = tr.createNewVocabularyTerm('3') -vocabulary_term_CONTROL_LANE_3.setDescription(None) -vocabulary_term_CONTROL_LANE_3.setLabel(None) -vocabulary_term_CONTROL_LANE_3.setOrdinal(3) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_3) - -vocabulary_term_CONTROL_LANE_4 = tr.createNewVocabularyTerm('4') -vocabulary_term_CONTROL_LANE_4.setDescription(None) -vocabulary_term_CONTROL_LANE_4.setLabel(None) -vocabulary_term_CONTROL_LANE_4.setOrdinal(4) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_4) - -vocabulary_term_CONTROL_LANE_5 = tr.createNewVocabularyTerm('5') -vocabulary_term_CONTROL_LANE_5.setDescription(None) -vocabulary_term_CONTROL_LANE_5.setLabel(None) -vocabulary_term_CONTROL_LANE_5.setOrdinal(5) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_5) - -vocabulary_term_CONTROL_LANE_6 = tr.createNewVocabularyTerm('6') -vocabulary_term_CONTROL_LANE_6.setDescription(None) -vocabulary_term_CONTROL_LANE_6.setLabel(None) -vocabulary_term_CONTROL_LANE_6.setOrdinal(6) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_6) - -vocabulary_term_CONTROL_LANE_7 = tr.createNewVocabularyTerm('7') -vocabulary_term_CONTROL_LANE_7.setDescription(None) -vocabulary_term_CONTROL_LANE_7.setLabel(None) -vocabulary_term_CONTROL_LANE_7.setOrdinal(7) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_7) - -vocabulary_term_CONTROL_LANE_8 = tr.createNewVocabularyTerm('8') -vocabulary_term_CONTROL_LANE_8.setDescription(None) -vocabulary_term_CONTROL_LANE_8.setLabel(None) -vocabulary_term_CONTROL_LANE_8.setOrdinal(8) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_8) - -vocabulary_term_CONTROL_LANE_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_CONTROL_LANE_NONE.setDescription(None) -vocabulary_term_CONTROL_LANE_NONE.setLabel(None) -vocabulary_term_CONTROL_LANE_NONE.setOrdinal(9) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_NONE) - -vocabulary_term_CONTROL_LANE_0 = tr.createNewVocabularyTerm('0') -vocabulary_term_CONTROL_LANE_0.setDescription(None) -vocabulary_term_CONTROL_LANE_0.setLabel(None) -vocabulary_term_CONTROL_LANE_0.setOrdinal(10) -vocabulary_CONTROL_LANE.addTerm(vocabulary_term_CONTROL_LANE_0) - -vocabulary_END_TYPE = tr.getOrCreateNewVocabulary('END_TYPE') -vocabulary_END_TYPE.setDescription('Sequencing method') -vocabulary_END_TYPE.setUrlTemplate(None) -vocabulary_END_TYPE.setManagedInternally(False) -vocabulary_END_TYPE.setChosenFromList(True) - -vocabulary_term_END_TYPE_SINGLE_READ = tr.createNewVocabularyTerm('SINGLE_READ') -vocabulary_term_END_TYPE_SINGLE_READ.setDescription(None) -vocabulary_term_END_TYPE_SINGLE_READ.setLabel(None) -vocabulary_term_END_TYPE_SINGLE_READ.setOrdinal(1) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_SINGLE_READ) - -vocabulary_term_END_TYPE_PAIRED_END = tr.createNewVocabularyTerm('PAIRED_END') -vocabulary_term_END_TYPE_PAIRED_END.setDescription(None) -vocabulary_term_END_TYPE_PAIRED_END.setLabel(None) -vocabulary_term_END_TYPE_PAIRED_END.setOrdinal(2) -vocabulary_END_TYPE.addTerm(vocabulary_term_END_TYPE_PAIRED_END) - -vocabulary_EXPERIMENT_DESIGN = tr.getOrCreateNewVocabulary('EXPERIMENT_DESIGN') -vocabulary_EXPERIMENT_DESIGN.setDescription('General Intent') -vocabulary_EXPERIMENT_DESIGN.setUrlTemplate(None) -vocabulary_EXPERIMENT_DESIGN.setManagedInternally(False) -vocabulary_EXPERIMENT_DESIGN.setChosenFromList(True) - -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION = tr.createNewVocabularyTerm('BINDING_SITE_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setLabel('Binding Site Identification') -vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION.setOrdinal(1) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_BINDING_SITE_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS = tr.createNewVocabularyTerm('CHROMATIN_MARKS') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setLabel('Chromatin Marks') -vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS.setOrdinal(2) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_CHROMATIN_MARKS) - -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION = tr.createNewVocabularyTerm('COMPARATIVE_GENOMIC_HYBRIDIZATION') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setLabel('Comparative Genomic Hybridization') -vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION.setOrdinal(3) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_COMPARATIVE_GENOMIC_HYBRIDIZATION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION = tr.createNewVocabularyTerm('DIFFERENTIAL_EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setLabel('Differential Expression') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION.setOrdinal(4) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING = tr.createNewVocabularyTerm('DIFFERENTIAL_SPLICING') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setLabel('Differential Splicing') -vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING.setOrdinal(5) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_DIFFERENTIAL_SPLICING) - -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION = tr.createNewVocabularyTerm('EXPRESSION') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setLabel('Expression') -vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION.setOrdinal(6) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_EXPRESSION) - -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT = tr.createNewVocabularyTerm('SEQUENCE_ENRICHMENT') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setLabel('Sequence Enrichment') -vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT.setOrdinal(7) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_SEQUENCE_ENRICHMENT) - -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION = tr.createNewVocabularyTerm('TRANSCRIPT_IDENTIFICATION') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setLabel('Transcript Identification') -vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION.setOrdinal(8) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_TRANSCRIPT_IDENTIFICATION) - -vocabulary_term_EXPERIMENT_DESIGN_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setDescription(None) -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setLabel('Other') -vocabulary_term_EXPERIMENT_DESIGN_OTHER.setOrdinal(9) -vocabulary_EXPERIMENT_DESIGN.addTerm(vocabulary_term_EXPERIMENT_DESIGN_OTHER) - -vocabulary_INDEX1 = tr.getOrCreateNewVocabulary('INDEX1') -vocabulary_INDEX1.setDescription('Index 1 for Illumina Indexing') -vocabulary_INDEX1.setUrlTemplate(None) -vocabulary_INDEX1.setManagedInternally(False) -vocabulary_INDEX1.setChosenFromList(True) - -vocabulary_term_INDEX1_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_INDEX1_NONE.setDescription('No Index') -vocabulary_term_INDEX1_NONE.setLabel(' None') -vocabulary_term_INDEX1_NONE.setOrdinal(1) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_NONE) - -vocabulary_term_INDEX1_ATCACGA = tr.createNewVocabularyTerm('ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATCACGA.setLabel('Index1 ATCACGA') -vocabulary_term_INDEX1_ATCACGA.setOrdinal(2) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATCACGA) - -vocabulary_term_INDEX1_CGATGTA = tr.createNewVocabularyTerm('CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGATGTA.setLabel('Index2 CGATGTA') -vocabulary_term_INDEX1_CGATGTA.setOrdinal(3) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGATGTA) - -vocabulary_term_INDEX1_TTAGGCA = tr.createNewVocabularyTerm('TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TTAGGCA.setLabel('Index3 TTAGGCA') -vocabulary_term_INDEX1_TTAGGCA.setOrdinal(4) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTAGGCA) - -vocabulary_term_INDEX1_TGACCAA = tr.createNewVocabularyTerm('TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TGACCAA.setLabel('Index4 TGACCAA') -vocabulary_term_INDEX1_TGACCAA.setOrdinal(5) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TGACCAA) - -vocabulary_term_INDEX1_ACAGTGA = tr.createNewVocabularyTerm('ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACAGTGA.setLabel('Index5 ACAGTGA') -vocabulary_term_INDEX1_ACAGTGA.setOrdinal(6) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACAGTGA) - -vocabulary_term_INDEX1_GCCAATA = tr.createNewVocabularyTerm('GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GCCAATA.setLabel('Index6 GCCAATA') -vocabulary_term_INDEX1_GCCAATA.setOrdinal(7) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCCAATA) - -vocabulary_term_INDEX1_CAGATCA = tr.createNewVocabularyTerm('CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CAGATCA.setLabel('Index7 CAGATCA') -vocabulary_term_INDEX1_CAGATCA.setOrdinal(8) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATCA) - -vocabulary_term_INDEX1_ACTTGAA = tr.createNewVocabularyTerm('ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTTGAA.setLabel('Index8 ACTTGAA') -vocabulary_term_INDEX1_ACTTGAA.setOrdinal(9) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTGAA) - -vocabulary_term_INDEX1_GATCAGA = tr.createNewVocabularyTerm('GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GATCAGA.setLabel('Index9 GATCAGA') -vocabulary_term_INDEX1_GATCAGA.setOrdinal(10) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GATCAGA) - -vocabulary_term_INDEX1_TAGCTTA = tr.createNewVocabularyTerm('TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_TAGCTTA.setLabel('Index10 TAGCTTA') -vocabulary_term_INDEX1_TAGCTTA.setOrdinal(11) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGCTTA) - -vocabulary_term_INDEX1_GGCTACA = tr.createNewVocabularyTerm('GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GGCTACA.setLabel('Index11 GGCTACA') -vocabulary_term_INDEX1_GGCTACA.setOrdinal(12) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGCTACA) - -vocabulary_term_INDEX1_CTTGTAA = tr.createNewVocabularyTerm('CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CTTGTAA.setLabel('Index12 CTTGTAA') -vocabulary_term_INDEX1_CTTGTAA.setOrdinal(13) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTTGTAA) - -vocabulary_term_INDEX1_AGATACA = tr.createNewVocabularyTerm('AGATACA') -vocabulary_term_INDEX1_AGATACA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGATACA.setLabel('Index13 AGATAC') -vocabulary_term_INDEX1_AGATACA.setOrdinal(14) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGATACA) - -vocabulary_term_INDEX1_AGTTCCG = tr.createNewVocabularyTerm('AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_AGTTCCG.setLabel('Index14 AGTTCCG') -vocabulary_term_INDEX1_AGTTCCG.setOrdinal(15) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTTCCG) - -vocabulary_term_INDEX1_ATGTCAG = tr.createNewVocabularyTerm('ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATGTCAG.setLabel('Index15 ATGTCAG') -vocabulary_term_INDEX1_ATGTCAG.setOrdinal(16) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAG) - -vocabulary_term_INDEX1_CCGTCCC = tr.createNewVocabularyTerm('CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CCGTCCC.setLabel('Index16 CCGTCCC') -vocabulary_term_INDEX1_CCGTCCC.setOrdinal(17) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCC) - -vocabulary_term_INDEX1_GTCCGCA = tr.createNewVocabularyTerm('GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTCCGCA.setLabel('Index18 GTCCGCA') -vocabulary_term_INDEX1_GTCCGCA.setOrdinal(18) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCCGCA) - -vocabulary_term_INDEX1_GTGAAAC = tr.createNewVocabularyTerm('GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGAAAC.setLabel('Index19 GTGAAAC') -vocabulary_term_INDEX1_GTGAAAC.setOrdinal(19) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAC) - -vocabulary_term_INDEX1_GTGGCCT = tr.createNewVocabularyTerm('GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTGGCCT.setLabel('Index20 GTGGCCT') -vocabulary_term_INDEX1_GTGGCCT.setOrdinal(20) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCT) - -vocabulary_term_INDEX1_GTTTCGG = tr.createNewVocabularyTerm('GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GTTTCGG.setLabel('Index21 GTTTCGG') -vocabulary_term_INDEX1_GTTTCGG.setOrdinal(21) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGG) - -vocabulary_term_INDEX1_CGTACGT = tr.createNewVocabularyTerm('CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_CGTACGT.setLabel('Index22 CGTACGT') -vocabulary_term_INDEX1_CGTACGT.setOrdinal(22) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGT) - -vocabulary_term_INDEX1_GAGTGGA = tr.createNewVocabularyTerm('GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_GAGTGGA.setLabel('Index23 GAGTGGA') -vocabulary_term_INDEX1_GAGTGGA.setOrdinal(23) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAGTGGA) - -vocabulary_term_INDEX1_ACTGATA = tr.createNewVocabularyTerm('ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ACTGATA.setLabel('Index25 ACTGATA') -vocabulary_term_INDEX1_ACTGATA.setOrdinal(24) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTGATA) - -vocabulary_term_INDEX1_ATTCCTT = tr.createNewVocabularyTerm('ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setDescription('Illumina, Nextera or Scriptseq') -vocabulary_term_INDEX1_ATTCCTT.setLabel('Index27 ATTCCTT') -vocabulary_term_INDEX1_ATTCCTT.setOrdinal(25) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTT) - -vocabulary_term_INDEX1_TAAGGCGA = tr.createNewVocabularyTerm('TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAAGGCGA.setLabel('Index1 (i7) N701 TAAGGCGA') -vocabulary_term_INDEX1_TAAGGCGA.setOrdinal(26) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGGCGA) - -vocabulary_term_INDEX1_CGTACTAG = tr.createNewVocabularyTerm('CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGTACTAG.setLabel('Index1 (i7) N702 CGTACTAG') -vocabulary_term_INDEX1_CGTACTAG.setOrdinal(27) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACTAG) - -vocabulary_term_INDEX1_AGGCAGAA = tr.createNewVocabularyTerm('AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AGGCAGAA.setLabel('Index1 (i7) N703 AGGCAGAA') -vocabulary_term_INDEX1_AGGCAGAA.setOrdinal(28) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGCAGAA) - -vocabulary_term_INDEX1_TCCTGAGC = tr.createNewVocabularyTerm('TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TCCTGAGC.setLabel('Index1 (i7) N704 TCCTGAGC') -vocabulary_term_INDEX1_TCCTGAGC.setOrdinal(29) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTGAGC) - -vocabulary_term_INDEX1_GGACTCCT = tr.createNewVocabularyTerm('GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GGACTCCT.setLabel('Index1 (i7) N705 GGACTCCT') -vocabulary_term_INDEX1_GGACTCCT.setOrdinal(30) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGACTCCT) - -vocabulary_term_INDEX1_TAGGCATG = tr.createNewVocabularyTerm('TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_TAGGCATG.setLabel('Index1 (i7) N706 TAGGCATG') -vocabulary_term_INDEX1_TAGGCATG.setOrdinal(31) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAGGCATG) - -vocabulary_term_INDEX1_CTCTCTAC = tr.createNewVocabularyTerm('CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CTCTCTAC.setLabel('Index1 (i7) N707 CTCTCTAC') -vocabulary_term_INDEX1_CTCTCTAC.setOrdinal(32) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCTCTAC) - -vocabulary_term_INDEX1_CAGAGAGG = tr.createNewVocabularyTerm('CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CAGAGAGG.setLabel('Index1 (i7) N708 CAGAGAGG') -vocabulary_term_INDEX1_CAGAGAGG.setOrdinal(33) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGAGAGG) - -vocabulary_term_INDEX1_GCTACGCT = tr.createNewVocabularyTerm('GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GCTACGCT.setLabel('Index1 (i7) N709 GCTACGCT') -vocabulary_term_INDEX1_GCTACGCT.setOrdinal(34) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTACGCT) - -vocabulary_term_INDEX1_CGAGGCTG = tr.createNewVocabularyTerm('CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setDescription('Nextera DNA') -vocabulary_term_INDEX1_CGAGGCTG.setLabel('Index1 (i7) N710 CGAGGCTG') -vocabulary_term_INDEX1_CGAGGCTG.setOrdinal(35) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGAGGCTG) - -vocabulary_term_INDEX1_AAGAGGCA = tr.createNewVocabularyTerm('AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_AAGAGGCA.setLabel('Index1 (i7) N711 AAGAGGCA') -vocabulary_term_INDEX1_AAGAGGCA.setOrdinal(36) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGAGGCA) - -vocabulary_term_INDEX1_GTAGAGGA = tr.createNewVocabularyTerm('GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setDescription('Nextera DNA') -vocabulary_term_INDEX1_GTAGAGGA.setLabel('Index1 (i7) N712 GTAGAGGA') -vocabulary_term_INDEX1_GTAGAGGA.setOrdinal(37) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGGA) - -vocabulary_term_INDEX1_AAGACTA = tr.createNewVocabularyTerm('AAGACTA') -vocabulary_term_INDEX1_AAGACTA.setDescription(None) -vocabulary_term_INDEX1_AAGACTA.setLabel('02 AAGACT') -vocabulary_term_INDEX1_AAGACTA.setOrdinal(38) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AAGACTA) - -vocabulary_term_INDEX1_ACTTCAA = tr.createNewVocabularyTerm('ACTTCAA') -vocabulary_term_INDEX1_ACTTCAA.setDescription(None) -vocabulary_term_INDEX1_ACTTCAA.setLabel('10 ACTTCA') -vocabulary_term_INDEX1_ACTTCAA.setOrdinal(39) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ACTTCAA) - -vocabulary_term_INDEX1_AGGTTGA = tr.createNewVocabularyTerm('AGGTTGA') -vocabulary_term_INDEX1_AGGTTGA.setDescription(None) -vocabulary_term_INDEX1_AGGTTGA.setLabel('17 AGGTTG') -vocabulary_term_INDEX1_AGGTTGA.setOrdinal(40) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGGTTGA) - -vocabulary_term_INDEX1_TTCGTCA = tr.createNewVocabularyTerm('TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setDescription(None) -vocabulary_term_INDEX1_TTCGTCA.setLabel('17 TTCGTCA') -vocabulary_term_INDEX1_TTCGTCA.setOrdinal(41) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCGTCA) - -vocabulary_term_INDEX1_AGCATAA = tr.createNewVocabularyTerm('AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setDescription(None) -vocabulary_term_INDEX1_AGCATAA.setLabel('20 AGCATAA') -vocabulary_term_INDEX1_AGCATAA.setOrdinal(42) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGCATAA) - -vocabulary_term_INDEX1_ATACGCA = tr.createNewVocabularyTerm('ATACGCA') -vocabulary_term_INDEX1_ATACGCA.setDescription(None) -vocabulary_term_INDEX1_ATACGCA.setLabel('20 ATACGC') -vocabulary_term_INDEX1_ATACGCA.setOrdinal(43) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATACGCA) - -vocabulary_term_INDEX1_CAGATGA = tr.createNewVocabularyTerm('CAGATGA') -vocabulary_term_INDEX1_CAGATGA.setDescription(None) -vocabulary_term_INDEX1_CAGATGA.setLabel('28 CAGATG') -vocabulary_term_INDEX1_CAGATGA.setOrdinal(44) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGATGA) - -vocabulary_term_INDEX1_CCGAATA = tr.createNewVocabularyTerm('CCGAATA') -vocabulary_term_INDEX1_CCGAATA.setDescription(None) -vocabulary_term_INDEX1_CCGAATA.setLabel('34 CCGAAT') -vocabulary_term_INDEX1_CCGAATA.setOrdinal(45) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGAATA) - -vocabulary_term_INDEX1_CGCTCGA = tr.createNewVocabularyTerm('CGCTCGA') -vocabulary_term_INDEX1_CGCTCGA.setDescription(None) -vocabulary_term_INDEX1_CGCTCGA.setLabel('43 CGCTCG') -vocabulary_term_INDEX1_CGCTCGA.setOrdinal(46) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGCTCGA) - -vocabulary_term_INDEX1_CGTATTA = tr.createNewVocabularyTerm('CGTATTA') -vocabulary_term_INDEX1_CGTATTA.setDescription(None) -vocabulary_term_INDEX1_CGTATTA.setLabel('45 CGTATT') -vocabulary_term_INDEX1_CGTATTA.setOrdinal(47) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTATTA) - -vocabulary_term_INDEX1_CCATGAA = tr.createNewVocabularyTerm('CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setDescription(None) -vocabulary_term_INDEX1_CCATGAA.setLabel('50 CCATGAA') -vocabulary_term_INDEX1_CCATGAA.setOrdinal(48) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCATGAA) - -vocabulary_term_INDEX1_CTGACCA = tr.createNewVocabularyTerm('CTGACCA') -vocabulary_term_INDEX1_CTGACCA.setDescription(None) -vocabulary_term_INDEX1_CTGACCA.setLabel('50 CTGACC') -vocabulary_term_INDEX1_CTGACCA.setOrdinal(49) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTGACCA) - -vocabulary_term_INDEX1_GAAGCCA = tr.createNewVocabularyTerm('GAAGCCA') -vocabulary_term_INDEX1_GAAGCCA.setDescription(None) -vocabulary_term_INDEX1_GAAGCCA.setLabel('52 GAAGCC') -vocabulary_term_INDEX1_GAAGCCA.setOrdinal(50) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GAAGCCA) - -vocabulary_term_INDEX1_NOINDEX = tr.createNewVocabularyTerm('NOINDEX') -vocabulary_term_INDEX1_NOINDEX.setDescription(None) -vocabulary_term_INDEX1_NOINDEX.setLabel(None) -vocabulary_term_INDEX1_NOINDEX.setOrdinal(51) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_NOINDEX) - -vocabulary_term_INDEX1_GCTGAAA = tr.createNewVocabularyTerm('GCTGAAA') -vocabulary_term_INDEX1_GCTGAAA.setDescription(None) -vocabulary_term_INDEX1_GCTGAAA.setLabel('59 GCTGAA') -vocabulary_term_INDEX1_GCTGAAA.setOrdinal(52) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCTGAAA) - -vocabulary_term_INDEX1_GTCGCGA = tr.createNewVocabularyTerm('GTCGCGA') -vocabulary_term_INDEX1_GTCGCGA.setDescription(None) -vocabulary_term_INDEX1_GTCGCGA.setLabel('64 GTCGCG') -vocabulary_term_INDEX1_GTCGCGA.setOrdinal(53) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTCGCGA) - -vocabulary_term_INDEX1_TAAGATA = tr.createNewVocabularyTerm('TAAGATA') -vocabulary_term_INDEX1_TAAGATA.setDescription(None) -vocabulary_term_INDEX1_TAAGATA.setLabel('65 TAAGAT') -vocabulary_term_INDEX1_TAAGATA.setOrdinal(54) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAAGATA) - -vocabulary_term_INDEX1_GCGCTGA = tr.createNewVocabularyTerm('GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setDescription(None) -vocabulary_term_INDEX1_GCGCTGA.setLabel('66 GCGCTGA') -vocabulary_term_INDEX1_GCGCTGA.setOrdinal(55) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GCGCTGA) - -vocabulary_term_INDEX1_TATCGTA = tr.createNewVocabularyTerm('TATCGTA') -vocabulary_term_INDEX1_TATCGTA.setDescription(None) -vocabulary_term_INDEX1_TATCGTA.setLabel('66 TATCGT') -vocabulary_term_INDEX1_TATCGTA.setOrdinal(56) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATCGTA) - -vocabulary_term_INDEX1_TCCTACA = tr.createNewVocabularyTerm('TCCTACA') -vocabulary_term_INDEX1_TCCTACA.setDescription(None) -vocabulary_term_INDEX1_TCCTACA.setLabel('68 TCCTAC') -vocabulary_term_INDEX1_TCCTACA.setOrdinal(57) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCTACA) - -vocabulary_term_INDEX1_TCTATAA = tr.createNewVocabularyTerm('TCTATAA') -vocabulary_term_INDEX1_TCTATAA.setDescription(None) -vocabulary_term_INDEX1_TCTATAA.setLabel('70 TCTATA') -vocabulary_term_INDEX1_TCTATAA.setOrdinal(58) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCTATAA) - -vocabulary_term_INDEX1_TTACTTA = tr.createNewVocabularyTerm('TTACTTA') -vocabulary_term_INDEX1_TTACTTA.setDescription(None) -vocabulary_term_INDEX1_TTACTTA.setLabel('74 TTACTT') -vocabulary_term_INDEX1_TTACTTA.setOrdinal(59) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTACTTA) - -vocabulary_term_INDEX1_TTCCGAA = tr.createNewVocabularyTerm('TTCCGAA') -vocabulary_term_INDEX1_TTCCGAA.setDescription(None) -vocabulary_term_INDEX1_TTCCGAA.setLabel('75 TTCCGA') -vocabulary_term_INDEX1_TTCCGAA.setOrdinal(60) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TTCCGAA) - -vocabulary_term_INDEX1_ATGTCAA = tr.createNewVocabularyTerm('ATGTCAA') -vocabulary_term_INDEX1_ATGTCAA.setDescription(None) -vocabulary_term_INDEX1_ATGTCAA.setLabel('DNA Adapter 15') -vocabulary_term_INDEX1_ATGTCAA.setOrdinal(61) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGTCAA) - -vocabulary_term_INDEX1_CCGTCCA = tr.createNewVocabularyTerm('CCGTCCA') -vocabulary_term_INDEX1_CCGTCCA.setDescription(None) -vocabulary_term_INDEX1_CCGTCCA.setLabel('DNA Adapter 16') -vocabulary_term_INDEX1_CCGTCCA.setOrdinal(62) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCGTCCA) - -vocabulary_term_INDEX1_GTAGAGA = tr.createNewVocabularyTerm('GTAGAGA') -vocabulary_term_INDEX1_GTAGAGA.setDescription(None) -vocabulary_term_INDEX1_GTAGAGA.setLabel('DNA Adapter 17') -vocabulary_term_INDEX1_GTAGAGA.setOrdinal(63) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTAGAGA) - -vocabulary_term_INDEX1_GTGAAAA = tr.createNewVocabularyTerm('GTGAAAA') -vocabulary_term_INDEX1_GTGAAAA.setDescription(None) -vocabulary_term_INDEX1_GTGAAAA.setLabel('DNA Adapter 19') -vocabulary_term_INDEX1_GTGAAAA.setOrdinal(64) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGAAAA) - -vocabulary_term_INDEX1_GTGGCCA = tr.createNewVocabularyTerm('GTGGCCA') -vocabulary_term_INDEX1_GTGGCCA.setDescription(None) -vocabulary_term_INDEX1_GTGGCCA.setLabel('DNA Adapter 20') -vocabulary_term_INDEX1_GTGGCCA.setOrdinal(65) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTGGCCA) - -vocabulary_term_INDEX1_GTTTCGA = tr.createNewVocabularyTerm('GTTTCGA') -vocabulary_term_INDEX1_GTTTCGA.setDescription(None) -vocabulary_term_INDEX1_GTTTCGA.setLabel('DNA Adapter 21') -vocabulary_term_INDEX1_GTTTCGA.setOrdinal(66) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GTTTCGA) - -vocabulary_term_INDEX1_CGTACGA = tr.createNewVocabularyTerm('CGTACGA') -vocabulary_term_INDEX1_CGTACGA.setDescription(None) -vocabulary_term_INDEX1_CGTACGA.setLabel('DNA Adapter 22') -vocabulary_term_INDEX1_CGTACGA.setOrdinal(67) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGTACGA) - -vocabulary_term_INDEX1_GGTAGCA = tr.createNewVocabularyTerm('GGTAGCA') -vocabulary_term_INDEX1_GGTAGCA.setDescription(None) -vocabulary_term_INDEX1_GGTAGCA.setLabel('DNA Adapter 24') -vocabulary_term_INDEX1_GGTAGCA.setOrdinal(68) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GGTAGCA) - -vocabulary_term_INDEX1_ATGAGCA = tr.createNewVocabularyTerm('ATGAGCA') -vocabulary_term_INDEX1_ATGAGCA.setDescription(None) -vocabulary_term_INDEX1_ATGAGCA.setLabel('DNA Adapter 26') -vocabulary_term_INDEX1_ATGAGCA.setOrdinal(69) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATGAGCA) - -vocabulary_term_INDEX1_ATTCCTA = tr.createNewVocabularyTerm('ATTCCTA') -vocabulary_term_INDEX1_ATTCCTA.setDescription(None) -vocabulary_term_INDEX1_ATTCCTA.setLabel('DNA Adapter 27') -vocabulary_term_INDEX1_ATTCCTA.setOrdinal(70) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_ATTCCTA) - -vocabulary_term_INDEX1_CAAAAGA = tr.createNewVocabularyTerm('CAAAAGA') -vocabulary_term_INDEX1_CAAAAGA.setDescription(None) -vocabulary_term_INDEX1_CAAAAGA.setLabel('DNA Adapter 28') -vocabulary_term_INDEX1_CAAAAGA.setOrdinal(71) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAAAAGA) - -vocabulary_term_INDEX1_CAACTAA = tr.createNewVocabularyTerm('CAACTAA') -vocabulary_term_INDEX1_CAACTAA.setDescription(None) -vocabulary_term_INDEX1_CAACTAA.setLabel('DNA Adapter 29') -vocabulary_term_INDEX1_CAACTAA.setOrdinal(72) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAACTAA) - -vocabulary_term_INDEX1_CACCGGA = tr.createNewVocabularyTerm('CACCGGA') -vocabulary_term_INDEX1_CACCGGA.setDescription(None) -vocabulary_term_INDEX1_CACCGGA.setLabel('DNA Adapter 30') -vocabulary_term_INDEX1_CACCGGA.setOrdinal(73) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACCGGA) - -vocabulary_term_INDEX1_CACGATA = tr.createNewVocabularyTerm('CACGATA') -vocabulary_term_INDEX1_CACGATA.setDescription(None) -vocabulary_term_INDEX1_CACGATA.setLabel('DNA Adapter 31') -vocabulary_term_INDEX1_CACGATA.setOrdinal(74) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACGATA) - -vocabulary_term_INDEX1_CACTCAA = tr.createNewVocabularyTerm('CACTCAA') -vocabulary_term_INDEX1_CACTCAA.setDescription(None) -vocabulary_term_INDEX1_CACTCAA.setLabel('DNA Adapter 32') -vocabulary_term_INDEX1_CACTCAA.setOrdinal(75) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CACTCAA) - -vocabulary_term_INDEX1_CAGGCGA = tr.createNewVocabularyTerm('CAGGCGA') -vocabulary_term_INDEX1_CAGGCGA.setDescription(None) -vocabulary_term_INDEX1_CAGGCGA.setLabel('DNA Adapter 33') -vocabulary_term_INDEX1_CAGGCGA.setOrdinal(76) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CAGGCGA) - -vocabulary_term_INDEX1_CATGGCA = tr.createNewVocabularyTerm('CATGGCA') -vocabulary_term_INDEX1_CATGGCA.setDescription(None) -vocabulary_term_INDEX1_CATGGCA.setLabel('DNA Adapter 34') -vocabulary_term_INDEX1_CATGGCA.setOrdinal(77) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATGGCA) - -vocabulary_term_INDEX1_CATTTTA = tr.createNewVocabularyTerm('CATTTTA') -vocabulary_term_INDEX1_CATTTTA.setDescription(None) -vocabulary_term_INDEX1_CATTTTA.setLabel('DNA Adapter 35') -vocabulary_term_INDEX1_CATTTTA.setOrdinal(78) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CATTTTA) - -vocabulary_term_INDEX1_CCAACAA = tr.createNewVocabularyTerm('CCAACAA') -vocabulary_term_INDEX1_CCAACAA.setDescription(None) -vocabulary_term_INDEX1_CCAACAA.setLabel('DNA Adapter 36') -vocabulary_term_INDEX1_CCAACAA.setOrdinal(79) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CCAACAA) - -vocabulary_term_INDEX1_CGGAATA = tr.createNewVocabularyTerm('CGGAATA') -vocabulary_term_INDEX1_CGGAATA.setDescription(None) -vocabulary_term_INDEX1_CGGAATA.setLabel('DNA Adapter 37') -vocabulary_term_INDEX1_CGGAATA.setOrdinal(80) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CGGAATA) - -vocabulary_term_INDEX1_CTAGCTA = tr.createNewVocabularyTerm('CTAGCTA') -vocabulary_term_INDEX1_CTAGCTA.setDescription(None) -vocabulary_term_INDEX1_CTAGCTA.setLabel('DNA Adapter 38') -vocabulary_term_INDEX1_CTAGCTA.setOrdinal(81) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTAGCTA) - -vocabulary_term_INDEX1_CTATACA = tr.createNewVocabularyTerm('CTATACA') -vocabulary_term_INDEX1_CTATACA.setDescription(None) -vocabulary_term_INDEX1_CTATACA.setLabel('DNA Adapter 39') -vocabulary_term_INDEX1_CTATACA.setOrdinal(82) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTATACA) - -vocabulary_term_INDEX1_CTCAGAA = tr.createNewVocabularyTerm('CTCAGAA') -vocabulary_term_INDEX1_CTCAGAA.setDescription(None) -vocabulary_term_INDEX1_CTCAGAA.setLabel('DNA Adapter 40') -vocabulary_term_INDEX1_CTCAGAA.setOrdinal(83) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_CTCAGAA) - -vocabulary_term_INDEX1_GACGACA = tr.createNewVocabularyTerm('GACGACA') -vocabulary_term_INDEX1_GACGACA.setDescription(None) -vocabulary_term_INDEX1_GACGACA.setLabel('DNA Adapter 41') -vocabulary_term_INDEX1_GACGACA.setOrdinal(84) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_GACGACA) - -vocabulary_term_INDEX1_TAATCGA = tr.createNewVocabularyTerm('TAATCGA') -vocabulary_term_INDEX1_TAATCGA.setDescription(None) -vocabulary_term_INDEX1_TAATCGA.setLabel('DNA Adapter 42') -vocabulary_term_INDEX1_TAATCGA.setOrdinal(85) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TAATCGA) - -vocabulary_term_INDEX1_TACAGCA = tr.createNewVocabularyTerm('TACAGCA') -vocabulary_term_INDEX1_TACAGCA.setDescription(None) -vocabulary_term_INDEX1_TACAGCA.setLabel('DNA Adapter 43') -vocabulary_term_INDEX1_TACAGCA.setOrdinal(86) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TACAGCA) - -vocabulary_term_INDEX1_TATAATA = tr.createNewVocabularyTerm('TATAATA') -vocabulary_term_INDEX1_TATAATA.setDescription(None) -vocabulary_term_INDEX1_TATAATA.setLabel('DNA Adapter 44') -vocabulary_term_INDEX1_TATAATA.setOrdinal(87) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TATAATA) - -vocabulary_term_INDEX1_TCATTCA = tr.createNewVocabularyTerm('TCATTCA') -vocabulary_term_INDEX1_TCATTCA.setDescription(None) -vocabulary_term_INDEX1_TCATTCA.setLabel('DNA Adapter 45') -vocabulary_term_INDEX1_TCATTCA.setOrdinal(88) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCATTCA) - -vocabulary_term_INDEX1_TCCCGAA = tr.createNewVocabularyTerm('TCCCGAA') -vocabulary_term_INDEX1_TCCCGAA.setDescription(None) -vocabulary_term_INDEX1_TCCCGAA.setLabel('DNA Adapter 46') -vocabulary_term_INDEX1_TCCCGAA.setOrdinal(89) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCCCGAA) - -vocabulary_term_INDEX1_TCGAAGA = tr.createNewVocabularyTerm('TCGAAGA') -vocabulary_term_INDEX1_TCGAAGA.setDescription(None) -vocabulary_term_INDEX1_TCGAAGA.setLabel('DNA Adapter 47') -vocabulary_term_INDEX1_TCGAAGA.setOrdinal(90) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGAAGA) - -vocabulary_term_INDEX1_TCGGCAA = tr.createNewVocabularyTerm('TCGGCAA') -vocabulary_term_INDEX1_TCGGCAA.setDescription(None) -vocabulary_term_INDEX1_TCGGCAA.setLabel('DNA Adapter 48') -vocabulary_term_INDEX1_TCGGCAA.setOrdinal(91) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_TCGGCAA) - -vocabulary_term_INDEX1_AGTCAAC = tr.createNewVocabularyTerm('AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setDescription(None) -vocabulary_term_INDEX1_AGTCAAC.setLabel('Index13 AGTCAAC') -vocabulary_term_INDEX1_AGTCAAC.setOrdinal(92) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AGTCAAC) - -vocabulary_term_INDEX1_AATGCGA = tr.createNewVocabularyTerm('AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setDescription(None) -vocabulary_term_INDEX1_AATGCGA.setLabel('Lib AATGCGA') -vocabulary_term_INDEX1_AATGCGA.setOrdinal(93) -vocabulary_INDEX1.addTerm(vocabulary_term_INDEX1_AATGCGA) - -vocabulary_INDEX2 = tr.getOrCreateNewVocabulary('INDEX2') -vocabulary_INDEX2.setDescription('Index 2 for Illumina Dual Indexing') -vocabulary_INDEX2.setUrlTemplate(None) -vocabulary_INDEX2.setManagedInternally(False) -vocabulary_INDEX2.setChosenFromList(True) - -vocabulary_term_INDEX2_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_INDEX2_NONE.setDescription('No Index') -vocabulary_term_INDEX2_NONE.setLabel('None') -vocabulary_term_INDEX2_NONE.setOrdinal(1) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_NONE) - -vocabulary_term_INDEX2_TAGATCGC = tr.createNewVocabularyTerm('TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TAGATCGC.setLabel('Index2 (i5) N501 TAGATCGC') -vocabulary_term_INDEX2_TAGATCGC.setOrdinal(2) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TAGATCGC) - -vocabulary_term_INDEX2_CTCTCTAT = tr.createNewVocabularyTerm('CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTCTCTAT.setLabel('Index2 (i5) N502 CTCTCTAT') -vocabulary_term_INDEX2_CTCTCTAT.setOrdinal(3) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTCTCTAT) - -vocabulary_term_INDEX2_TATCCTCT = tr.createNewVocabularyTerm('TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_TATCCTCT.setLabel('Index2 (i5) N503 TATCCTCT') -vocabulary_term_INDEX2_TATCCTCT.setOrdinal(4) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_TATCCTCT) - -vocabulary_term_INDEX2_AGAGTAGA = tr.createNewVocabularyTerm('AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AGAGTAGA.setLabel('Index2 (i5) N504 AGAGTAGA') -vocabulary_term_INDEX2_AGAGTAGA.setOrdinal(5) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AGAGTAGA) - -vocabulary_term_INDEX2_GTAAGGAG = tr.createNewVocabularyTerm('GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setDescription('Nextera DNA') -vocabulary_term_INDEX2_GTAAGGAG.setLabel('Index2 (i5) N505 GTAAGGAG') -vocabulary_term_INDEX2_GTAAGGAG.setOrdinal(6) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_GTAAGGAG) - -vocabulary_term_INDEX2_ACTGCATA = tr.createNewVocabularyTerm('ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_ACTGCATA.setLabel('Index2 (i5) N506 ACTGCATA') -vocabulary_term_INDEX2_ACTGCATA.setOrdinal(7) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_ACTGCATA) - -vocabulary_term_INDEX2_AAGGAGTA = tr.createNewVocabularyTerm('AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setDescription('Nextera DNA') -vocabulary_term_INDEX2_AAGGAGTA.setLabel('Index2 (i5) N507 AAGGAGTA') -vocabulary_term_INDEX2_AAGGAGTA.setOrdinal(8) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_AAGGAGTA) - -vocabulary_term_INDEX2_CTAAGCCT = tr.createNewVocabularyTerm('CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setDescription('Nextera DNA') -vocabulary_term_INDEX2_CTAAGCCT.setLabel('Index2 (i5) N508 CTAAGCCT') -vocabulary_term_INDEX2_CTAAGCCT.setOrdinal(9) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_CTAAGCCT) - -vocabulary_term_INDEX2_NOINDEX = tr.createNewVocabularyTerm('NOINDEX') -vocabulary_term_INDEX2_NOINDEX.setDescription(None) -vocabulary_term_INDEX2_NOINDEX.setLabel(None) -vocabulary_term_INDEX2_NOINDEX.setOrdinal(10) -vocabulary_INDEX2.addTerm(vocabulary_term_INDEX2_NOINDEX) - -vocabulary_KIT = tr.getOrCreateNewVocabulary('KIT') -vocabulary_KIT.setDescription('Illumina Kit used for preparation') -vocabulary_KIT.setUrlTemplate(None) -vocabulary_KIT.setManagedInternally(False) -vocabulary_KIT.setChosenFromList(True) - -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('CHIP_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setLabel('ChIP-Seq Sample Preparation Kit') -vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP.setOrdinal(1) -vocabulary_KIT.addTerm(vocabulary_term_KIT_CHIP_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1 = tr.createNewVocabularyTerm('NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setDescription(None) -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setLabel('NEB Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1.setOrdinal(2) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEBNEXT_DNA_SAMPLE_PREP_MASTER_MIX_SET1) - -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT = tr.createNewVocabularyTerm('NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT') -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setDescription(None) -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setLabel('NEB_ChIP_Seq_Sample_Preparation_Kit') -vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT.setOrdinal(3) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEB_CHIP_SEQ_SAMPLE_PREPARATION_KIT) - -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP = tr.createNewVocabularyTerm('GENOMICDNA_SAMPLE_PREP') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setLabel('Illumina Genomic DNA Sample Preparation Kit') -vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP.setOrdinal(4) -vocabulary_KIT.addTerm(vocabulary_term_KIT_GENOMICDNA_SAMPLE_PREP) - -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP = tr.createNewVocabularyTerm('PAIRED_END_DNA_SAMPLE_PREP') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setLabel('Paired End DNA Sample Prep Oligo Kit') -vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP.setOrdinal(5) -vocabulary_KIT.addTerm(vocabulary_term_KIT_PAIRED_END_DNA_SAMPLE_PREP) - -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP = tr.createNewVocabularyTerm('MRNA_SEQ_SAMPLE_PREP') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setDescription(None) -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setLabel('mRNA-Seq Sample Preparation Kit') -vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP.setOrdinal(6) -vocabulary_KIT.addTerm(vocabulary_term_KIT_MRNA_SEQ_SAMPLE_PREP) - -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('RIBOZERO_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setLabel('RiboZero ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(7) -vocabulary_KIT.addTerm(vocabulary_term_KIT_RIBOZERO_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT = tr.createNewVocabularyTerm('POLYA_SCRIPTSEQ_MRNA-SEQ_KIT') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setDescription(None) -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setLabel('PolyA(Beads) ScriptSeq mRNA-Seq_Epicentre-kit') -vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT.setOrdinal(8) -vocabulary_KIT.addTerm(vocabulary_term_KIT_POLYA_SCRIPTSEQ_MRNASEQ_KIT) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KITS') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferLMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS.setOrdinal(9) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KITS) - -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW = tr.createNewVocabularyTerm('NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setDescription(None) -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setLabel('Nextera Genomic DNA Sample Preparation Kit BufferHMW(Epicentre)') -vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW.setOrdinal(10) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NEXTERA_DNA_SAMPLE_PREP_KIT_BUFFER_HMW) - -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM = tr.createNewVocabularyTerm('AGILENT_SURESELECT_ENRICHMENTSYSTEM') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setDescription(None) -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setLabel('Agilent_SureSelect_EnrichmentSystem') -vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM.setOrdinal(11) -vocabulary_KIT.addTerm(vocabulary_term_KIT_AGILENT_SURESELECT_ENRICHMENTSYSTEM) - -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQRNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setLabel('TruSeq_RNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT.setOrdinal(12) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQRNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUESEQ_CHIP_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setLabel(None) -vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT.setOrdinal(13) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUESEQ_CHIP_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT = tr.createNewVocabularyTerm('TRUSEQ_DNA_SAMPLE_PREP_KIT') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setDescription(None) -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setLabel('TruSeq_DNA_SamplePrepKit_Illumina') -vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT.setOrdinal(14) -vocabulary_KIT.addTerm(vocabulary_term_KIT_TRUSEQ_DNA_SAMPLE_PREP_KIT) - -vocabulary_term_KIT_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_KIT_NONE.setDescription(None) -vocabulary_term_KIT_NONE.setLabel('None (Already prepared)') -vocabulary_term_KIT_NONE.setOrdinal(15) -vocabulary_KIT.addTerm(vocabulary_term_KIT_NONE) - -vocabulary_MACS_VERSION = tr.getOrCreateNewVocabulary('MACS_VERSION') -vocabulary_MACS_VERSION.setDescription('Used MACS version for Peak Calling') -vocabulary_MACS_VERSION.setUrlTemplate(None) -vocabulary_MACS_VERSION.setManagedInternally(False) -vocabulary_MACS_VERSION.setChosenFromList(True) - -vocabulary_term_MACS_VERSION_140RC2 = tr.createNewVocabularyTerm('1.4.0RC2') -vocabulary_term_MACS_VERSION_140RC2.setDescription(None) -vocabulary_term_MACS_VERSION_140RC2.setLabel('macs14 1.4.0rc2 20110214 (Valentine)') -vocabulary_term_MACS_VERSION_140RC2.setOrdinal(1) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_140RC2) - -vocabulary_term_MACS_VERSION_1371 = tr.createNewVocabularyTerm('1.3.7.1') -vocabulary_term_MACS_VERSION_1371.setDescription(None) -vocabulary_term_MACS_VERSION_1371.setLabel('macs 1.3.7.1 (Oktoberfest, bug fixed #1)') -vocabulary_term_MACS_VERSION_1371.setOrdinal(2) -vocabulary_MACS_VERSION.addTerm(vocabulary_term_MACS_VERSION_1371) - -vocabulary_MISMATCH_IN_INDEX = tr.getOrCreateNewVocabulary('MISMATCH_IN_INDEX') -vocabulary_MISMATCH_IN_INDEX.setDescription('Mismatch in Index allowed') -vocabulary_MISMATCH_IN_INDEX.setUrlTemplate(None) -vocabulary_MISMATCH_IN_INDEX.setManagedInternally(False) -vocabulary_MISMATCH_IN_INDEX.setChosenFromList(True) - -vocabulary_term_MISMATCH_IN_INDEX_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_MISMATCH_IN_INDEX_NONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_NONE.setOrdinal(1) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_NONE) - -vocabulary_term_MISMATCH_IN_INDEX_ONE = tr.createNewVocabularyTerm('ONE') -vocabulary_term_MISMATCH_IN_INDEX_ONE.setDescription(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setLabel(None) -vocabulary_term_MISMATCH_IN_INDEX_ONE.setOrdinal(2) -vocabulary_MISMATCH_IN_INDEX.addTerm(vocabulary_term_MISMATCH_IN_INDEX_ONE) - -vocabulary_NANO_DROP = tr.getOrCreateNewVocabulary('NANO_DROP') -vocabulary_NANO_DROP.setDescription('Device for measuring the total amount of genetic material contained in the probe') -vocabulary_NANO_DROP.setUrlTemplate(None) -vocabulary_NANO_DROP.setManagedInternally(False) -vocabulary_NANO_DROP.setChosenFromList(True) - -vocabulary_term_NANO_DROP_CONCND3300 = tr.createNewVocabularyTerm('CONCND3300') -vocabulary_term_NANO_DROP_CONCND3300.setDescription(None) -vocabulary_term_NANO_DROP_CONCND3300.setLabel('Conc Nano Drop 3300') -vocabulary_term_NANO_DROP_CONCND3300.setOrdinal(1) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND3300) - -vocabulary_term_NANO_DROP_CONCND1000 = tr.createNewVocabularyTerm('CONCND1000') -vocabulary_term_NANO_DROP_CONCND1000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND1000.setLabel('Conc Nano Drop 1000') -vocabulary_term_NANO_DROP_CONCND1000.setOrdinal(2) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND1000) - -vocabulary_term_NANO_DROP_CONCND2000 = tr.createNewVocabularyTerm('CONCND2000') -vocabulary_term_NANO_DROP_CONCND2000.setDescription(None) -vocabulary_term_NANO_DROP_CONCND2000.setLabel('Conc Nano Drop 2000') -vocabulary_term_NANO_DROP_CONCND2000.setOrdinal(3) -vocabulary_NANO_DROP.addTerm(vocabulary_term_NANO_DROP_CONCND2000) - -vocabulary_NCBI_TAXONOMY = tr.getOrCreateNewVocabulary('NCBI_TAXONOMY') -vocabulary_NCBI_TAXONOMY.setDescription(None) -vocabulary_NCBI_TAXONOMY.setUrlTemplate('http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=$term$') -vocabulary_NCBI_TAXONOMY.setManagedInternally(False) -vocabulary_NCBI_TAXONOMY.setChosenFromList(True) - -vocabulary_term_NCBI_TAXONOMY_10090 = tr.createNewVocabularyTerm('10090') -vocabulary_term_NCBI_TAXONOMY_10090.setDescription('Genbank common name: house mouse\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10090.setLabel('Mus musculus') -vocabulary_term_NCBI_TAXONOMY_10090.setOrdinal(1) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10090) - -vocabulary_term_NCBI_TAXONOMY_9606 = tr.createNewVocabularyTerm('9606') -vocabulary_term_NCBI_TAXONOMY_9606.setDescription('Genbank common name: human\ Inherited blast name: primates') -vocabulary_term_NCBI_TAXONOMY_9606.setLabel('Homo sapiens') -vocabulary_term_NCBI_TAXONOMY_9606.setOrdinal(2) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9606) - -vocabulary_term_NCBI_TAXONOMY_7227 = tr.createNewVocabularyTerm('7227') -vocabulary_term_NCBI_TAXONOMY_7227.setDescription('Genbank common name: fruit fly\ Inherited blast name: flies') -vocabulary_term_NCBI_TAXONOMY_7227.setLabel('Drosophila melanogaster') -vocabulary_term_NCBI_TAXONOMY_7227.setOrdinal(3) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7227) - -vocabulary_term_NCBI_TAXONOMY_6239 = tr.createNewVocabularyTerm('6239') -vocabulary_term_NCBI_TAXONOMY_6239.setDescription('Inherited blast name: nematodes') -vocabulary_term_NCBI_TAXONOMY_6239.setLabel('Caenorhabditis elegans') -vocabulary_term_NCBI_TAXONOMY_6239.setOrdinal(4) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6239) - -vocabulary_term_NCBI_TAXONOMY_4932 = tr.createNewVocabularyTerm('4932') -vocabulary_term_NCBI_TAXONOMY_4932.setDescription('Genbank common name: baker\'s yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4932.setLabel('Saccharomyces cerevisiae') -vocabulary_term_NCBI_TAXONOMY_4932.setOrdinal(5) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4932) - -vocabulary_term_NCBI_TAXONOMY_10116 = tr.createNewVocabularyTerm('10116') -vocabulary_term_NCBI_TAXONOMY_10116.setDescription('Genbank common name: Norway rat\ Inherited blast name: rodents') -vocabulary_term_NCBI_TAXONOMY_10116.setLabel('Rattus norvegicus') -vocabulary_term_NCBI_TAXONOMY_10116.setOrdinal(6) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10116) - -vocabulary_term_NCBI_TAXONOMY_6669 = tr.createNewVocabularyTerm('6669') -vocabulary_term_NCBI_TAXONOMY_6669.setDescription('Genbank common name: common water flea\ Inherited blast name: crustaceans') -vocabulary_term_NCBI_TAXONOMY_6669.setLabel('Daphnia pulex') -vocabulary_term_NCBI_TAXONOMY_6669.setOrdinal(7) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_6669) - -vocabulary_term_NCBI_TAXONOMY_562 = tr.createNewVocabularyTerm('562') -vocabulary_term_NCBI_TAXONOMY_562.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_562.setLabel('Escherichia coli') -vocabulary_term_NCBI_TAXONOMY_562.setOrdinal(8) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_562) - -vocabulary_term_NCBI_TAXONOMY_623 = tr.createNewVocabularyTerm('623') -vocabulary_term_NCBI_TAXONOMY_623.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_623.setLabel('Shigella flexneri') -vocabulary_term_NCBI_TAXONOMY_623.setOrdinal(9) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_623) - -vocabulary_term_NCBI_TAXONOMY_10847 = tr.createNewVocabularyTerm('10847') -vocabulary_term_NCBI_TAXONOMY_10847.setDescription('Inherited blast name: viruses') -vocabulary_term_NCBI_TAXONOMY_10847.setLabel('Enterobacteria phage phiX174') -vocabulary_term_NCBI_TAXONOMY_10847.setOrdinal(10) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_10847) - -vocabulary_term_NCBI_TAXONOMY_190650 = tr.createNewVocabularyTerm('190650') -vocabulary_term_NCBI_TAXONOMY_190650.setDescription('Inherited blast name: a-proteobacteria') -vocabulary_term_NCBI_TAXONOMY_190650.setLabel('Caulobacter crescentus CB15') -vocabulary_term_NCBI_TAXONOMY_190650.setOrdinal(11) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_190650) - -vocabulary_term_NCBI_TAXONOMY_8113 = tr.createNewVocabularyTerm('8113') -vocabulary_term_NCBI_TAXONOMY_8113.setDescription('Genbank common name: cichlids\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_8113.setLabel('Cichlidae') -vocabulary_term_NCBI_TAXONOMY_8113.setOrdinal(12) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8113) - -vocabulary_term_NCBI_TAXONOMY_481459 = tr.createNewVocabularyTerm('481459') -vocabulary_term_NCBI_TAXONOMY_481459.setDescription('Genbank common name: three-spined stickleback\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_481459.setLabel('Gasterosteus aculeatus aculeatus') -vocabulary_term_NCBI_TAXONOMY_481459.setOrdinal(13) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_481459) - -vocabulary_term_NCBI_TAXONOMY_282301 = tr.createNewVocabularyTerm('282301') -vocabulary_term_NCBI_TAXONOMY_282301.setDescription('Inherited blast name: flatworms') -vocabulary_term_NCBI_TAXONOMY_282301.setLabel('Macrostomum lignano') -vocabulary_term_NCBI_TAXONOMY_282301.setOrdinal(14) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_282301) - -vocabulary_term_NCBI_TAXONOMY_99287 = tr.createNewVocabularyTerm('99287') -vocabulary_term_NCBI_TAXONOMY_99287.setDescription('Inherited blast name: enterobacteria') -vocabulary_term_NCBI_TAXONOMY_99287.setLabel('Salmonella enterica subsp. enterica serovar Typhimurium str. LT2') -vocabulary_term_NCBI_TAXONOMY_99287.setOrdinal(15) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_99287) - -vocabulary_term_NCBI_TAXONOMY_4896 = tr.createNewVocabularyTerm('4896') -vocabulary_term_NCBI_TAXONOMY_4896.setDescription('Genbank common name: fission yeast\ Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4896.setLabel('Schizosaccharomyces pombe') -vocabulary_term_NCBI_TAXONOMY_4896.setOrdinal(16) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4896) - -vocabulary_term_NCBI_TAXONOMY_4897 = tr.createNewVocabularyTerm('4897') -vocabulary_term_NCBI_TAXONOMY_4897.setDescription('Inherited blast name: ascomycetes') -vocabulary_term_NCBI_TAXONOMY_4897.setLabel('Schizosaccharomyces japonicus') -vocabulary_term_NCBI_TAXONOMY_4897.setOrdinal(17) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4897) - -vocabulary_term_NCBI_TAXONOMY_7955 = tr.createNewVocabularyTerm('7955') -vocabulary_term_NCBI_TAXONOMY_7955.setDescription('Genbank common name: zebrafish\ Inherited blast name: bony fishes') -vocabulary_term_NCBI_TAXONOMY_7955.setLabel('Danio rerio') -vocabulary_term_NCBI_TAXONOMY_7955.setOrdinal(18) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_7955) - -vocabulary_term_NCBI_TAXONOMY_3702 = tr.createNewVocabularyTerm('3702') -vocabulary_term_NCBI_TAXONOMY_3702.setDescription('Genbank common name: thale cress\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3702.setLabel('Arabidopsis thaliana') -vocabulary_term_NCBI_TAXONOMY_3702.setOrdinal(19) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3702) - -vocabulary_term_NCBI_TAXONOMY_225322 = tr.createNewVocabularyTerm('225322') -vocabulary_term_NCBI_TAXONOMY_225322.setDescription('Bacterium which infects Daphnia\ Pasteuria ramosa Metchnikoff 1888 (Approved Lists 1980) emend. Starr et al. 1986\ Ebert D, Rainey P, Embley TM, Scholz D. Development, life\ cycle, ultrastructure and phylogenetic position of Pasteuria ramosa Metchnikoff 1888: rediscovery of an obligate \ endoparasite of Daphnia magna Straus. Philos Trans R Soc \ Lond Ser B. 1996;351:1689.') -vocabulary_term_NCBI_TAXONOMY_225322.setLabel('Pasteuria ramosa') -vocabulary_term_NCBI_TAXONOMY_225322.setOrdinal(20) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_225322) - -vocabulary_term_NCBI_TAXONOMY_9913 = tr.createNewVocabularyTerm('9913') -vocabulary_term_NCBI_TAXONOMY_9913.setDescription('Genbank common name: cattle\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9913.setLabel('Bos taurus') -vocabulary_term_NCBI_TAXONOMY_9913.setOrdinal(21) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9913) - -vocabulary_term_NCBI_TAXONOMY_9823 = tr.createNewVocabularyTerm('9823') -vocabulary_term_NCBI_TAXONOMY_9823.setDescription('Genbank common name: pig\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9823.setLabel('Sus scrofa') -vocabulary_term_NCBI_TAXONOMY_9823.setOrdinal(22) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9823) - -vocabulary_term_NCBI_TAXONOMY_9940 = tr.createNewVocabularyTerm('9940') -vocabulary_term_NCBI_TAXONOMY_9940.setDescription('Genbank common name: sheep\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9940.setLabel('Ovis aries') -vocabulary_term_NCBI_TAXONOMY_9940.setOrdinal(23) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9940) - -vocabulary_term_NCBI_TAXONOMY_9925 = tr.createNewVocabularyTerm('9925') -vocabulary_term_NCBI_TAXONOMY_9925.setDescription('Genbank common name: goat\ Inherited blast name: even-toed ungulates') -vocabulary_term_NCBI_TAXONOMY_9925.setLabel('Capra hircus') -vocabulary_term_NCBI_TAXONOMY_9925.setOrdinal(24) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_9925) - -vocabulary_term_NCBI_TAXONOMY_8153 = tr.createNewVocabularyTerm('8153') -vocabulary_term_NCBI_TAXONOMY_8153.setDescription('Common name: cichlid fish') -vocabulary_term_NCBI_TAXONOMY_8153.setLabel('Haplochromis burtoni') -vocabulary_term_NCBI_TAXONOMY_8153.setOrdinal(25) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_8153) - -vocabulary_term_NCBI_TAXONOMY_61818 = tr.createNewVocabularyTerm('61818') -vocabulary_term_NCBI_TAXONOMY_61818.setDescription('Common name: bony fish') -vocabulary_term_NCBI_TAXONOMY_61818.setLabel('Amphilophus (nicaraguan)') -vocabulary_term_NCBI_TAXONOMY_61818.setOrdinal(26) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_61818) - -vocabulary_term_NCBI_TAXONOMY_35525 = tr.createNewVocabularyTerm('35525') -vocabulary_term_NCBI_TAXONOMY_35525.setDescription('Common name: water flea') -vocabulary_term_NCBI_TAXONOMY_35525.setLabel('Daphnia Magna') -vocabulary_term_NCBI_TAXONOMY_35525.setOrdinal(27) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_35525) - -vocabulary_term_NCBI_TAXONOMY_4081 = tr.createNewVocabularyTerm('4081') -vocabulary_term_NCBI_TAXONOMY_4081.setDescription('Common Name: tomato') -vocabulary_term_NCBI_TAXONOMY_4081.setLabel('Solanum lycopersicum (tomato)') -vocabulary_term_NCBI_TAXONOMY_4081.setOrdinal(28) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_4081) - -vocabulary_term_NCBI_TAXONOMY_13068 = tr.createNewVocabularyTerm('13068') -vocabulary_term_NCBI_TAXONOMY_13068.setDescription('Common name: earwig') -vocabulary_term_NCBI_TAXONOMY_13068.setLabel('Forficula auricularia (earwig)') -vocabulary_term_NCBI_TAXONOMY_13068.setOrdinal(29) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_13068) - -vocabulary_term_NCBI_TAXONOMY_3569 = tr.createNewVocabularyTerm('3569') -vocabulary_term_NCBI_TAXONOMY_3569.setDescription('Genbank common name: clove pink') -vocabulary_term_NCBI_TAXONOMY_3569.setLabel('Dianthus') -vocabulary_term_NCBI_TAXONOMY_3569.setOrdinal(30) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3569) - -vocabulary_term_NCBI_TAXONOMY_3573 = tr.createNewVocabularyTerm('3573') -vocabulary_term_NCBI_TAXONOMY_3573.setDescription('Genbank common name: campions\ Inherited blast name: eudicots') -vocabulary_term_NCBI_TAXONOMY_3573.setLabel('Silene') -vocabulary_term_NCBI_TAXONOMY_3573.setOrdinal(31) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_3573) - -vocabulary_term_NCBI_TAXONOMY_32644 = tr.createNewVocabularyTerm('32644') -vocabulary_term_NCBI_TAXONOMY_32644.setDescription('Inherited blast name: unclassified') -vocabulary_term_NCBI_TAXONOMY_32644.setLabel('unidentified') -vocabulary_term_NCBI_TAXONOMY_32644.setOrdinal(32) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_32644) - -vocabulary_term_NCBI_TAXONOMY_0000 = tr.createNewVocabularyTerm('0000') -vocabulary_term_NCBI_TAXONOMY_0000.setDescription(None) -vocabulary_term_NCBI_TAXONOMY_0000.setLabel('OTHER') -vocabulary_term_NCBI_TAXONOMY_0000.setOrdinal(33) -vocabulary_NCBI_TAXONOMY.addTerm(vocabulary_term_NCBI_TAXONOMY_0000) - -vocabulary_PIPELINE_VERSION = tr.getOrCreateNewVocabulary('PIPELINE_VERSION') -vocabulary_PIPELINE_VERSION.setDescription('With which pipeline version has the data been analyzed?') -vocabulary_PIPELINE_VERSION.setUrlTemplate(None) -vocabulary_PIPELINE_VERSION.setManagedInternally(False) -vocabulary_PIPELINE_VERSION.setChosenFromList(True) - -vocabulary_term_PIPELINE_VERSION_11348 = tr.createNewVocabularyTerm('1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setDescription(None) -vocabulary_term_PIPELINE_VERSION_11348.setLabel('RTA 1.13.48') -vocabulary_term_PIPELINE_VERSION_11348.setOrdinal(1) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11348) - -vocabulary_term_PIPELINE_VERSION_11242 = tr.createNewVocabularyTerm('1.12.4.2') -vocabulary_term_PIPELINE_VERSION_11242.setDescription('Real Time Analysis in combination with HCS 1.4.8') -vocabulary_term_PIPELINE_VERSION_11242.setLabel('RTA 1.12.4.2 (HiSeq 2000)') -vocabulary_term_PIPELINE_VERSION_11242.setOrdinal(2) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_11242) - -vocabulary_term_PIPELINE_VERSION_112 = tr.createNewVocabularyTerm('1.12') -vocabulary_term_PIPELINE_VERSION_112.setDescription('Real Time Analysis 1.12 HiSeq 2000') -vocabulary_term_PIPELINE_VERSION_112.setLabel('RTA 1.12') -vocabulary_term_PIPELINE_VERSION_112.setOrdinal(3) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_112) - -vocabulary_term_PIPELINE_VERSION_19 = tr.createNewVocabularyTerm('1.9') -vocabulary_term_PIPELINE_VERSION_19.setDescription('Real Time Analysis 1.9') -vocabulary_term_PIPELINE_VERSION_19.setLabel('RTA 1.9 (GA IIx)') -vocabulary_term_PIPELINE_VERSION_19.setOrdinal(4) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_19) - -vocabulary_term_PIPELINE_VERSION_RTA_18 = tr.createNewVocabularyTerm('RTA_1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setDescription('Real Time Analysis 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setLabel('RTA 1.8') -vocabulary_term_PIPELINE_VERSION_RTA_18.setOrdinal(5) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_18) - -vocabulary_term_PIPELINE_VERSION_RTA_16 = tr.createNewVocabularyTerm('RTA_1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setDescription('Real Time Analysis 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setLabel('RTA 1.6') -vocabulary_term_PIPELINE_VERSION_RTA_16.setOrdinal(6) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_16) - -vocabulary_term_PIPELINE_VERSION_RTA_15 = tr.createNewVocabularyTerm('RTA_1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_15.setLabel('RTA 1.5') -vocabulary_term_PIPELINE_VERSION_RTA_15.setOrdinal(7) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_15) - -vocabulary_term_PIPELINE_VERSION_RTA_14150 = tr.createNewVocabularyTerm('RTA_1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setDescription(None) -vocabulary_term_PIPELINE_VERSION_RTA_14150.setLabel('RTA 1.4.15.0') -vocabulary_term_PIPELINE_VERSION_RTA_14150.setOrdinal(8) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_RTA_14150) - -vocabulary_term_PIPELINE_VERSION_15 = tr.createNewVocabularyTerm('1.5') -vocabulary_term_PIPELINE_VERSION_15.setDescription(None) -vocabulary_term_PIPELINE_VERSION_15.setLabel(None) -vocabulary_term_PIPELINE_VERSION_15.setOrdinal(9) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_15) - -vocabulary_term_PIPELINE_VERSION_14 = tr.createNewVocabularyTerm('1.4') -vocabulary_term_PIPELINE_VERSION_14.setDescription(None) -vocabulary_term_PIPELINE_VERSION_14.setLabel(None) -vocabulary_term_PIPELINE_VERSION_14.setOrdinal(10) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_14) - -vocabulary_term_PIPELINE_VERSION_132 = tr.createNewVocabularyTerm('1.3.2') -vocabulary_term_PIPELINE_VERSION_132.setDescription(None) -vocabulary_term_PIPELINE_VERSION_132.setLabel(None) -vocabulary_term_PIPELINE_VERSION_132.setOrdinal(11) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_132) - -vocabulary_term_PIPELINE_VERSION_10 = tr.createNewVocabularyTerm('1.0') -vocabulary_term_PIPELINE_VERSION_10.setDescription(None) -vocabulary_term_PIPELINE_VERSION_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_10.setOrdinal(12) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_10) - -vocabulary_term_PIPELINE_VERSION_PRE_10 = tr.createNewVocabularyTerm('PRE_1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setDescription('Before Pipeline Version 1.0') -vocabulary_term_PIPELINE_VERSION_PRE_10.setLabel(None) -vocabulary_term_PIPELINE_VERSION_PRE_10.setOrdinal(13) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_PRE_10) - -vocabulary_term_PIPELINE_VERSION_NONE = tr.createNewVocabularyTerm('NONE') -vocabulary_term_PIPELINE_VERSION_NONE.setDescription(None) -vocabulary_term_PIPELINE_VERSION_NONE.setLabel(None) -vocabulary_term_PIPELINE_VERSION_NONE.setOrdinal(14) -vocabulary_PIPELINE_VERSION.addTerm(vocabulary_term_PIPELINE_VERSION_NONE) - -vocabulary_SAMPLE_TYPE = tr.getOrCreateNewVocabulary('SAMPLE_TYPE') -vocabulary_SAMPLE_TYPE.setDescription('Type of sample delivered by the customer') -vocabulary_SAMPLE_TYPE.setUrlTemplate(None) -vocabulary_SAMPLE_TYPE.setManagedInternally(False) -vocabulary_SAMPLE_TYPE.setChosenFromList(True) - -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY = tr.createNewVocabularyTerm('PROCESSED_DNA_LIBRARY') -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setDescription(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setLabel(None) -vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY.setOrdinal(1) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_PROCESSED_DNA_LIBRARY) - -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE = tr.createNewVocabularyTerm('POOLED_SAMPLE') -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setDescription(None) -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setLabel(None) -vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE.setOrdinal(2) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_POOLED_SAMPLE) - -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA = tr.createNewVocabularyTerm('GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA.setOrdinal(3) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_SMALL_RNA = tr.createNewVocabularyTerm('SMALL_RNA') -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SMALL_RNA.setOrdinal(4) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SMALL_RNA) - -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA = tr.createNewVocabularyTerm('TOTAL_RNA') -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_TOTAL_RNA.setOrdinal(5) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_TOTAL_RNA) - -vocabulary_term_SAMPLE_TYPE_CHIP = tr.createNewVocabularyTerm('CHIP') -vocabulary_term_SAMPLE_TYPE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_CHIP.setOrdinal(6) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_CHIP) - -vocabulary_term_SAMPLE_TYPE_VIRAL = tr.createNewVocabularyTerm('VIRAL') -vocabulary_term_SAMPLE_TYPE_VIRAL.setDescription(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setLabel(None) -vocabulary_term_SAMPLE_TYPE_VIRAL.setOrdinal(7) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_VIRAL) - -vocabulary_term_SAMPLE_TYPE_SYNTHETIC = tr.createNewVocabularyTerm('SYNTHETIC') -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_SYNTHETIC.setOrdinal(8) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_SYNTHETIC) - -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA = tr.createNewVocabularyTerm('FRAGMENTED_GENOMIC_DNA') -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA.setOrdinal(9) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_FRAGMENTED_GENOMIC_DNA) - -vocabulary_term_SAMPLE_TYPE_MRNA = tr.createNewVocabularyTerm('MRNA') -vocabulary_term_SAMPLE_TYPE_MRNA.setDescription(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setLabel(None) -vocabulary_term_SAMPLE_TYPE_MRNA.setOrdinal(10) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_MRNA) - -vocabulary_term_SAMPLE_TYPE_OTHER = tr.createNewVocabularyTerm('OTHER') -vocabulary_term_SAMPLE_TYPE_OTHER.setDescription(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setLabel(None) -vocabulary_term_SAMPLE_TYPE_OTHER.setOrdinal(11) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_OTHER) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP = tr.createNewVocabularyTerm('BISULFITE_CHIP') -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP.setOrdinal(13) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_CHIP) - -vocabulary_term_SAMPLE_TYPE_NONGENOMIC = tr.createNewVocabularyTerm('NON-GENOMIC') -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setDescription(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setLabel(None) -vocabulary_term_SAMPLE_TYPE_NONGENOMIC.setOrdinal(14) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_NONGENOMIC) - -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED = tr.createNewVocabularyTerm('BISULFITE_TREATED') -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setDescription(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setLabel(None) -vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED.setOrdinal(15) -vocabulary_SAMPLE_TYPE.addTerm(vocabulary_term_SAMPLE_TYPE_BISULFITE_TREATED) - -vocabulary_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewVocabulary('SBS_SEQUENCING_KIT_VERSION') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setDescription('Version of the Sequencing by Synthesis (SBS) Kit') -vocabulary_SBS_SEQUENCING_KIT_VERSION.setUrlTemplate(None) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) -vocabulary_SBS_SEQUENCING_KIT_VERSION.setChosenFromList(True) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5 = tr.createNewVocabularyTerm('TRUSEQ_V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setLabel('TruSeq v5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5.setOrdinal(1) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_TRUSEQ_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5 = tr.createNewVocabularyTerm('V5') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5.setOrdinal(2) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V5) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4 = tr.createNewVocabularyTerm('V4') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4.setOrdinal(3) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V4) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3 = tr.createNewVocabularyTerm('V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setLabel(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3.setOrdinal(4) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_V3) - -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3 = tr.createNewVocabularyTerm('SBS_HS_V3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setDescription(None) -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setLabel('TruSeq SBS HS v3') -vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3.setOrdinal(5) -vocabulary_SBS_SEQUENCING_KIT_VERSION.addTerm(vocabulary_term_SBS_SEQUENCING_KIT_VERSION_SBS_HS_V3) - -vocabulary_SEQUENCER = tr.getOrCreateNewVocabulary('SEQUENCER') -vocabulary_SEQUENCER.setDescription('Which Sequencer was used?') -vocabulary_SEQUENCER.setUrlTemplate(None) -vocabulary_SEQUENCER.setManagedInternally(False) -vocabulary_SEQUENCER.setChosenFromList(True) - -vocabulary_term_SEQUENCER_M00721 = tr.createNewVocabularyTerm('M00721') -vocabulary_term_SEQUENCER_M00721.setDescription(None) -vocabulary_term_SEQUENCER_M00721.setLabel('MiSeq') -vocabulary_term_SEQUENCER_M00721.setOrdinal(6) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_M00721) - -vocabulary_term_SEQUENCER_SN792 = tr.createNewVocabularyTerm('SN792') -vocabulary_term_SEQUENCER_SN792.setDescription(None) -vocabulary_term_SEQUENCER_SN792.setLabel('HiSeq 2000') -vocabulary_term_SEQUENCER_SN792.setOrdinal(7) -vocabulary_SEQUENCER.addTerm(vocabulary_term_SEQUENCER_SN792) - -vocabulary_SEQUENCING_APPLICATION = tr.getOrCreateNewVocabulary('SEQUENCING_APPLICATION') -vocabulary_SEQUENCING_APPLICATION.setDescription('Type of experiment of the High Throughput Sequencing applications') -vocabulary_SEQUENCING_APPLICATION.setUrlTemplate(None) -vocabulary_SEQUENCING_APPLICATION.setManagedInternally(False) -vocabulary_SEQUENCING_APPLICATION.setChosenFromList(True) - -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ = tr.createNewVocabularyTerm('SMALL_RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ.setOrdinal(1) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_SMALL_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ = tr.createNewVocabularyTerm('RNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ.setOrdinal(2) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_RNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ = tr.createNewVocabularyTerm('GENOMIC_DNA_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ.setOrdinal(3) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_GENOMIC_DNA_SEQ) - -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ = tr.createNewVocabularyTerm('CHIP_SEQ') -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setDescription(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setLabel(None) -vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ.setOrdinal(4) -vocabulary_SEQUENCING_APPLICATION.addTerm(vocabulary_term_SEQUENCING_APPLICATION_CHIP_SEQ) - -vocabulary_YES_NO = tr.getOrCreateNewVocabulary('YES_NO') -vocabulary_YES_NO.setDescription('Just offers YES or NO') -vocabulary_YES_NO.setUrlTemplate(None) -vocabulary_YES_NO.setManagedInternally(False) -vocabulary_YES_NO.setChosenFromList(True) - -vocabulary_term_YES_NO_YES = tr.createNewVocabularyTerm('YES') -vocabulary_term_YES_NO_YES.setDescription(None) -vocabulary_term_YES_NO_YES.setLabel(None) -vocabulary_term_YES_NO_YES.setOrdinal(1) -vocabulary_YES_NO.addTerm(vocabulary_term_YES_NO_YES) - -vocabulary_term_YES_NO_NO = tr.createNewVocabularyTerm('NO') -vocabulary_term_YES_NO_NO.setDescription(None) -vocabulary_term_YES_NO_NO.setLabel(None) -vocabulary_term_YES_NO_NO.setOrdinal(2) -vocabulary_YES_NO.addTerm(vocabulary_term_YES_NO_NO) - -print "Imported 22 Vocabularies" -script_Diff_time = tr.getOrCreateNewScript('Diff_time') -script_Diff_time.setName('Diff_time') -script_Diff_time.setDescription('Calculates the difference of two given dates') -script_Diff_time.setScript('''from datetime import datetime - -def dateTimeSplitter(openbisDate): - dateAndTime, tz = openbisDate.rsplit(" ", 1) - pythonDateTime = datetime.strptime(dateAndTime, "%Y-%m-%d %H:%M:%S") - return pythonDateTime - -def calculate(): - - try: - start = dateTimeSplitter(entity.propertyValue('FLOW_CELL_SEQUENCED_ON')) - end = dateTimeSplitter(entity.propertyValue('SEQUENCER_FINISHED')) - diffTime = end-start - return str(diffTime) - except: - return "N/A" -''') -script_Diff_time.setEntityForScript('SAMPLE') -script_Diff_time.setScriptType('DYNAMIC_PROPERTY') - -script_Has_Parents = tr.getOrCreateNewScript('Has_Parents') -script_Has_Parents.setName('Has_Parents') -script_Has_Parents.setDescription('Check if the Entity has a parent') -script_Has_Parents.setScript('''def validate(entity, isNew): - parents = entity.entityPE().parents - if parents: - return None - else: - return "No Parents have been selected!" -''') -script_Has_Parents.setEntityForScript('SAMPLE') -script_Has_Parents.setScriptType('ENTITY_VALIDATION') - -print "Imported 2 Scripts" -exp_type_HT_SEQUENCING = tr.getOrCreateNewExperimentType('HT_SEQUENCING') -exp_type_HT_SEQUENCING.setDescription('High Throughput Sequencing (e.g. Illumina HiSeq, Illumina GA)') - - -print "Imported 1 Experiment Types" -samp_type_ILLUMINA_FLOW_CELL = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_CELL') -samp_type_ILLUMINA_FLOW_CELL.setDescription('Container of ILLUMINA_FLOW_LANES\ Can be created automatically by a drop box and the properties can be filled from the RunInfo.xml and runParameters.xml files') -samp_type_ILLUMINA_FLOW_CELL.setListable(True) -samp_type_ILLUMINA_FLOW_CELL.setShowContainer(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParents(False) -samp_type_ILLUMINA_FLOW_CELL.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_CELL.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_CELL.setShowParentMetadata(False) -samp_type_ILLUMINA_FLOW_CELL.setGeneratedCodePrefix('FLOWCELL-') - - -samp_type_ILLUMINA_FLOW_LANE = tr.getOrCreateNewSampleType('ILLUMINA_FLOW_LANE') -samp_type_ILLUMINA_FLOW_LANE.setDescription('Child of LIBRARY or POOL') -samp_type_ILLUMINA_FLOW_LANE.setListable(True) -samp_type_ILLUMINA_FLOW_LANE.setShowContainer(True) -samp_type_ILLUMINA_FLOW_LANE.setShowParents(True) -samp_type_ILLUMINA_FLOW_LANE.setSubcodeUnique(False) -samp_type_ILLUMINA_FLOW_LANE.setAutoGeneratedCode(False) -samp_type_ILLUMINA_FLOW_LANE.setShowParentMetadata(True) -samp_type_ILLUMINA_FLOW_LANE.setGeneratedCodePrefix('FLOWLANE-') - - -samp_type_LIBRARY = tr.getOrCreateNewSampleType('LIBRARY') -samp_type_LIBRARY.setDescription('Child of RAW and potential parent of POOL') -samp_type_LIBRARY.setListable(True) -samp_type_LIBRARY.setShowContainer(False) -samp_type_LIBRARY.setShowParents(True) -samp_type_LIBRARY.setSubcodeUnique(False) -samp_type_LIBRARY.setAutoGeneratedCode(True) -samp_type_LIBRARY.setShowParentMetadata(True) -samp_type_LIBRARY.setGeneratedCodePrefix('BSSE-QGF-LIBRARY-') -samp_type_LIBRARY.setValidationScript(script_Has_Parents) - -samp_type_LIBRARY_POOL = tr.getOrCreateNewSampleType('LIBRARY_POOL') -samp_type_LIBRARY_POOL.setDescription('Child of several LIBRARY samples, used for multiplexing') -samp_type_LIBRARY_POOL.setListable(True) -samp_type_LIBRARY_POOL.setShowContainer(False) -samp_type_LIBRARY_POOL.setShowParents(True) -samp_type_LIBRARY_POOL.setSubcodeUnique(False) -samp_type_LIBRARY_POOL.setAutoGeneratedCode(True) -samp_type_LIBRARY_POOL.setShowParentMetadata(True) -samp_type_LIBRARY_POOL.setGeneratedCodePrefix('BSSE-QGF-POOL-') -samp_type_LIBRARY_POOL.setValidationScript(script_Has_Parents) - -samp_type_MASTER_SAMPLE = tr.getOrCreateNewSampleType('MASTER_SAMPLE') -samp_type_MASTER_SAMPLE.setDescription('Sample Type holding Master Data and a parent to RAW') -samp_type_MASTER_SAMPLE.setListable(True) -samp_type_MASTER_SAMPLE.setShowContainer(False) -samp_type_MASTER_SAMPLE.setShowParents(False) -samp_type_MASTER_SAMPLE.setSubcodeUnique(False) -samp_type_MASTER_SAMPLE.setAutoGeneratedCode(True) -samp_type_MASTER_SAMPLE.setShowParentMetadata(False) -samp_type_MASTER_SAMPLE.setGeneratedCodePrefix('BSSE-QGF-MASTER-') - - -samp_type_RAW_SAMPLE = tr.getOrCreateNewSampleType('RAW_SAMPLE') -samp_type_RAW_SAMPLE.setDescription('Child of MASTER') -samp_type_RAW_SAMPLE.setListable(True) -samp_type_RAW_SAMPLE.setShowContainer(False) -samp_type_RAW_SAMPLE.setShowParents(True) -samp_type_RAW_SAMPLE.setSubcodeUnique(False) -samp_type_RAW_SAMPLE.setAutoGeneratedCode(True) -samp_type_RAW_SAMPLE.setShowParentMetadata(True) -samp_type_RAW_SAMPLE.setGeneratedCodePrefix('BSSE-QGF-RAW-') -samp_type_RAW_SAMPLE.setValidationScript(script_Has_Parents) - -print "Imported 6 Sample Types" -data_set_type_ALIGNMENT = tr.getOrCreateNewDataSetType('ALIGNMENT') -data_set_type_ALIGNMENT.setDescription('Aligner ouput, ideally bam/sam') -data_set_type_ALIGNMENT.setMainDataSetPattern(None) -data_set_type_ALIGNMENT.setMainDataSetPath(None) -data_set_type_ALIGNMENT.setDeletionDisallowed(False) - - -data_set_type_BASECALL_STATS = tr.getOrCreateNewDataSetType('BASECALL_STATS') -data_set_type_BASECALL_STATS.setDescription('Base Call Statistics from the Illumina Pipeline (configureBclToFastq.pl)') -data_set_type_BASECALL_STATS.setMainDataSetPattern('original/.*/.*/Demultiplex_Stats.htm') -data_set_type_BASECALL_STATS.setMainDataSetPath(None) -data_set_type_BASECALL_STATS.setDeletionDisallowed(False) - - -data_set_type_BIGWIGGLE = tr.getOrCreateNewDataSetType('BIGWIGGLE') -data_set_type_BIGWIGGLE.setDescription('Visualization') -data_set_type_BIGWIGGLE.setMainDataSetPattern(None) -data_set_type_BIGWIGGLE.setMainDataSetPath(None) -data_set_type_BIGWIGGLE.setDeletionDisallowed(False) - - -data_set_type_ELAND_ALIGNMENT = tr.getOrCreateNewDataSetType('ELAND_ALIGNMENT') -data_set_type_ELAND_ALIGNMENT.setDescription('Illumina Eland Alignment Output') -data_set_type_ELAND_ALIGNMENT.setMainDataSetPattern(None) -data_set_type_ELAND_ALIGNMENT.setMainDataSetPath(None) -data_set_type_ELAND_ALIGNMENT.setDeletionDisallowed(False) - - -data_set_type_FASTQ_GZ = tr.getOrCreateNewDataSetType('FASTQ_GZ') -data_set_type_FASTQ_GZ.setDescription('Gzipped Fastq file produced by Casava 1.8+') -data_set_type_FASTQ_GZ.setMainDataSetPattern(None) -data_set_type_FASTQ_GZ.setMainDataSetPath(None) -data_set_type_FASTQ_GZ.setDeletionDisallowed(False) - - -data_set_type_ILLUMINA_HISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_HISEQ_OUTPUT') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDescription('HiSeq2000 Output') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setMainDataSetPattern('original/.*/Data/Status.htm') -data_set_type_ILLUMINA_HISEQ_OUTPUT.setMainDataSetPath(None) -data_set_type_ILLUMINA_HISEQ_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_ILLUMINA_MISEQ_OUTPUT = tr.getOrCreateNewDataSetType('ILLUMINA_MISEQ_OUTPUT') -data_set_type_ILLUMINA_MISEQ_OUTPUT.setDescription('MiSeq Output') -data_set_type_ILLUMINA_MISEQ_OUTPUT.setMainDataSetPattern(None) -data_set_type_ILLUMINA_MISEQ_OUTPUT.setMainDataSetPath(None) -data_set_type_ILLUMINA_MISEQ_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_MACS_OUTPUT = tr.getOrCreateNewDataSetType('MACS_OUTPUT') -data_set_type_MACS_OUTPUT.setDescription('MACS Peak Caller output') -data_set_type_MACS_OUTPUT.setMainDataSetPattern(None) -data_set_type_MACS_OUTPUT.setMainDataSetPath(None) -data_set_type_MACS_OUTPUT.setDeletionDisallowed(False) - - -data_set_type_QUALITY_JPGS = tr.getOrCreateNewDataSetType('QUALITY_JPGS') -data_set_type_QUALITY_JPGS.setDescription('R generated Quality plots') -data_set_type_QUALITY_JPGS.setMainDataSetPattern(None) -data_set_type_QUALITY_JPGS.setMainDataSetPath(None) -data_set_type_QUALITY_JPGS.setDeletionDisallowed(False) - - -data_set_type_QUALITY_PDFS = tr.getOrCreateNewDataSetType('QUALITY_PDFS') -data_set_type_QUALITY_PDFS.setDescription('R generated pdfs showing quality data') -data_set_type_QUALITY_PDFS.setMainDataSetPattern(None) -data_set_type_QUALITY_PDFS.setMainDataSetPath(None) -data_set_type_QUALITY_PDFS.setDeletionDisallowed(False) - - -data_set_type_QUALITY_SVG = tr.getOrCreateNewDataSetType('QUALITY_SVG') -data_set_type_QUALITY_SVG.setDescription('R generated Quality plots') -data_set_type_QUALITY_SVG.setMainDataSetPattern(None) -data_set_type_QUALITY_SVG.setMainDataSetPath(None) -data_set_type_QUALITY_SVG.setDeletionDisallowed(False) - - -data_set_type_RUNINFO = tr.getOrCreateNewDataSetType('RUNINFO') -data_set_type_RUNINFO.setDescription('Run statstics: Status.html and Status_Files folder') -data_set_type_RUNINFO.setMainDataSetPattern('original/.*/Data/Status.htm') -data_set_type_RUNINFO.setMainDataSetPath(None) -data_set_type_RUNINFO.setDeletionDisallowed(False) - - -data_set_type_THUMBNAILS = tr.getOrCreateNewDataSetType('THUMBNAILS') -data_set_type_THUMBNAILS.setDescription('Thumbnails provided by the Illumina software') -data_set_type_THUMBNAILS.setMainDataSetPattern(None) -data_set_type_THUMBNAILS.setMainDataSetPath(None) -data_set_type_THUMBNAILS.setDeletionDisallowed(False) - - -data_set_type_TSV = tr.getOrCreateNewDataSetType('TSV') -data_set_type_TSV.setDescription('Tab separated files') -data_set_type_TSV.setMainDataSetPattern(None) -data_set_type_TSV.setMainDataSetPath(None) -data_set_type_TSV.setDeletionDisallowed(False) - - -print "Imported 15 Data Set Types" -print "Imported 0 Material Types" -prop_type_AGILENT_KIT = tr.getOrCreateNewPropertyType('AGILENT_KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_AGILENT_KIT.setLabel('Agilent Kit') -prop_type_AGILENT_KIT.setManagedInternally(False) - -prop_type_AGILENT_KIT.setVocabulary(vocabulary_AGILENT_KIT) - -prop_type_ALIGNMENT_SOFTWARE = tr.getOrCreateNewPropertyType('ALIGNMENT_SOFTWARE', DataType.CONTROLLEDVOCABULARY) -prop_type_ALIGNMENT_SOFTWARE.setLabel('Alignment software') -prop_type_ALIGNMENT_SOFTWARE.setManagedInternally(False) - -prop_type_ALIGNMENT_SOFTWARE.setVocabulary(vocabulary_ALIGNMENT_SOFTWARE) - -prop_type_ANALYSIS_FINISHED = tr.getOrCreateNewPropertyType('ANALYSIS_FINISHED', DataType.TIMESTAMP) -prop_type_ANALYSIS_FINISHED.setLabel('Analysis finished') -prop_type_ANALYSIS_FINISHED.setManagedInternally(False) - - -prop_type_BARCODE_COMPLEXITY_CHECKER = tr.getOrCreateNewPropertyType('BARCODE_COMPLEXITY_CHECKER', DataType.MULTILINE_VARCHAR) -prop_type_BARCODE_COMPLEXITY_CHECKER.setLabel('Barcode_Complexity_Checker') -prop_type_BARCODE_COMPLEXITY_CHECKER.setManagedInternally(False) - - -prop_type_BASESCOVERED = tr.getOrCreateNewPropertyType('BASESCOVERED', DataType.INTEGER) -prop_type_BASESCOVERED.setLabel('bases Covered') -prop_type_BASESCOVERED.setManagedInternally(False) - - -prop_type_BIOLOGICAL_SAMPLE_ARRIVED = tr.getOrCreateNewPropertyType('BIOLOGICAL_SAMPLE_ARRIVED', DataType.TIMESTAMP) -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setLabel('Arrival Date of Biological Sample') -prop_type_BIOLOGICAL_SAMPLE_ARRIVED.setManagedInternally(False) - - -prop_type_CASAVA_VERSION = tr.getOrCreateNewPropertyType('CASAVA_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CASAVA_VERSION.setLabel('Casava Version') -prop_type_CASAVA_VERSION.setManagedInternally(False) - -prop_type_CASAVA_VERSION.setVocabulary(vocabulary_CASAVA_VERSION) - -prop_type_CELL_PLASTICITY_SYSTEMSX = tr.getOrCreateNewPropertyType('CELL_PLASTICITY_SYSTEMSX', DataType.BOOLEAN) -prop_type_CELL_PLASTICITY_SYSTEMSX.setLabel('Cell Plasticity (SystemsX)') -prop_type_CELL_PLASTICITY_SYSTEMSX.setManagedInternally(False) - - -prop_type_CHROMCOUNT = tr.getOrCreateNewPropertyType('CHROMCOUNT', DataType.INTEGER) -prop_type_CHROMCOUNT.setLabel('chrom Count') -prop_type_CHROMCOUNT.setManagedInternally(False) - - -prop_type_CLUSTER_GENERATION_KIT_VERSION = tr.getOrCreateNewPropertyType('CLUSTER_GENERATION_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_GENERATION_KIT_VERSION.setLabel('CS Generation Kit Version') -prop_type_CLUSTER_GENERATION_KIT_VERSION.setManagedInternally(False) - -prop_type_CLUSTER_GENERATION_KIT_VERSION.setVocabulary(vocabulary_CLUSTER_GENERATION_KIT_VERSION) - -prop_type_CLUSTER_STATION = tr.getOrCreateNewPropertyType('CLUSTER_STATION', DataType.CONTROLLEDVOCABULARY) -prop_type_CLUSTER_STATION.setLabel('Cluster Station') -prop_type_CLUSTER_STATION.setManagedInternally(False) - -prop_type_CLUSTER_STATION.setVocabulary(vocabulary_CLUSTER_STATION) - -prop_type_CONCENTRATION = tr.getOrCreateNewPropertyType('CONCENTRATION', DataType.REAL) -prop_type_CONCENTRATION.setLabel(u'Conc. [ng/\u03bcl]') -prop_type_CONCENTRATION.setManagedInternally(False) - - -prop_type_CONCENTRATION_FLOWLANE = tr.getOrCreateNewPropertyType('CONCENTRATION_FLOWLANE', DataType.REAL) -prop_type_CONCENTRATION_FLOWLANE.setLabel('Concentration in flow lane [pM]') -prop_type_CONCENTRATION_FLOWLANE.setManagedInternally(False) - - -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_ORIGINAL_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setLabel(u'Concentration (original) [ng/\u03bcl]') -prop_type_CONCENTRATION_ORIGINAL_ILLUMINA.setManagedInternally(False) - - -prop_type_CONCENTRATION_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('CONCENTRATION_PREPARED_ILLUMINA', DataType.REAL) -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setLabel(u'Concentration (prepared) [ng/\u03bcl]') -prop_type_CONCENTRATION_PREPARED_ILLUMINA.setManagedInternally(False) - - -prop_type_CONTACT_PERSON_EMAIL = tr.getOrCreateNewPropertyType('CONTACT_PERSON_EMAIL', DataType.VARCHAR) -prop_type_CONTACT_PERSON_EMAIL.setLabel('Email of Contact Person') -prop_type_CONTACT_PERSON_EMAIL.setManagedInternally(False) - - -prop_type_CONTACT_PERSON_NAME = tr.getOrCreateNewPropertyType('CONTACT_PERSON_NAME', DataType.VARCHAR) -prop_type_CONTACT_PERSON_NAME.setLabel('Name of Contact Person') -prop_type_CONTACT_PERSON_NAME.setManagedInternally(False) - - -prop_type_CONTROL_LANE = tr.getOrCreateNewPropertyType('CONTROL_LANE', DataType.CONTROLLEDVOCABULARY) -prop_type_CONTROL_LANE.setLabel('Control Lane') -prop_type_CONTROL_LANE.setManagedInternally(False) - -prop_type_CONTROL_LANE.setVocabulary(vocabulary_CONTROL_LANE) - -prop_type_CREATED_ON_CS = tr.getOrCreateNewPropertyType('CREATED_ON_CS', DataType.TIMESTAMP) -prop_type_CREATED_ON_CS.setLabel('Clustering date') -prop_type_CREATED_ON_CS.setManagedInternally(False) - - -prop_type_CS_PROTOCOL_VERSION = tr.getOrCreateNewPropertyType('CS_PROTOCOL_VERSION', DataType.VARCHAR) -prop_type_CS_PROTOCOL_VERSION.setLabel('CS Protocol Version') -prop_type_CS_PROTOCOL_VERSION.setManagedInternally(False) - - -prop_type_CYCLES = tr.getOrCreateNewPropertyType('CYCLES', DataType.INTEGER) -prop_type_CYCLES.setLabel('Cycles') -prop_type_CYCLES.setManagedInternally(False) - - -prop_type_DATA_TRANSFERRED = tr.getOrCreateNewPropertyType('DATA_TRANSFERRED', DataType.TIMESTAMP) -prop_type_DATA_TRANSFERRED.setLabel('Data transferred') -prop_type_DATA_TRANSFERRED.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_OF_LIBRARY = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_OF_LIBRARY', DataType.INTEGER) -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setLabel('DNA concentration of library (nM)') -prop_type_DNA_CONCENTRATION_OF_LIBRARY.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_POOL = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_POOL', DataType.REAL) -prop_type_DNA_CONCENTRATION_POOL.setLabel('DNA conc. [nM] - customer value') -prop_type_DNA_CONCENTRATION_POOL.setManagedInternally(False) - - -prop_type_DNA_CONCENTRATION_QGF = tr.getOrCreateNewPropertyType('DNA_CONCENTRATION_QGF', DataType.REAL) -prop_type_DNA_CONCENTRATION_QGF.setLabel('DNA concentration of Pool [nM]') -prop_type_DNA_CONCENTRATION_QGF.setManagedInternally(False) - - -prop_type_END_TYPE = tr.getOrCreateNewPropertyType('END_TYPE', DataType.CONTROLLEDVOCABULARY) -prop_type_END_TYPE.setLabel('Paired End / Single Read') -prop_type_END_TYPE.setManagedInternally(False) - -prop_type_END_TYPE.setVocabulary(vocabulary_END_TYPE) - -prop_type_EXPERIMENT_DESIGN = tr.getOrCreateNewPropertyType('EXPERIMENT_DESIGN', DataType.CONTROLLEDVOCABULARY) -prop_type_EXPERIMENT_DESIGN.setLabel('Experiment Design') -prop_type_EXPERIMENT_DESIGN.setManagedInternally(False) - -prop_type_EXPERIMENT_DESIGN.setVocabulary(vocabulary_EXPERIMENT_DESIGN) - -prop_type_EXTERNAL_SAMPLE_NAME = tr.getOrCreateNewPropertyType('EXTERNAL_SAMPLE_NAME', DataType.VARCHAR) -prop_type_EXTERNAL_SAMPLE_NAME.setLabel('External Sample Name') -prop_type_EXTERNAL_SAMPLE_NAME.setManagedInternally(False) - - -prop_type_FLOWCELLTYPE = tr.getOrCreateNewPropertyType('FLOWCELLTYPE', DataType.VARCHAR) -prop_type_FLOWCELLTYPE.setLabel('Flow Cell Type') -prop_type_FLOWCELLTYPE.setManagedInternally(False) - - -prop_type_FLOW_CELL_SEQUENCED_ON = tr.getOrCreateNewPropertyType('FLOW_CELL_SEQUENCED_ON', DataType.TIMESTAMP) -prop_type_FLOW_CELL_SEQUENCED_ON.setLabel('Sequencing started') -prop_type_FLOW_CELL_SEQUENCED_ON.setManagedInternally(False) - - -prop_type_FRAGMENT_SIZE_BASE_PAIRS = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_BASE_PAIRS', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_BASE_PAIRS.setLabel('Fragment Size [base pairs]') -prop_type_FRAGMENT_SIZE_BASE_PAIRS.setManagedInternally(False) - - -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.getOrCreateNewPropertyType('FRAGMENT_SIZE_PREPARED_ILLUMINA', DataType.INTEGER) -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setLabel('Fragment Size (prepared) [base (pairs)]') -prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA.setManagedInternally(False) - - -prop_type_ILLUMINA_PIPELINE_VERSION = tr.getOrCreateNewPropertyType('ILLUMINA_PIPELINE_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_ILLUMINA_PIPELINE_VERSION.setLabel('Pipeline Version') -prop_type_ILLUMINA_PIPELINE_VERSION.setManagedInternally(False) - -prop_type_ILLUMINA_PIPELINE_VERSION.setVocabulary(vocabulary_PIPELINE_VERSION) - -prop_type_INDEX1 = tr.getOrCreateNewPropertyType('INDEX1', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX1.setLabel('Index 1') -prop_type_INDEX1.setManagedInternally(False) - -prop_type_INDEX1.setVocabulary(vocabulary_INDEX1) - -prop_type_INDEX2 = tr.getOrCreateNewPropertyType('INDEX2', DataType.CONTROLLEDVOCABULARY) -prop_type_INDEX2.setLabel('Index 2') -prop_type_INDEX2.setManagedInternally(False) - -prop_type_INDEX2.setVocabulary(vocabulary_INDEX2) - -prop_type_INDEXREAD = tr.getOrCreateNewPropertyType('INDEXREAD', DataType.INTEGER) -prop_type_INDEXREAD.setLabel('Length of Index Read1') -prop_type_INDEXREAD.setManagedInternally(False) - - -prop_type_INDEXREAD2 = tr.getOrCreateNewPropertyType('INDEXREAD2', DataType.INTEGER) -prop_type_INDEXREAD2.setLabel('Length of Index Read2') -prop_type_INDEXREAD2.setManagedInternally(False) - - -prop_type_INVOICE = tr.getOrCreateNewPropertyType('INVOICE', DataType.BOOLEAN) -prop_type_INVOICE.setLabel('Invoice sent?') -prop_type_INVOICE.setManagedInternally(False) - - -prop_type_ISCOMPRESSED = tr.getOrCreateNewPropertyType('ISCOMPRESSED', DataType.BOOLEAN) -prop_type_ISCOMPRESSED.setLabel('Is Compressed') -prop_type_ISCOMPRESSED.setManagedInternally(False) - - -prop_type_ISSUED_COMMAND = tr.getOrCreateNewPropertyType('ISSUED_COMMAND', DataType.MULTILINE_VARCHAR) -prop_type_ISSUED_COMMAND.setLabel('Issued Command') -prop_type_ISSUED_COMMAND.setManagedInternally(False) - - -prop_type_ISSWAPPED = tr.getOrCreateNewPropertyType('ISSWAPPED', DataType.INTEGER) -prop_type_ISSWAPPED.setLabel('Is byte swapped') -prop_type_ISSWAPPED.setManagedInternally(False) - - -prop_type_KIT = tr.getOrCreateNewPropertyType('KIT', DataType.CONTROLLEDVOCABULARY) -prop_type_KIT.setLabel('Library preparation kit') -prop_type_KIT.setManagedInternally(False) - -prop_type_KIT.setVocabulary(vocabulary_KIT) - -prop_type_KIT_PREPARED = tr.getOrCreateNewPropertyType('KIT_PREPARED', DataType.TIMESTAMP) -prop_type_KIT_PREPARED.setLabel('Sample processed') -prop_type_KIT_PREPARED.setManagedInternally(False) - - -prop_type_LANECOUNT = tr.getOrCreateNewPropertyType('LANECOUNT', DataType.INTEGER) -prop_type_LANECOUNT.setLabel('Lane Count') -prop_type_LANECOUNT.setManagedInternally(False) - - -prop_type_LIBRARY_PROCESSING_FAILED = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_FAILED', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_FAILED.setLabel('Library processing failed') -prop_type_LIBRARY_PROCESSING_FAILED.setManagedInternally(False) - - -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_POSSIBLE_YES_NO', DataType.CONTROLLEDVOCABULARY) -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setLabel('Library processing possible') -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setManagedInternally(False) - -prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setVocabulary(vocabulary_YES_NO) - -prop_type_LIBRARY_PROCESSING_SUCCESSFUL = tr.getOrCreateNewPropertyType('LIBRARY_PROCESSING_SUCCESSFUL', DataType.BOOLEAN) -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setLabel('Library processing successful') -prop_type_LIBRARY_PROCESSING_SUCCESSFUL.setManagedInternally(False) - - -prop_type_LOT = tr.getOrCreateNewPropertyType('LOT', DataType.INTEGER) -prop_type_LOT.setLabel('Kit Lot #') -prop_type_LOT.setManagedInternally(False) - - -prop_type_MACS_VERSION = tr.getOrCreateNewPropertyType('MACS_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_MACS_VERSION.setLabel('MACS VERSION') -prop_type_MACS_VERSION.setManagedInternally(False) - -prop_type_MACS_VERSION.setVocabulary(vocabulary_MACS_VERSION) - -prop_type_MAPPED_READS = tr.getOrCreateNewPropertyType('MAPPED_READS', DataType.INTEGER) -prop_type_MAPPED_READS.setLabel('Mapped reads') -prop_type_MAPPED_READS.setManagedInternally(False) - - -prop_type_MAX = tr.getOrCreateNewPropertyType('MAX', DataType.REAL) -prop_type_MAX.setLabel('Maximum') -prop_type_MAX.setManagedInternally(False) - - -prop_type_MEAN = tr.getOrCreateNewPropertyType('MEAN', DataType.REAL) -prop_type_MEAN.setLabel('Mean') -prop_type_MEAN.setManagedInternally(False) - - -prop_type_MIN = tr.getOrCreateNewPropertyType('MIN', DataType.REAL) -prop_type_MIN.setLabel('Minimum') -prop_type_MIN.setManagedInternally(False) - - -prop_type_MISMATCH_IN_INDEX = tr.getOrCreateNewPropertyType('MISMATCH_IN_INDEX', DataType.CONTROLLEDVOCABULARY) -prop_type_MISMATCH_IN_INDEX.setLabel('Mismatch in Index') -prop_type_MISMATCH_IN_INDEX.setManagedInternally(False) - -prop_type_MISMATCH_IN_INDEX.setVocabulary(vocabulary_MISMATCH_IN_INDEX) - -prop_type_NANO_DROP = tr.getOrCreateNewPropertyType('NANO_DROP', DataType.CONTROLLEDVOCABULARY) -prop_type_NANO_DROP.setLabel('Nano Drop') -prop_type_NANO_DROP.setManagedInternally(False) - -prop_type_NANO_DROP.setVocabulary(vocabulary_NANO_DROP) - -prop_type_NCBI_ORGANISM_TAXONOMY = tr.getOrCreateNewPropertyType('NCBI_ORGANISM_TAXONOMY', DataType.CONTROLLEDVOCABULARY) -prop_type_NCBI_ORGANISM_TAXONOMY.setLabel('Organism (NCBI Taxonomy)') -prop_type_NCBI_ORGANISM_TAXONOMY.setManagedInternally(False) - -prop_type_NCBI_ORGANISM_TAXONOMY.setVocabulary(vocabulary_NCBI_TAXONOMY) - -prop_type_NM_DNA = tr.getOrCreateNewPropertyType('NM_DNA', DataType.REAL) -prop_type_NM_DNA.setLabel('Calculated DNA concentration of library (nM)') -prop_type_NM_DNA.setManagedInternally(False) - - -prop_type_NOTES = tr.getOrCreateNewPropertyType('NOTES', DataType.MULTILINE_VARCHAR) -prop_type_NOTES.setLabel('Notes') -prop_type_NOTES.setManagedInternally(False) - - -prop_type_NUMBER_OF_ATTACHMENTS = tr.getOrCreateNewPropertyType('NUMBER_OF_ATTACHMENTS', DataType.INTEGER) -prop_type_NUMBER_OF_ATTACHMENTS.setLabel('Number of Attachments') -prop_type_NUMBER_OF_ATTACHMENTS.setManagedInternally(False) - - -prop_type_PAIRED_END_KIT = tr.getOrCreateNewPropertyType('PAIRED_END_KIT', DataType.VARCHAR) -prop_type_PAIRED_END_KIT.setLabel('Paired End Kit') -prop_type_PAIRED_END_KIT.setManagedInternally(False) - - -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.getOrCreateNewPropertyType('PERCENTAGE_ONE_MISMATCH_READS_INDEX', DataType.REAL) -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setLabel('% One Mismatch Reads (Index)') -prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setManagedInternally(False) - - -prop_type_PERCENTAGE_PASSED_FILTERING = tr.getOrCreateNewPropertyType('PERCENTAGE_PASSED_FILTERING', DataType.REAL) -prop_type_PERCENTAGE_PASSED_FILTERING.setLabel('% Passes Illumina Filtering (PF)') -prop_type_PERCENTAGE_PASSED_FILTERING.setManagedInternally(False) - - -prop_type_PERCENTAGE_PERFECT_INDEX_READS = tr.getOrCreateNewPropertyType('PERCENTAGE_PERFECT_INDEX_READS', DataType.REAL) -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setLabel('% Perfect Index Reads') -prop_type_PERCENTAGE_PERFECT_INDEX_READS.setManagedInternally(False) - - -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.getOrCreateNewPropertyType('PERCENTAGE_RAW_CLUSTERS_PER_LANE', DataType.REAL) -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setLabel('% of raw clusters per lane') -prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setManagedInternally(False) - - -prop_type_PREPARED_BY = tr.getOrCreateNewPropertyType('PREPARED_BY', DataType.VARCHAR) -prop_type_PREPARED_BY.setLabel('Prepared by') -prop_type_PREPARED_BY.setManagedInternally(False) - - -prop_type_PRIMARYDATASIZE = tr.getOrCreateNewPropertyType('PRIMARYDATASIZE', DataType.INTEGER) -prop_type_PRIMARYDATASIZE.setLabel('primary Data Size') -prop_type_PRIMARYDATASIZE.setManagedInternally(False) - - -prop_type_PRIMARYINDEXSIZE = tr.getOrCreateNewPropertyType('PRIMARYINDEXSIZE', DataType.INTEGER) -prop_type_PRIMARYINDEXSIZE.setLabel('primary Index Size') -prop_type_PRIMARYINDEXSIZE.setManagedInternally(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_EMAIL', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setLabel('Email of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_EMAIL.setManagedInternally(False) - - -prop_type_PRINCIPAL_INVESTIGATOR_NAME = tr.getOrCreateNewPropertyType('PRINCIPAL_INVESTIGATOR_NAME', DataType.VARCHAR) -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setLabel('Name of Principal Investigator') -prop_type_PRINCIPAL_INVESTIGATOR_NAME.setManagedInternally(False) - - -prop_type_QC_AT_DBSSE = tr.getOrCreateNewPropertyType('QC_AT_DBSSE', DataType.CONTROLLEDVOCABULARY) -prop_type_QC_AT_DBSSE.setLabel('QC at D-BSSE') -prop_type_QC_AT_DBSSE.setManagedInternally(False) - -prop_type_QC_AT_DBSSE.setVocabulary(vocabulary_YES_NO) - -prop_type_QC_REQUIRED = tr.getOrCreateNewPropertyType('QC_REQUIRED', DataType.CONTROLLEDVOCABULARY) -prop_type_QC_REQUIRED.setLabel('QC required') -prop_type_QC_REQUIRED.setManagedInternally(False) - -prop_type_QC_REQUIRED.setVocabulary(vocabulary_YES_NO) - -prop_type_RUNNINGTIME = tr.getOrCreateNewPropertyType('RUNNINGTIME', DataType.VARCHAR) -prop_type_RUNNINGTIME.setLabel('Running Time') -prop_type_RUNNINGTIME.setManagedInternally(False) - - -prop_type_RUN_FOLDER_NAME = tr.getOrCreateNewPropertyType('RUN_FOLDER_NAME', DataType.VARCHAR) -prop_type_RUN_FOLDER_NAME.setLabel('Run Folder Name') -prop_type_RUN_FOLDER_NAME.setManagedInternally(False) - - -prop_type_SAMPLE_KIND = tr.getOrCreateNewPropertyType('SAMPLE_KIND', DataType.CONTROLLEDVOCABULARY) -prop_type_SAMPLE_KIND.setLabel('Sample Kind') -prop_type_SAMPLE_KIND.setManagedInternally(False) - -prop_type_SAMPLE_KIND.setVocabulary(vocabulary_SAMPLE_TYPE) - -prop_type_SAMTOOLS_FLAGSTAT = tr.getOrCreateNewPropertyType('SAMTOOLS_FLAGSTAT', DataType.MULTILINE_VARCHAR) -prop_type_SAMTOOLS_FLAGSTAT.setLabel('Samtools Flagstat Output') -prop_type_SAMTOOLS_FLAGSTAT.setManagedInternally(False) - - -prop_type_SBS_KIT = tr.getOrCreateNewPropertyType('SBS_KIT', DataType.VARCHAR) -prop_type_SBS_KIT.setLabel('SBS Kit') -prop_type_SBS_KIT.setManagedInternally(False) - - -prop_type_SBS_SEQUENCING_KIT_VERSION = tr.getOrCreateNewPropertyType('SBS_SEQUENCING_KIT_VERSION', DataType.CONTROLLEDVOCABULARY) -prop_type_SBS_SEQUENCING_KIT_VERSION.setLabel('SBS Sequencing Kit Version') -prop_type_SBS_SEQUENCING_KIT_VERSION.setManagedInternally(False) - -prop_type_SBS_SEQUENCING_KIT_VERSION.setVocabulary(vocabulary_SBS_SEQUENCING_KIT_VERSION) - -prop_type_SEQUENCER = tr.getOrCreateNewPropertyType('SEQUENCER', DataType.CONTROLLEDVOCABULARY) -prop_type_SEQUENCER.setLabel('Sequencer') -prop_type_SEQUENCER.setManagedInternally(False) - -prop_type_SEQUENCER.setVocabulary(vocabulary_SEQUENCER) - -prop_type_SEQUENCER_FINISHED = tr.getOrCreateNewPropertyType('SEQUENCER_FINISHED', DataType.TIMESTAMP) -prop_type_SEQUENCER_FINISHED.setLabel('Sequencer finished') -prop_type_SEQUENCER_FINISHED.setManagedInternally(False) - - -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.getOrCreateNewPropertyType('STARTING_AMOUNT_OF_SAMPLE_IN_NG', DataType.REAL) -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setLabel('Starting amount of sample (ng)') -prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setManagedInternally(False) - - -prop_type_STD = tr.getOrCreateNewPropertyType('STD', DataType.REAL) -prop_type_STD.setLabel('Standard deviation') -prop_type_STD.setManagedInternally(False) - - -prop_type_SURFACECOUNT = tr.getOrCreateNewPropertyType('SURFACECOUNT', DataType.INTEGER) -prop_type_SURFACECOUNT.setLabel('Surface Count') -prop_type_SURFACECOUNT.setManagedInternally(False) - - -prop_type_SWATHCOUNT = tr.getOrCreateNewPropertyType('SWATHCOUNT', DataType.INTEGER) -prop_type_SWATHCOUNT.setLabel('Swath Count') -prop_type_SWATHCOUNT.setManagedInternally(False) - - -prop_type_TILECOUNT = tr.getOrCreateNewPropertyType('TILECOUNT', DataType.INTEGER) -prop_type_TILECOUNT.setLabel('Tile Count') -prop_type_TILECOUNT.setManagedInternally(False) - - -prop_type_TOTAL_READS = tr.getOrCreateNewPropertyType('TOTAL_READS', DataType.INTEGER) -prop_type_TOTAL_READS.setLabel('Total reads') -prop_type_TOTAL_READS.setManagedInternally(False) - - -prop_type_UL_DNA = tr.getOrCreateNewPropertyType('UL_DNA', DataType.REAL) -prop_type_UL_DNA.setLabel('Calculated ul DNA for 2nM stock') -prop_type_UL_DNA.setManagedInternally(False) - - -prop_type_UL_EB = tr.getOrCreateNewPropertyType('UL_EB', DataType.REAL) -prop_type_UL_EB.setLabel('Calculated ul EB for 2nM stock ') -prop_type_UL_EB.setManagedInternally(False) - - -prop_type_UL_STOCK = tr.getOrCreateNewPropertyType('UL_STOCK', DataType.INTEGER) -prop_type_UL_STOCK.setLabel('ul of 2nM stock') -prop_type_UL_STOCK.setManagedInternally(False) - - -prop_type_UNIQUE_BARCODES = tr.getOrCreateNewPropertyType('UNIQUE_BARCODES', DataType.VARCHAR) -prop_type_UNIQUE_BARCODES.setLabel('Unique Barcodes in Pool?') -prop_type_UNIQUE_BARCODES.setManagedInternally(False) - - -prop_type_VERSION = tr.getOrCreateNewPropertyType('VERSION', DataType.VARCHAR) -prop_type_VERSION.setLabel('Version') -prop_type_VERSION.setManagedInternally(False) - - -prop_type_YIELD_MBASES = tr.getOrCreateNewPropertyType('YIELD_MBASES', DataType.INTEGER) -prop_type_YIELD_MBASES.setLabel('Yield(Mbases)') -prop_type_YIELD_MBASES.setManagedInternally(False) - - -prop_type_ZOOMLEVELS = tr.getOrCreateNewPropertyType('ZOOMLEVELS', DataType.INTEGER) -prop_type_ZOOMLEVELS.setLabel('zoom Levels') -prop_type_ZOOMLEVELS.setManagedInternally(False) - - -print "Imported 92 Property Types" -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ALIGNMENT_SOFTWARE) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setSection(None) -assignment_DATA_SET_ALIGNMENT_ALIGNMENT_SOFTWARE.setPositionInForms(3) - -assignment_DATA_SET_ALIGNMENT_VERSION = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_VERSION) -assignment_DATA_SET_ALIGNMENT_VERSION.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_VERSION.setSection(None) -assignment_DATA_SET_ALIGNMENT_VERSION.setPositionInForms(4) - -assignment_DATA_SET_ALIGNMENT_NOTES = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_NOTES) -assignment_DATA_SET_ALIGNMENT_NOTES.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_NOTES.setSection(None) -assignment_DATA_SET_ALIGNMENT_NOTES.setPositionInForms(5) - -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_SAMTOOLS_FLAGSTAT) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setSection(None) -assignment_DATA_SET_ALIGNMENT_SAMTOOLS_FLAGSTAT.setPositionInForms(6) - -assignment_DATA_SET_ALIGNMENT_MAPPED_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_MAPPED_READS) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_MAPPED_READS.setPositionInForms(7) - -assignment_DATA_SET_ALIGNMENT_TOTAL_READS = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_TOTAL_READS) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setSection(None) -assignment_DATA_SET_ALIGNMENT_TOTAL_READS.setPositionInForms(8) - -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND = tr.assignPropertyType(data_set_type_ALIGNMENT, prop_type_ISSUED_COMMAND) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setMandatory(False) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setSection(None) -assignment_DATA_SET_ALIGNMENT_ISSUED_COMMAND.setPositionInForms(9) - -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX = tr.assignPropertyType(data_set_type_BASECALL_STATS, prop_type_MISMATCH_IN_INDEX) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setMandatory(False) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setSection(None) -assignment_DATA_SET_BASECALL_STATS_MISMATCH_IN_INDEX.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_NOTES = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_NOTES) -assignment_DATA_SET_BIGWIGGLE_NOTES.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_NOTES.setSection(None) -assignment_DATA_SET_BIGWIGGLE_NOTES.setPositionInForms(3) - -assignment_DATA_SET_BIGWIGGLE_VERSION = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_VERSION) -assignment_DATA_SET_BIGWIGGLE_VERSION.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_VERSION.setSection(None) -assignment_DATA_SET_BIGWIGGLE_VERSION.setPositionInForms(4) - -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISCOMPRESSED) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISCOMPRESSED.setPositionInForms(5) - -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ISSWAPPED) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ISSWAPPED.setPositionInForms(6) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYDATASIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYDATASIZE.setPositionInForms(7) - -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_PRIMARYINDEXSIZE) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setSection(None) -assignment_DATA_SET_BIGWIGGLE_PRIMARYINDEXSIZE.setPositionInForms(8) - -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_ZOOMLEVELS) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setSection(None) -assignment_DATA_SET_BIGWIGGLE_ZOOMLEVELS.setPositionInForms(9) - -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_CHROMCOUNT) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setSection(None) -assignment_DATA_SET_BIGWIGGLE_CHROMCOUNT.setPositionInForms(10) - -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_BASESCOVERED) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setSection(None) -assignment_DATA_SET_BIGWIGGLE_BASESCOVERED.setPositionInForms(11) - -assignment_DATA_SET_BIGWIGGLE_MEAN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MEAN) -assignment_DATA_SET_BIGWIGGLE_MEAN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MEAN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MEAN.setPositionInForms(12) - -assignment_DATA_SET_BIGWIGGLE_MIN = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MIN) -assignment_DATA_SET_BIGWIGGLE_MIN.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MIN.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MIN.setPositionInForms(13) - -assignment_DATA_SET_BIGWIGGLE_MAX = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_MAX) -assignment_DATA_SET_BIGWIGGLE_MAX.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_MAX.setSection(None) -assignment_DATA_SET_BIGWIGGLE_MAX.setPositionInForms(14) - -assignment_DATA_SET_BIGWIGGLE_STD = tr.assignPropertyType(data_set_type_BIGWIGGLE, prop_type_STD) -assignment_DATA_SET_BIGWIGGLE_STD.setMandatory(False) -assignment_DATA_SET_BIGWIGGLE_STD.setSection(None) -assignment_DATA_SET_BIGWIGGLE_STD.setPositionInForms(15) - -assignment_DATA_SET_FASTQ_GZ_NOTES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_NOTES) -assignment_DATA_SET_FASTQ_GZ_NOTES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_NOTES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_NOTES.setPositionInForms(3) - -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_YIELD_MBASES) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setSection(None) -assignment_DATA_SET_FASTQ_GZ_YIELD_MBASES.setPositionInForms(4) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PASSED_FILTERING) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PASSED_FILTERING.setPositionInForms(5) - -assignment_DATA_SET_FASTQ_GZ_INDEX1 = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_INDEX1) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setSection(None) -assignment_DATA_SET_FASTQ_GZ_INDEX1.setPositionInForms(6) - -assignment_DATA_SET_FASTQ_GZ_INDEX2 = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_INDEX2) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setSection(None) -assignment_DATA_SET_FASTQ_GZ_INDEX2.setPositionInForms(7) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_RAW_CLUSTERS_PER_LANE) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_RAW_CLUSTERS_PER_LANE.setPositionInForms(8) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_PERFECT_INDEX_READS) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_PERFECT_INDEX_READS.setPositionInForms(9) - -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX = tr.assignPropertyType(data_set_type_FASTQ_GZ, prop_type_PERCENTAGE_ONE_MISMATCH_READS_INDEX) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setMandatory(False) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setSection(None) -assignment_DATA_SET_FASTQ_GZ_PERCENTAGE_ONE_MISMATCH_READS_INDEX.setPositionInForms(10) - -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN = tr.assignPropertyType(exp_type_HT_SEQUENCING, prop_type_EXPERIMENT_DESIGN) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setMandatory(False) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setSection(None) -assignment_EXPERIMENT_HT_SEQUENCING_EXPERIMENT_DESIGN.setPositionInForms(3) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_RUN_FOLDER_NAME) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUN_FOLDER_NAME.setPositionInForms(1) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER.setPositionInForms(5) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_END_TYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_END_TYPE.setPositionInForms(7) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOW_CELL_SEQUENCED_ON) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOW_CELL_SEQUENCED_ON.setPositionInForms(8) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SEQUENCER_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SEQUENCER_FINISHED.setPositionInForms(9) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_RUNNINGTIME) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setPositionInForms(10) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setScriptName('Diff_time') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setDynamic(True) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setManaged(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_RUNNINGTIME.setShownEdit(False) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ILLUMINA_PIPELINE_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ILLUMINA_PIPELINE_VERSION.setPositionInForms(11) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CYCLES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CYCLES.setPositionInForms(14) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD.setPositionInForms(17) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2 = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_INDEXREAD2) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_INDEXREAD2.setPositionInForms(18) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CONTROL_LANE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CONTROL_LANE.setPositionInForms(19) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_FLOWCELLTYPE) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_FLOWCELLTYPE.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_LANECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_LANECOUNT.setPositionInForms(21) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SURFACECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SURFACECOUNT.setPositionInForms(22) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SWATHCOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SWATHCOUNT.setPositionInForms(23) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_TILECOUNT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_TILECOUNT.setPositionInForms(24) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_KIT.setPositionInForms(25) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_PAIRED_END_KIT) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_PAIRED_END_KIT.setPositionInForms(26) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CLUSTER_STATION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_STATION.setPositionInForms(27) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CREATED_ON_CS) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CREATED_ON_CS.setPositionInForms(28) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CS_PROTOCOL_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CS_PROTOCOL_VERSION.setPositionInForms(29) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_CLUSTER_GENERATION_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setSection('Clustering') -assignment_SAMPLE_ILLUMINA_FLOW_CELL_CLUSTER_GENERATION_KIT_VERSION.setPositionInForms(30) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_SBS_SEQUENCING_KIT_VERSION) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_SBS_SEQUENCING_KIT_VERSION.setPositionInForms(32) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_ANALYSIS_FINISHED) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_ANALYSIS_FINISHED.setPositionInForms(34) - -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_CELL, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_CELL_NOTES.setPositionInForms(35) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_CONCENTRATION_FLOWLANE) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_CONCENTRATION_FLOWLANE.setPositionInForms(20) - -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES = tr.assignPropertyType(samp_type_ILLUMINA_FLOW_LANE, prop_type_NOTES) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setMandatory(False) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setSection(None) -assignment_SAMPLE_ILLUMINA_FLOW_LANE_NOTES.setPositionInForms(23) - -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION = tr.assignPropertyType(data_set_type_ILLUMINA_HISEQ_OUTPUT, prop_type_CASAVA_VERSION) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setMandatory(False) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setSection(None) -assignment_DATA_SET_ILLUMINA_HISEQ_OUTPUT_CASAVA_VERSION.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_LIBRARY, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_LIBRARY_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_LIBRARY_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT) -assignment_SAMPLE_LIBRARY_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT.setSection(None) -assignment_SAMPLE_LIBRARY_KIT.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_PREPARED_BY.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG = tr.assignPropertyType(samp_type_LIBRARY, prop_type_STARTING_AMOUNT_OF_SAMPLE_IN_NG) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setMandatory(False) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setSection(None) -assignment_SAMPLE_LIBRARY_STARTING_AMOUNT_OF_SAMPLE_IN_NG.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_INDEX1 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX1) -assignment_SAMPLE_LIBRARY_INDEX1.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX1.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX1.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_INDEX2 = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INDEX2) -assignment_SAMPLE_LIBRARY_INDEX2.setMandatory(False) -assignment_SAMPLE_LIBRARY_INDEX2.setSection(None) -assignment_SAMPLE_LIBRARY_INDEX2.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_LOT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LOT) -assignment_SAMPLE_LIBRARY_LOT.setMandatory(False) -assignment_SAMPLE_LIBRARY_LOT.setSection(None) -assignment_SAMPLE_LIBRARY_LOT.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setSection('QC Data') -assignment_SAMPLE_LIBRARY_AGILENT_KIT.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_FRAGMENT_SIZE_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setSection('QC Data') -assignment_SAMPLE_LIBRARY_FRAGMENT_SIZE_PREPARED_ILLUMINA.setPositionInForms(11) - -assignment_SAMPLE_LIBRARY_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_NANO_DROP.setSection('QC Data') -assignment_SAMPLE_LIBRARY_NANO_DROP.setPositionInForms(12) - -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA = tr.assignPropertyType(samp_type_LIBRARY, prop_type_CONCENTRATION_PREPARED_ILLUMINA) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setMandatory(False) -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setSection('QC Data') -assignment_SAMPLE_LIBRARY_CONCENTRATION_PREPARED_ILLUMINA.setPositionInForms(13) - -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DNA_CONCENTRATION_OF_LIBRARY) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setMandatory(False) -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setSection('QC Data') -assignment_SAMPLE_LIBRARY_DNA_CONCENTRATION_OF_LIBRARY.setPositionInForms(14) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_SUCCESSFUL) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setSection('QC Data') -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_SUCCESSFUL.setPositionInForms(15) - -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_LIBRARY_PROCESSING_FAILED) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setMandatory(False) -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setSection('QC Data') -assignment_SAMPLE_LIBRARY_LIBRARY_PROCESSING_FAILED.setPositionInForms(16) - -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_QC_AT_DBSSE) -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setMandatory(False) -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setSection('QC Data') -assignment_SAMPLE_LIBRARY_QC_AT_DBSSE.setPositionInForms(17) - -assignment_SAMPLE_LIBRARY_KIT_PREPARED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_KIT_PREPARED) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setSection(None) -assignment_SAMPLE_LIBRARY_KIT_PREPARED.setPositionInForms(18) - -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED = tr.assignPropertyType(samp_type_LIBRARY, prop_type_DATA_TRANSFERRED) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setSection(None) -assignment_SAMPLE_LIBRARY_DATA_TRANSFERRED.setPositionInForms(19) - -assignment_SAMPLE_LIBRARY_INVOICE = tr.assignPropertyType(samp_type_LIBRARY, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_INVOICE.setPositionInForms(20) - -assignment_SAMPLE_LIBRARY_NOTES = tr.assignPropertyType(samp_type_LIBRARY, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_NOTES.setPositionInForms(33) - -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_PREPARED_BY) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_PREPARED_BY.setPositionInForms(2) - -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_DNA_CONCENTRATION_POOL) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_POOL.setPositionInForms(3) - -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_QC_REQUIRED) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_QC_REQUIRED.setPositionInForms(4) - -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_AGILENT_KIT) -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_AGILENT_KIT.setPositionInForms(5) - -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_FRAGMENT_SIZE_BASE_PAIRS) -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_FRAGMENT_SIZE_BASE_PAIRS.setPositionInForms(6) - -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_NANO_DROP) -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_NANO_DROP.setPositionInForms(7) - -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_CONCENTRATION) -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_CONCENTRATION.setPositionInForms(8) - -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_DNA_CONCENTRATION_QGF) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setSection('QC Data') -assignment_SAMPLE_LIBRARY_POOL_DNA_CONCENTRATION_QGF.setPositionInForms(9) - -assignment_SAMPLE_LIBRARY_POOL_INVOICE = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_INVOICE) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_INVOICE.setPositionInForms(10) - -assignment_SAMPLE_LIBRARY_POOL_NOTES = tr.assignPropertyType(samp_type_LIBRARY_POOL, prop_type_NOTES) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setMandatory(False) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setSection(None) -assignment_SAMPLE_LIBRARY_POOL_NOTES.setPositionInForms(11) - -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_MACS_VERSION) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_MACS_VERSION.setPositionInForms(3) - -assignment_DATA_SET_MACS_OUTPUT_NOTES = tr.assignPropertyType(data_set_type_MACS_OUTPUT, prop_type_NOTES) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setMandatory(False) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setSection(None) -assignment_DATA_SET_MACS_OUTPUT_NOTES.setPositionInForms(4) - -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_BIOLOGICAL_SAMPLE_ARRIVED) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_BIOLOGICAL_SAMPLE_ARRIVED.setPositionInForms(1) - -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_CONTACT_PERSON_EMAIL) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_EMAIL.setPositionInForms(2) - -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_CONTACT_PERSON_NAME) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_CONTACT_PERSON_NAME.setPositionInForms(3) - -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_PRINCIPAL_INVESTIGATOR_EMAIL) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_EMAIL.setPositionInForms(4) - -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_PRINCIPAL_INVESTIGATOR_NAME) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_PRINCIPAL_INVESTIGATOR_NAME.setPositionInForms(5) - -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_NCBI_ORGANISM_TAXONOMY) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_NCBI_ORGANISM_TAXONOMY.setPositionInForms(7) - -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_SAMPLE_KIND) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setMandatory(True) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_SAMPLE_KIND.setPositionInForms(21) - -assignment_SAMPLE_MASTER_SAMPLE_NOTES = tr.assignPropertyType(samp_type_MASTER_SAMPLE, prop_type_NOTES) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setMandatory(False) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setSection(None) -assignment_SAMPLE_MASTER_SAMPLE_NOTES.setPositionInForms(22) - -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_EXTERNAL_SAMPLE_NAME) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_EXTERNAL_SAMPLE_NAME.setPositionInForms(1) - -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_CONCENTRATION_ORIGINAL_ILLUMINA) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_CONCENTRATION_ORIGINAL_ILLUMINA.setPositionInForms(4) - -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_PREPARED_BY) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_PREPARED_BY.setPositionInForms(8) - -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_KIT_PREPARED) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_KIT_PREPARED.setPositionInForms(9) - -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_LIBRARY_PROCESSING_POSSIBLE_YES_NO) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_LIBRARY_PROCESSING_POSSIBLE_YES_NO.setPositionInForms(10) - -assignment_SAMPLE_RAW_SAMPLE_NOTES = tr.assignPropertyType(samp_type_RAW_SAMPLE, prop_type_NOTES) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setMandatory(False) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setSection(None) -assignment_SAMPLE_RAW_SAMPLE_NOTES.setPositionInForms(13) - -print "Imported 104 Property Assignments" -print "Imported 0 External DMSs" -print ("Import of Master Data finished.") \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/data-sources/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/data-sources/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index b306ec30deb..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,221 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX - -structure: -110715_SN792_0054_BC035RACXX/ - runParameters.xml - RunInfo.xml - -The run folder created by the HiSeq sequencer is used to create a new -ILLUMINA_FLOW_CELL in openBIS. The properties are then set by parsing the -two XML files in this folder. - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -FLOW_CELL='ILLUMINA_FLOW_CELL' -FLOW_LANE='ILLUMINA_FLOW_LANE' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES':'Read1', 'PE':'Pe'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, flowCellName, newFlowCell, exp, projectSamplesEnabled): - ''' - Registers a new Flow lane - ''' - newFlowLane = createNewSample(transaction, flowCellName + ':' + str(a_lane), FLOW_LANE, projectSamplesEnabled) - newFlowLane.setContainer(newFlowCell) - newFlowLane.setExperiment(exp) - -# ----------------------------------------------------------------------------- - -def createNewSample(transaction, sampleCode, sampleType, projectSamplesEnabled): - ''' - Create a sample with specified code and type. Depending on the flag projectSamplesEnabled - the identifier is constructed differently. - ''' - identifierPrefix = FLOWCELL_PROJECT_ID if projectSamplesEnabled else ('/' + FLOWCELL_SPACE) - return transaction.createNewSample(identifierPrefix + '/' + sampleCode, sampleType) - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def searchFlowCell (transaction, flowCellName): - ''' - Search for the sample and check if there is already sample with this name - ''' - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a flow cell with the following name: '+ flowCellName) - return foundSamples - -# ----------------------------------------------------------------------------- - -def process(transaction): - projectSamplesEnabled = (transaction.serverInformation.get('project-samples-enabled') == 'true') - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - runFolderName = incoming.getName() - flowCellName = runFolderName.split('_')[-1][1:] - - searchFlowCell (transaction, flowCellName) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - project = transaction.getProject(FLOWCELL_PROJECT_ID) - if project == None: - space = transaction.getSpace(FLOWCELL_SPACE) - if space == None: - space = transaction.createNewSpace(FLOWCELL_SPACE, None) - project = transaction.createNewProject(FLOWCELL_PROJECT_ID) - #expID = FLOWCELL_PROJECT_ID + '/' + datetime.now().strftime("%Y.%m") - expID = FLOWCELL_PROJECT_ID + '/' + "Test-Experiment" - exp = transaction.getExperiment(expID) - if exp == None: - exp = transaction.createNewExperiment(expID, EXPERIMENT_TYPE_CODE) - newFlowCell = createNewSample(transaction, flowCellName, FLOW_CELL, projectSamplesEnabled) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (extractFlowCellName(run['Id']) != flowCellName): - raise NameError('Flowcell names do not match between directory name '+ flowCellName + - ' and ' + RUNINFO + 'property file: ' + extractFlowCellName(run['Id'])) - - - # The HiSeq is providing more infos in the runParameters.xml, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - newFlowCell.setPropertyValue("RUN_FOLDER_NAME", runFolderName) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - read1 = runParameters.getAllchildren('Read1') - newFlowCell.setPropertyValue("CYCLES", read1[0].text) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp()) - try: - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - except: - maxLanes = len(runInfo.getAllchildren('Tiles')[0]) - - [registerFlowLane(transaction, lane, flowCellName, newFlowCell, exp, projectSamplesEnabled) for lane in range(1,int(maxLanes)+1)] diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index ef56111b768..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 2b1687925ad..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,76 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Reads out the time stamp of the file 'RTAComplete.txt' and sets the -property for a finished sequencer called 'SEQUENCER_FINISHED' to the -time stamp of this file. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX - -structure: -110715_SN792_0054_BC035RACXX/ - RTAComplete.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerHiSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - runFolderName = transaction.getIncoming().getName() - flowCellName = extractFlowCellName(runFolderName) - - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 4c47f6a072d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a 'BASECALL_STATS' data set in openBIS. -The name of the directory is used to search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: C035RACXX_1 -expected incoming Name for MiSeq runs: A0T19_1 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - flowCell, flowLane = runFolderName.split('_') - return flowCell, flowLane - -# ----------------------------------------------------------------------------- - -def process(transaction): - - runFolderName = transaction.getIncoming().getName() - incomingPath = transaction.getIncoming().getPath() - flowCellName, flowLaneName = extractFlowCellName(runFolderName) - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - search_service = transaction.getSearchService() - transaction.moveFile(incomingPath, dataSet) - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellName + ':' + flowLaneName)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 697c1d5d3cb..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py deleted file mode 100644 index 4b2251d72bc..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-flowcell/register-flowcell-hiseq.py +++ /dev/null @@ -1,138 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import glob -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -REGEX_RUNINFO_SAMPLE = '/Data/Status*' -REGEX_RUNINFO_REPORTS = '/Data/reports' -MARKER_STRING = '.MARKER_is_finished_' -RUNSTATISTICS_DROPBOX = 'register-runstatistics' - -# ----------------------------------------------------------------------------- - -def extractRunData (runFolderName, transaction): - ''' - Splits the incoming folder name and extracts infos out of it - HiSeq example: - ['130227', 'SN792', '0211', 'BC1RPGACXX'] - MiSeq example: - ['130227', 'M00721', '0036', '000000000-A3BAV'] - ''' - runDataDict = {} - date, sequencerID, runningNumber, flowCellId = runFolderName.split('_') - runDataDict['date'] = date - runDataDict['sequencerID'] = sequencerID - runDataDict['runningNumber'] = runningNumber - - if not sequencerID.startswith('M'): - runDataDict['compartment'] = flowCellId[0] - runDataDict['flowCellId'] = flowCellId[1:] - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - else: - runDataDict['flowCellId'] = flowCellId - dataSet = transaction.createNewDataSet("ILLUMINA_MISEQ_OUTPUT") - return runDataDict, dataSet - -# ----------------------------------------------------------------------------- - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -# ----------------------------------------------------------------------------- - -def moveFiles(incomingPath, runDataDict, runStatisticsFolder): - #move RunInfo into a different drop box - runInfoSample=glob.glob(incomingPath + REGEX_RUNINFO_SAMPLE) - runInfoReport=glob.glob(incomingPath + REGEX_RUNINFO_REPORTS) - runInfoList = runInfoSample + runInfoReport - - newPath = runStatisticsFolder + '/' + runDataDict['flowCellId'] + '/Data/' - - os.makedirs(newPath) - for runInfo in runInfoList: - try: - if os.path.isdir(runInfo): - shutil.copytree(runInfo, newPath + os.path.basename(runInfo)) - else: - shutil.copy2(runInfo, newPath) - except (IOError, os.error), why: - print (runInfo, newPath, str(why)) - -# ----------------------------------------------------------------------------- - -def getThreadProperties(transaction): - - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ----------------------------------------------------------------------------- - -def process(transaction): - - threadPropertyDict = getThreadProperties(transaction) - - incomingPath = transaction.getIncoming().getPath() - runFolderName = transaction.getIncoming().getName() - runDataDict, dataSet = extractRunData(runFolderName, transaction) - - incomingRootDir = threadPropertyDict[u'incoming-root-dir'] - runStatisticsFolder = incomingRootDir + '/' + RUNSTATISTICS_DROPBOX - - moveFiles(incomingPath, runDataDict, runStatisticsFolder) - - touch_markerfile( runStatisticsFolder + '/' + MARKER_STRING + runDataDict['flowCellId']) - - dataSet.setMeasuredData(False) - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, runDataDict['flowCellId'])); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 848fd08ad3b..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,223 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Processes each flow lane of a Sequencing run and attaches the fastq files to -the correct corresponding library samples - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 - - -@author: -Manuel Kohler - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -INDEX1='INDEX1' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -# ------------------------------------------------------------------------------- - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -# ------------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchSample(search_service, sampleCode): - - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0] - return sample - -# ------------------------------------------------------------------------------- -def process(transaction): - - # useful for debugging: - print ("\n") - print(datetime.now()) - - search_service = transaction.getSearchService() - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample = flowCellId + ':' + flowLane - # expected Project_120112_63537AAXX_1 - if (len(split) == 4): - runningDate = split[1] - flowCellId = split[2] - flowLane = split[-1] - incoming_sample = flowCellId + ':' + flowLane - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # ------------------------------------------------------------------------------- - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # put the files into the dataSet - for file in fastqFileList: - sampleCode = '-'.join(file.split('/')[-1].split('_')[:4]) - print "Searching for " + sampleCode - sample = searchSample(search_service, sampleCode) - - # finally add the files to the data set - transaction.moveFile(file , dataSet, folders[f]) - - #sa = transaction.getSampleForUpdate(sample.getSampleIdentifier()) - #sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f224..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index c3fc98d03a4..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,57 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of -the directory is used to search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index d9e6b77c95f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,185 +0,0 @@ -''' -@copyright: -2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Splits up this complex data set into two different data sets and -moves the corresponding file into those drop boxes - -@note: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_' -LANE_DROPBOX='register-lane-hiseq' -BASECALL_DROPBOX='register-basecall-stats' -MARKER_STRING='.MARKER_is_finished_' - -# ----------------------------------------------------------------------------- - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -# ----------------------------------------------------------------------------- - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - -# ----------------------------------------------------------------------------- - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - - -# ----------------------------------------------------------------------------- - -def getThreadProperties(transaction): - - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ----------------------------------------------------------------------------- - -def extractFlowCellName (runFolderName): - return runFolderName.split('_')[-1][1:] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - threadPropertyDict = getThreadProperties(transaction) - incomingRootDir = threadPropertyDict[u'incoming-root-dir'] - laneFolder = incomingRootDir + '/' + LANE_DROPBOX + '/' - basecallStatsFolder = incomingRootDir + '/' + BASECALL_DROPBOX + '/' - - incomingPath = transaction.getIncoming().getPath() - runFolderName = transaction.getIncoming().getName() - fcName = extractFlowCellName(runFolderName) - - # ----------------------------------------------------------------------------- - # move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '*' + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '*' + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, fcName) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, laneFolder + lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(laneFolder + MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # ----------------------------------------------------------------------------- - # move Basecall Stats into a different drop box - - # Build up a list of file which are part of the data set - for lane in xrange(1, len(laneList)+1): - path = incomingPath + '/'+ UNALIGNED_FOLDER + str(lane) + '/' - fileList=glob.glob(path + REGEX_FILES) - [fileList.append(i) for i in glob.glob(path + REGEX_MAKEFILE)] - - dest = fcName + '_' + str(lane) - shutil.copytree(path + BASECALL_STATS_FOLDER + fcName , basecallStatsFolder + dest + '/' + BASECALL_STATS_FOLDER + fcName) - [shutil.move(file, basecallStatsFolder + dest) for file in fileList] - touch_markerfile(basecallStatsFolder + MARKER_STRING + dest) diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/maintenance-tasks/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/maintenance-tasks/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/reporting-plugins/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/reporting-plugins/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/services/.gitignore b/deep_sequencing_unit/source/core-plugins/illumina-ngs/2/dss/services/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/illumina-ngs/package-to-dist b/deep_sequencing_unit/source/core-plugins/illumina-ngs/package-to-dist deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html deleted file mode 100644 index 06d40af202c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/index.html +++ /dev/null @@ -1,248 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Flowcell Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - </head> - <body> - <script> - - var formatThousands = d3.format(","); - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var prop; - var flowcellProperties = []; - var myArray = []; - var sumArray = []; - var sumsArray = [] - - loadData() - - /* ------- General functions -------------------------------------------*/ - - // used for sorting by lane of the final array of objects - function compare(a,b) { - if (a.lane < b.lane) - return -1; - if (a.lane > b.lane) - return 1; - return 0; - } - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); - } - - - /* -------------------------------------------------------------------*/ - -function loadData () { - var dataSetProperties; - var prop; - - dsu.retrieveSample(webAppContext.getEntityIdentifier(), function(response) { - - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - - var sampleCodes = []; - for (i = 1; i <= numberOfLanes; i++) { - sampleCodes.push(webAppContext.entityIdentifier + ":" + i); - } - - var deferrer = new openbisActionDeferrer(function(){ - sumArray.sort(compare); - plotLaneTable (sumArray, true); - downloadButton ("tableStats"); - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - }, sampleCodes); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveDataSetsForSample(sampleCode, function(response){ - getProperties(response); - //console.log("got response " + sampleCode); - var sums = calculateSum(myArray, sampleCode, true); - //console.log(sums[0]) - sumArray.push(sums[0]); - myArray = []; - deferrer.dependencyCompleted(sampleCode); - }); - }); - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - myArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - }; - }; - }); -}; - -function plotLaneTable (sumArray, withNOINDEX) { - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - header = {"Lane":1, "# of Samples":1, "Average Passed Filtering (PF)":1, "Sum Raw Reads":1, "Sum PF Reads":1, "Sum Raw Bases":1, - "Sum PF Bases":1, "Average Raw Clusters in % per Index":1, "Average PF Phred Score":1, "Average > 30 Phred Score":1 } - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sumArray).enter().append("tr") - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1500) - .attr("height", 50) - ; -} - -function calculateSum(statisticsArray, sampleCode, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane / Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'lane' : sampleCode.split("/")[2].split(":")[1], - 'numberOfSamples' : statisticsArray.length, - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - return sums; -} - - - function downloadButton (buttonName) { - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; - } - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css deleted file mode 100644 index 985d8ac6db0..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties deleted file mode 100644 index 19629033996..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/cellStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Flow Cell Statistics diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js deleted file mode 100644 index 3bcbccefe6c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.layout.js +++ /dev/null @@ -1 +0,0 @@ -d3.layout = {}; diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js deleted file mode 100644 index e61102b596e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/d3.v3.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function t(t){return t.target}function n(t){return t.source}function e(t,n){try{for(var e in n)Object.defineProperty(t.prototype,e,{value:n[e],enumerable:!1})}catch(r){t.prototype=n}}function r(t){for(var n=-1,e=t.length,r=[];e>++n;)r.push(t[n]);return r}function u(t){return Array.prototype.slice.call(t)}function i(){}function a(t){return t}function o(){return!0}function c(t){return"function"==typeof t?t:function(){return t}}function l(t,n,e){return function(){var r=e.apply(n,arguments);return arguments.length?t:r}}function s(t){return null!=t&&!isNaN(t)}function f(t){return t.length}function h(t){return t.trim().replace(/\s+/g," ")}function d(t){for(var n=1;t*n%1;)n*=10;return n}function g(t){return 1===t.length?function(n,e){t(null==n?e:null)}:t}function p(t){return t.responseText}function m(t){return JSON.parse(t.responseText)}function v(t){var n=document.createRange();return n.selectNode(document.body),n.createContextualFragment(t.responseText)}function y(t){return t.responseXML}function M(){}function b(t){function n(){for(var n,r=e,u=-1,i=r.length;i>++u;)(n=r[u].on)&&n.apply(this,arguments);return t}var e=[],r=new i;return n.on=function(n,u){var i,a=r.get(n);return 2>arguments.length?a&&a.on:(a&&(a.on=null,e=e.slice(0,i=e.indexOf(a)).concat(e.slice(i+1)),r.remove(n)),u&&e.push(r.set(n,{on:u})),t)},n}function x(t,n){return n-(t?1+Math.floor(Math.log(t+Math.pow(10,1+Math.floor(Math.log(t)/Math.LN10)-n))/Math.LN10):1)}function _(t){return t+""}function w(t,n){var e=Math.pow(10,3*Math.abs(8-n));return{scale:n>8?function(t){return t/e}:function(t){return t*e},symbol:t}}function S(t){return function(n){return 0>=n?0:n>=1?1:t(n)}}function k(t){return function(n){return 1-t(1-n)}}function E(t){return function(n){return.5*(.5>n?t(2*n):2-t(2-2*n))}}function A(t){return t*t}function N(t){return t*t*t}function T(t){if(0>=t)return 0;if(t>=1)return 1;var n=t*t,e=n*t;return 4*(.5>t?e:3*(t-n)+e-.75)}function q(t){return function(n){return Math.pow(n,t)}}function C(t){return 1-Math.cos(t*Ri/2)}function z(t){return Math.pow(2,10*(t-1))}function D(t){return 1-Math.sqrt(1-t*t)}function L(t,n){var e;return 2>arguments.length&&(n=.45),arguments.length?e=n/(2*Ri)*Math.asin(1/t):(t=1,e=n/4),function(r){return 1+t*Math.pow(2,10*-r)*Math.sin(2*(r-e)*Ri/n)}}function F(t){return t||(t=1.70158),function(n){return n*n*((t+1)*n-t)}}function H(t){return 1/2.75>t?7.5625*t*t:2/2.75>t?7.5625*(t-=1.5/2.75)*t+.75:2.5/2.75>t?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function R(){d3.event.stopPropagation(),d3.event.preventDefault()}function P(){for(var t,n=d3.event;t=n.sourceEvent;)n=t;return n}function j(t){for(var n=new M,e=0,r=arguments.length;r>++e;)n[arguments[e]]=b(n);return n.of=function(e,r){return function(u){try{var i=u.sourceEvent=d3.event;u.target=t,d3.event=u,n[u.type].apply(e,r)}finally{d3.event=i}}},n}function O(t){var n=[t.a,t.b],e=[t.c,t.d],r=U(n),u=Y(n,e),i=U(I(e,n,-u))||0;n[0]*e[1]<e[0]*n[1]&&(n[0]*=-1,n[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(n[1],n[0]):Math.atan2(-e[0],e[1]))*Oi,this.translate=[t.e,t.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Oi:0}function Y(t,n){return t[0]*n[0]+t[1]*n[1]}function U(t){var n=Math.sqrt(Y(t,t));return n&&(t[0]/=n,t[1]/=n),n}function I(t,n,e){return t[0]+=e*n[0],t[1]+=e*n[1],t}function V(t){return"transform"==t?d3.interpolateTransform:d3.interpolate}function X(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return(e-t)*n}}function Z(t,n){return n=n-(t=+t)?1/(n-t):0,function(e){return Math.max(0,Math.min(1,(e-t)*n))}}function B(){}function $(t,n,e){return new J(t,n,e)}function J(t,n,e){this.r=t,this.g=n,this.b=e}function G(t){return 16>t?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function K(t,n,e){var r,u,i,a=0,o=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(t))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return n(nn(u[0]),nn(u[1]),nn(u[2]))}return(i=aa.get(t))?n(i.r,i.g,i.b):(null!=t&&"#"===t.charAt(0)&&(4===t.length?(a=t.charAt(1),a+=a,o=t.charAt(2),o+=o,c=t.charAt(3),c+=c):7===t.length&&(a=t.substring(1,3),o=t.substring(3,5),c=t.substring(5,7)),a=parseInt(a,16),o=parseInt(o,16),c=parseInt(c,16)),n(a,o,c))}function W(t,n,e){var r,u,i=Math.min(t/=255,n/=255,e/=255),a=Math.max(t,n,e),o=a-i,c=(a+i)/2;return o?(u=.5>c?o/(a+i):o/(2-a-i),r=t==a?(n-e)/o+(e>n?6:0):n==a?(e-t)/o+2:(t-n)/o+4,r*=60):u=r=0,en(r,u,c)}function Q(t,n,e){t=tn(t),n=tn(n),e=tn(e);var r=gn((.4124564*t+.3575761*n+.1804375*e)/sa),u=gn((.2126729*t+.7151522*n+.072175*e)/fa),i=gn((.0193339*t+.119192*n+.9503041*e)/ha);return ln(116*u-16,500*(r-u),200*(u-i))}function tn(t){return.04045>=(t/=255)?t/12.92:Math.pow((t+.055)/1.055,2.4)}function nn(t){var n=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*n):n}function en(t,n,e){return new rn(t,n,e)}function rn(t,n,e){this.h=t,this.s=n,this.l=e}function un(t,n,e){function r(t){return t>360?t-=360:0>t&&(t+=360),60>t?i+(a-i)*t/60:180>t?a:240>t?i+(a-i)*(240-t)/60:i}function u(t){return Math.round(255*r(t))}var i,a;return t%=360,0>t&&(t+=360),n=0>n?0:n>1?1:n,e=0>e?0:e>1?1:e,a=.5>=e?e*(1+n):e+n-e*n,i=2*e-a,$(u(t+120),u(t),u(t-120))}function an(t,n,e){return new on(t,n,e)}function on(t,n,e){this.h=t,this.c=n,this.l=e}function cn(t,n,e){return ln(e,Math.cos(t*=ji)*n,Math.sin(t)*n)}function ln(t,n,e){return new sn(t,n,e)}function sn(t,n,e){this.l=t,this.a=n,this.b=e}function fn(t,n,e){var r=(t+16)/116,u=r+n/500,i=r-e/200;return u=dn(u)*sa,r=dn(r)*fa,i=dn(i)*ha,$(pn(3.2404542*u-1.5371385*r-.4985314*i),pn(-.969266*u+1.8760108*r+.041556*i),pn(.0556434*u-.2040259*r+1.0572252*i))}function hn(t,n,e){return an(180*(Math.atan2(e,n)/Ri),Math.sqrt(n*n+e*e),t)}function dn(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function gn(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function pn(t){return Math.round(255*(.00304>=t?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function mn(t){return Ii(t,Ma),t}function vn(t){return function(){return ga(t,this)}}function yn(t){return function(){return pa(t,this)}}function Mn(t,n){function e(){this.removeAttribute(t)}function r(){this.removeAttributeNS(t.space,t.local)}function u(){this.setAttribute(t,n)}function i(){this.setAttributeNS(t.space,t.local,n)}function a(){var e=n.apply(this,arguments);null==e?this.removeAttribute(t):this.setAttribute(t,e)}function o(){var e=n.apply(this,arguments);null==e?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,e)}return t=d3.ns.qualify(t),null==n?t.local?r:e:"function"==typeof n?t.local?o:a:t.local?i:u}function bn(t){return RegExp("(?:^|\\s+)"+d3.requote(t)+"(?:\\s+|$)","g")}function xn(t,n){function e(){for(var e=-1;u>++e;)t[e](this,n)}function r(){for(var e=-1,r=n.apply(this,arguments);u>++e;)t[e](this,r)}t=t.trim().split(/\s+/).map(_n);var u=t.length;return"function"==typeof n?r:e}function _n(t){var n=bn(t);return function(e,r){if(u=e.classList)return r?u.add(t):u.remove(t);var u=e.className,i=null!=u.baseVal,a=i?u.baseVal:u;r?(n.lastIndex=0,n.test(a)||(a=h(a+" "+t),i?u.baseVal=a:e.className=a)):a&&(a=h(a.replace(n," ")),i?u.baseVal=a:e.className=a)}}function wn(t,n,e){function r(){this.style.removeProperty(t)}function u(){this.style.setProperty(t,n,e)}function i(){var r=n.apply(this,arguments);null==r?this.style.removeProperty(t):this.style.setProperty(t,r,e)}return null==n?r:"function"==typeof n?i:u}function Sn(t,n){function e(){delete this[t]}function r(){this[t]=n}function u(){var e=n.apply(this,arguments);null==e?delete this[t]:this[t]=e}return null==n?e:"function"==typeof n?u:r}function kn(t){return{__data__:t}}function En(t){return function(){return ya(this,t)}}function An(t){return arguments.length||(t=d3.ascending),function(n,e){return t(n&&n.__data__,e&&e.__data__)}}function Nn(t,n,e){function r(){var n=this[i];n&&(this.removeEventListener(t,n,n.$),delete this[i])}function u(){function u(t){var e=d3.event;d3.event=t,o[0]=a.__data__;try{n.apply(a,o)}finally{d3.event=e}}var a=this,o=Yi(arguments);r.call(this),this.addEventListener(t,this[i]=u,u.$=e),u._=n}var i="__on"+t,a=t.indexOf(".");return a>0&&(t=t.substring(0,a)),n?u:r}function Tn(t,n){for(var e=0,r=t.length;r>e;e++)for(var u,i=t[e],a=0,o=i.length;o>a;a++)(u=i[a])&&n(u,a,e);return t}function qn(t){return Ii(t,xa),t}function Cn(t,n){return Ii(t,wa),t.id=n,t}function zn(t,n,e,r){var u=t.__transition__||(t.__transition__={active:0,count:0}),a=u[e];if(!a){var o=r.time;return a=u[e]={tween:new i,event:d3.dispatch("start","end"),time:o,ease:r.ease,delay:r.delay,duration:r.duration},++u.count,d3.timer(function(r){function i(r){return u.active>e?l():(u.active=e,h.start.call(t,s,n),a.tween.forEach(function(e,r){(r=r.call(t,s,n))&&p.push(r)}),c(r)||d3.timer(c,0,o),1)}function c(r){if(u.active!==e)return l();for(var i=(r-d)/g,a=f(i),o=p.length;o>0;)p[--o].call(t,a);return i>=1?(l(),h.end.call(t,s,n),1):void 0}function l(){return--u.count?delete u[e]:delete t.__transition__,1}var s=t.__data__,f=a.ease,h=a.event,d=a.delay,g=a.duration,p=[];return r>=d?i(r):d3.timer(i,d,o),1},0,o),a}}function Dn(t){return null==t&&(t=""),function(){this.textContent=t}}function Ln(t,n,e,r){var u=t.id;return Tn(t,"function"==typeof e?function(t,i,a){t.__transition__[u].tween.set(n,r(e.call(t,t.__data__,i,a)))}:(e=r(e),function(t){t.__transition__[u].tween.set(n,e)}))}function Fn(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,t>=e.delay&&(e.flush=e.callback(t)),e=e.next;var r=Hn()-n;r>24?(isFinite(r)&&(clearTimeout(Aa),Aa=setTimeout(Fn,r)),Ea=0):(Ea=1,Ca(Fn))}function Hn(){for(var t=null,n=qa,e=1/0;n;)n.flush?(delete Ta[n.callback.id],n=t?t.next=n.next:qa=n.next):(e=Math.min(e,n.then+n.delay),n=(t=n).next);return e}function Rn(t,n){var e=t.ownerSVGElement||t;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>za&&(window.scrollX||window.scrollY)){e=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var u=e[0][0].getScreenCTM();za=!(u.f||u.e),e.remove()}return za?(r.x=n.pageX,r.y=n.pageY):(r.x=n.clientX,r.y=n.clientY),r=r.matrixTransform(t.getScreenCTM().inverse()),[r.x,r.y]}var i=t.getBoundingClientRect();return[n.clientX-i.left-t.clientLeft,n.clientY-i.top-t.clientTop]}function Pn(){}function jn(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function On(t){return t.rangeExtent?t.rangeExtent():jn(t.range())}function Yn(t,n){var e,r=0,u=t.length-1,i=t[r],a=t[u];return i>a&&(e=r,r=u,u=e,e=i,i=a,a=e),(n=n(a-i))&&(t[r]=n.floor(i),t[u]=n.ceil(a)),t}function Un(){return Math}function In(t,n,e,r){function u(){var u=Math.min(t.length,n.length)>2?Gn:Jn,c=r?Z:X;return a=u(t,n,c,e),o=u(n,t,c,d3.interpolate),i}function i(t){return a(t)}var a,o;return i.invert=function(t){return o(t)},i.domain=function(n){return arguments.length?(t=n.map(Number),u()):t},i.range=function(t){return arguments.length?(n=t,u()):n},i.rangeRound=function(t){return i.range(t).interpolate(d3.interpolateRound)},i.clamp=function(t){return arguments.length?(r=t,u()):r},i.interpolate=function(t){return arguments.length?(e=t,u()):e},i.ticks=function(n){return Bn(t,n)},i.tickFormat=function(n){return $n(t,n)},i.nice=function(){return Yn(t,Xn),u()},i.copy=function(){return In(t,n,e,r)},u()}function Vn(t,n){return d3.rebind(t,n,"range","rangeRound","interpolate","clamp")}function Xn(t){return t=Math.pow(10,Math.round(Math.log(t)/Math.LN10)-1),t&&{floor:function(n){return Math.floor(n/t)*t},ceil:function(n){return Math.ceil(n/t)*t}}}function Zn(t,n){var e=jn(t),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/n)/Math.LN10)),i=n/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function Bn(t,n){return d3.range.apply(d3,Zn(t,n))}function $n(t,n){return d3.format(",."+Math.max(0,-Math.floor(Math.log(Zn(t,n)[2])/Math.LN10+.01))+"f")}function Jn(t,n,e,r){var u=e(t[0],t[1]),i=r(n[0],n[1]);return function(t){return i(u(t))}}function Gn(t,n,e,r){var u=[],i=[],a=0,o=Math.min(t.length,n.length)-1;for(t[o]<t[0]&&(t=t.slice().reverse(),n=n.slice().reverse());o>=++a;)u.push(e(t[a-1],t[a])),i.push(r(n[a-1],n[a]));return function(n){var e=d3.bisect(t,n,1,o)-1;return i[e](u[e](n))}}function Kn(t,n){function e(e){return t(n(e))}var r=n.pow;return e.invert=function(n){return r(t.invert(n))},e.domain=function(u){return arguments.length?(n=0>u[0]?Qn:Wn,r=n.pow,t.domain(u.map(n)),e):t.domain().map(r)},e.nice=function(){return t.domain(Yn(t.domain(),Un)),e},e.ticks=function(){var e=jn(t.domain()),u=[];if(e.every(isFinite)){var i=Math.floor(e[0]),a=Math.ceil(e[1]),o=r(e[0]),c=r(e[1]);if(n===Qn)for(u.push(r(i));a>i++;)for(var l=9;l>0;l--)u.push(r(i)*l);else{for(;a>i;i++)for(var l=1;10>l;l++)u.push(r(i)*l);u.push(r(i))}for(i=0;o>u[i];i++);for(a=u.length;u[a-1]>c;a--);u=u.slice(i,a)}return u},e.tickFormat=function(t,u){if(2>arguments.length&&(u=Da),!arguments.length)return u;var i,a=Math.max(.1,t/e.ticks().length),o=n===Qn?(i=-1e-12,Math.floor):(i=1e-12,Math.ceil);return function(t){return a>=t/r(o(n(t)+i))?u(t):""}},e.copy=function(){return Kn(t.copy(),n)},Vn(e,t)}function Wn(t){return Math.log(0>t?0:t)/Math.LN10}function Qn(t){return-Math.log(t>0?0:-t)/Math.LN10}function te(t,n){function e(n){return t(r(n))}var r=ne(n),u=ne(1/n);return e.invert=function(n){return u(t.invert(n))},e.domain=function(n){return arguments.length?(t.domain(n.map(r)),e):t.domain().map(u)},e.ticks=function(t){return Bn(e.domain(),t)},e.tickFormat=function(t){return $n(e.domain(),t)},e.nice=function(){return e.domain(Yn(e.domain(),Xn))},e.exponent=function(t){if(!arguments.length)return n;var i=e.domain();return r=ne(n=t),u=ne(1/n),e.domain(i)},e.copy=function(){return te(t.copy(),n)},Vn(e,t)}function ne(t){return function(n){return 0>n?-Math.pow(-n,t):Math.pow(n,t)}}function ee(t,n){function e(n){return a[((u.get(n)||u.set(n,t.push(n)))-1)%a.length]}function r(n,e){return d3.range(t.length).map(function(t){return n+e*t})}var u,a,o;return e.domain=function(r){if(!arguments.length)return t;t=[],u=new i;for(var a,o=-1,c=r.length;c>++o;)u.has(a=r[o])||u.set(a,t.push(a));return e[n.t].apply(e,n.a)},e.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},e):a},e.rangePoints=function(u,i){2>arguments.length&&(i=0);var c=u[0],l=u[1],s=(l-c)/(Math.max(1,t.length-1)+i);return a=r(2>t.length?(c+l)/2:c+s*i/2,s),o=0,n={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=(f-s)/(t.length-i+2*c);return a=r(s+h*c,h),l&&a.reverse(),o=h*(1-i),n={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){2>arguments.length&&(i=0),3>arguments.length&&(c=i);var l=u[1]<u[0],s=u[l-0],f=u[1-l],h=Math.floor((f-s)/(t.length-i+2*c)),d=f-s-(t.length-i)*h;return a=r(s+Math.round(d/2),h),l&&a.reverse(),o=Math.round(h*(1-i)),n={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return o},e.rangeExtent=function(){return jn(n.a[0])},e.copy=function(){return ee(t,n)},e.domain(t)}function re(t,n){function e(){var e=0,i=n.length;for(u=[];i>++e;)u[e-1]=d3.quantile(t,e/i);return r}function r(t){return isNaN(t=+t)?0/0:n[d3.bisect(u,t)]}var u;return r.domain=function(n){return arguments.length?(t=n.filter(function(t){return!isNaN(t)}).sort(d3.ascending),e()):t},r.range=function(t){return arguments.length?(n=t,e()):n},r.quantiles=function(){return u},r.copy=function(){return re(t,n)},e()}function ue(t,n,e){function r(n){return e[Math.max(0,Math.min(a,Math.floor(i*(n-t))))]}function u(){return i=e.length/(n-t),a=e.length-1,r}var i,a;return r.domain=function(e){return arguments.length?(t=+e[0],n=+e[e.length-1],u()):[t,n]},r.range=function(t){return arguments.length?(e=t,u()):e},r.copy=function(){return ue(t,n,e)},u()}function ie(t,n){function e(e){return n[d3.bisect(t,e)]}return e.domain=function(n){return arguments.length?(t=n,e):t},e.range=function(t){return arguments.length?(n=t,e):n},e.copy=function(){return ie(t,n)},e}function ae(t){function n(t){return+t}return n.invert=n,n.domain=n.range=function(e){return arguments.length?(t=e.map(n),n):t},n.ticks=function(n){return Bn(t,n)},n.tickFormat=function(n){return $n(t,n)},n.copy=function(){return ae(t)},n}function oe(t){return t.innerRadius}function ce(t){return t.outerRadius}function le(t){return t.startAngle}function se(t){return t.endAngle}function fe(t){function n(n){function a(){s.push("M",i(t(f),l))}for(var o,s=[],f=[],h=-1,d=n.length,g=c(e),p=c(r);d>++h;)u.call(this,o=n[h],h)?f.push([+g.call(this,o,h),+p.call(this,o,h)]):f.length&&(a(),f=[]);return f.length&&a(),s.length?s.join(""):null}var e=he,r=de,u=o,i=ge,a=i.key,l=.7;return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n.defined=function(t){return arguments.length?(u=t,n):u},n.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Oa.get(t)||ge).key,n):a},n.tension=function(t){return arguments.length?(l=t,n):l},n}function he(t){return t[0]}function de(t){return t[1]}function ge(t){return t.join("L")}function pe(t){return ge(t)+"Z"}function me(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("V",(r=t[n])[1],"H",r[0]);return u.join("")}function ve(t){for(var n=0,e=t.length,r=t[0],u=[r[0],",",r[1]];e>++n;)u.push("H",(r=t[n])[0],"V",r[1]);return u.join("")}function ye(t,n){return 4>t.length?ge(t):t[1]+xe(t.slice(1,t.length-1),_e(t,n))}function Me(t,n){return 3>t.length?ge(t):t[0]+xe((t.push(t[0]),t),_e([t[t.length-2]].concat(t,[t[1]]),n))}function be(t,n){return 3>t.length?ge(t):t[0]+xe(t,_e(t,n))}function xe(t,n){if(1>n.length||t.length!=n.length&&t.length!=n.length+2)return ge(t);var e=t.length!=n.length,r="",u=t[0],i=t[1],a=n[0],o=a,c=1;if(e&&(r+="Q"+(i[0]-2*a[0]/3)+","+(i[1]-2*a[1]/3)+","+i[0]+","+i[1],u=t[1],c=2),n.length>1){o=n[1],i=t[c],c++,r+="C"+(u[0]+a[0])+","+(u[1]+a[1])+","+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1];for(var l=2;n.length>l;l++,c++)i=t[c],o=n[l],r+="S"+(i[0]-o[0])+","+(i[1]-o[1])+","+i[0]+","+i[1]}if(e){var s=t[c];r+="Q"+(i[0]+2*o[0]/3)+","+(i[1]+2*o[1]/3)+","+s[0]+","+s[1]}return r}function _e(t,n){for(var e,r=[],u=(1-n)/2,i=t[0],a=t[1],o=1,c=t.length;c>++o;)e=i,i=a,a=t[o],r.push([u*(a[0]-e[0]),u*(a[1]-e[1])]);return r}function we(t){if(3>t.length)return ge(t);var n=1,e=t.length,r=t[0],u=r[0],i=r[1],a=[u,u,u,(r=t[1])[0]],o=[i,i,i,r[1]],c=[u,",",i];for(Ne(c,a,o);e>++n;)r=t[n],a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);for(n=-1;2>++n;)a.shift(),a.push(r[0]),o.shift(),o.push(r[1]),Ne(c,a,o);return c.join("")}function Se(t){if(4>t.length)return ge(t);for(var n,e=[],r=-1,u=t.length,i=[0],a=[0];3>++r;)n=t[r],i.push(n[0]),a.push(n[1]);for(e.push(Ae(Ia,i)+","+Ae(Ia,a)),--r;u>++r;)n=t[r],i.shift(),i.push(n[0]),a.shift(),a.push(n[1]),Ne(e,i,a);return e.join("")}function ke(t){for(var n,e,r=-1,u=t.length,i=u+4,a=[],o=[];4>++r;)e=t[r%u],a.push(e[0]),o.push(e[1]);for(n=[Ae(Ia,a),",",Ae(Ia,o)],--r;i>++r;)e=t[r%u],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Ne(n,a,o);return n.join("")}function Ee(t,n){var e=t.length-1;if(e)for(var r,u,i=t[0][0],a=t[0][1],o=t[e][0]-i,c=t[e][1]-a,l=-1;e>=++l;)r=t[l],u=l/e,r[0]=n*r[0]+(1-n)*(i+u*o),r[1]=n*r[1]+(1-n)*(a+u*c);return we(t)}function Ae(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function Ne(t,n,e){t.push("C",Ae(Ya,n),",",Ae(Ya,e),",",Ae(Ua,n),",",Ae(Ua,e),",",Ae(Ia,n),",",Ae(Ia,e))}function Te(t,n){return(n[1]-t[1])/(n[0]-t[0])}function qe(t){for(var n=0,e=t.length-1,r=[],u=t[0],i=t[1],a=r[0]=Te(u,i);e>++n;)r[n]=(a+(a=Te(u=i,i=t[n+1])))/2;return r[n]=a,r}function Ce(t){for(var n,e,r,u,i=[],a=qe(t),o=-1,c=t.length-1;c>++o;)n=Te(t[o],t[o+1]),1e-6>Math.abs(n)?a[o]=a[o+1]=0:(e=a[o]/n,r=a[o+1]/n,u=e*e+r*r,u>9&&(u=3*n/Math.sqrt(u),a[o]=u*e,a[o+1]=u*r));for(o=-1;c>=++o;)u=(t[Math.min(c,o+1)][0]-t[Math.max(0,o-1)][0])/(6*(1+a[o]*a[o])),i.push([u||0,a[o]*u||0]);return i}function ze(t){return 3>t.length?ge(t):t[0]+xe(t,Ce(t))}function De(t){for(var n,e,r,u=-1,i=t.length;i>++u;)n=t[u],e=n[0],r=n[1]+Pa,n[0]=e*Math.cos(r),n[1]=e*Math.sin(r);return t}function Le(t){function n(n){function o(){m.push("M",l(t(y),d),h,f(t(v.reverse()),d),"Z")}for(var s,g,p,m=[],v=[],y=[],M=-1,b=n.length,x=c(e),_=c(u),w=e===r?function(){return g}:c(r),S=u===i?function(){return p}:c(i);b>++M;)a.call(this,s=n[M],M)?(v.push([g=+x.call(this,s,M),p=+_.call(this,s,M)]),y.push([+w.call(this,s,M),+S.call(this,s,M)])):v.length&&(o(),v=[],y=[]);return v.length&&o(),m.length?m.join(""):null}var e=he,r=he,u=0,i=de,a=o,l=ge,s=l.key,f=l,h="L",d=.7;return n.x=function(t){return arguments.length?(e=r=t,n):r},n.x0=function(t){return arguments.length?(e=t,n):e},n.x1=function(t){return arguments.length?(r=t,n):r},n.y=function(t){return arguments.length?(u=i=t,n):i},n.y0=function(t){return arguments.length?(u=t,n):u},n.y1=function(t){return arguments.length?(i=t,n):i},n.defined=function(t){return arguments.length?(a=t,n):a},n.interpolate=function(t){return arguments.length?(s="function"==typeof t?l=t:(l=Oa.get(t)||ge).key,f=l.reverse||l,h=l.closed?"M":"L",n):s},n.tension=function(t){return arguments.length?(d=t,n):d},n}function Fe(t){return t.radius}function He(t){return[t.x,t.y]}function Re(t){return function(){var n=t.apply(this,arguments),e=n[0],r=n[1]+Pa;return[e*Math.cos(r),e*Math.sin(r)]}}function Pe(){return 64}function je(){return"circle"}function Oe(t){var n=Math.sqrt(t/Ri);return"M0,"+n+"A"+n+","+n+" 0 1,1 0,"+-n+"A"+n+","+n+" 0 1,1 0,"+n+"Z"}function Ye(t,n){t.attr("transform",function(t){return"translate("+n(t)+",0)"})}function Ue(t,n){t.attr("transform",function(t){return"translate(0,"+n(t)+")"})}function Ie(t,n,e){if(r=[],e&&n.length>1){for(var r,u,i,a=jn(t.domain()),o=-1,c=n.length,l=(n[1]-n[0])/++e;c>++o;)for(u=e;--u>0;)(i=+n[o]-u*l)>=a[0]&&r.push(i);for(--o,u=0;e>++u&&(i=+n[o]+u*l)<a[1];)r.push(i)}return r}function Ve(){Ja||(Ja=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var t,n=d3.event;try{Ja.scrollTop=1e3,Ja.dispatchEvent(n),t=1e3-Ja.scrollTop}catch(e){t=n.wheelDelta||5*-n.detail}return t}function Xe(t){for(var n=t.source,e=t.target,r=Be(n,e),u=[n];n!==r;)n=n.parent,u.push(n);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function Ze(t){for(var n=[],e=t.parent;null!=e;)n.push(t),t=e,e=e.parent;return n.push(t),n}function Be(t,n){if(t===n)return t;for(var e=Ze(t),r=Ze(n),u=e.pop(),i=r.pop(),a=null;u===i;)a=u,u=e.pop(),i=r.pop();return a}function $e(t){t.fixed|=2}function Je(t){t.fixed&=1}function Ge(t){t.fixed|=4,t.px=t.x,t.py=t.y}function Ke(t){t.fixed&=3}function We(t,n,e){var r=0,u=0;if(t.charge=0,!t.leaf)for(var i,a=t.nodes,o=a.length,c=-1;o>++c;)i=a[c],null!=i&&(We(i,n,e),t.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(t.point){t.leaf||(t.point.x+=Math.random()-.5,t.point.y+=Math.random()-.5);var l=n*e[t.point.index];t.charge+=t.pointCharge=l,r+=l*t.point.x,u+=l*t.point.y}t.cx=r/t.charge,t.cy=u/t.charge}function Qe(){return 20}function tr(){return 1}function nr(t){return t.x}function er(t){return t.y}function rr(t,n,e){t.y0=n,t.y=e}function ur(t){return d3.range(t.length)}function ir(t){for(var n=-1,e=t[0].length,r=[];e>++n;)r[n]=0;return r}function ar(t){for(var n,e=1,r=0,u=t[0][1],i=t.length;i>e;++e)(n=t[e][1])>u&&(r=e,u=n);return r}function or(t){return t.reduce(cr,0)}function cr(t,n){return t+n[1]}function lr(t,n){return sr(t,Math.ceil(Math.log(n.length)/Math.LN2+1))}function sr(t,n){for(var e=-1,r=+t[0],u=(t[1]-r)/n,i=[];n>=++e;)i[e]=u*e+r;return i}function fr(t){return[d3.min(t),d3.max(t)]}function hr(t,n){return d3.rebind(t,n,"sort","children","value"),t.nodes=t,t.links=mr,t}function dr(t){return t.children}function gr(t){return t.value}function pr(t,n){return n.value-t.value}function mr(t){return d3.merge(t.map(function(t){return(t.children||[]).map(function(n){return{source:t,target:n}})}))}function vr(t,n){return t.value-n.value}function yr(t,n){var e=t._pack_next;t._pack_next=n,n._pack_prev=t,n._pack_next=e,e._pack_prev=n}function Mr(t,n){t._pack_next=n,n._pack_prev=t}function br(t,n){var e=n.x-t.x,r=n.y-t.y,u=t.r+n.r;return u*u-e*e-r*r>.001}function xr(t){function n(t){s=Math.min(t.x-t.r,s),f=Math.max(t.x+t.r,f),h=Math.min(t.y-t.r,h),d=Math.max(t.y+t.r,d)}if((e=t.children)&&(l=e.length)){var e,r,u,i,a,o,c,l,s=1/0,f=-1/0,h=1/0,d=-1/0;if(e.forEach(_r),r=e[0],r.x=-r.r,r.y=0,n(r),l>1&&(u=e[1],u.x=u.r,u.y=0,n(u),l>2))for(i=e[2],kr(r,u,i),n(i),yr(r,i),r._pack_prev=i,yr(i,u),u=r._pack_next,a=3;l>a;a++){kr(r,u,i=e[a]);var g=0,p=1,m=1;for(o=u._pack_next;o!==u;o=o._pack_next,p++)if(br(o,i)){g=1;break}if(1==g)for(c=r._pack_prev;c!==o._pack_prev&&!br(c,i);c=c._pack_prev,m++);g?(m>p||p==m&&u.r<r.r?Mr(r,u=o):Mr(r=c,u),a--):(yr(r,i),u=i,n(i))}var v=(s+f)/2,y=(h+d)/2,M=0;for(a=0;l>a;a++)i=e[a],i.x-=v,i.y-=y,M=Math.max(M,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=M,e.forEach(wr)}}function _r(t){t._pack_next=t._pack_prev=t}function wr(t){delete t._pack_next,delete t._pack_prev}function Sr(t,n,e,r){var u=t.children;if(t.x=n+=r*t.x,t.y=e+=r*t.y,t.r*=r,u)for(var i=-1,a=u.length;a>++i;)Sr(u[i],n,e,r)}function kr(t,n,e){var r=t.r+e.r,u=n.x-t.x,i=n.y-t.y;if(r&&(u||i)){var a=n.r+e.r,o=u*u+i*i;a*=a,r*=r;var c=.5+(r-a)/(2*o),l=Math.sqrt(Math.max(0,2*a*(r+o)-(r-=o)*r-a*a))/(2*o);e.x=t.x+c*u+l*i,e.y=t.y+c*i-l*u}else e.x=t.x+r,e.y=t.y}function Er(t){return 1+d3.max(t,function(t){return t.y})}function Ar(t){return t.reduce(function(t,n){return t+n.x},0)/t.length}function Nr(t){var n=t.children;return n&&n.length?Nr(n[0]):t}function Tr(t){var n,e=t.children;return e&&(n=e.length)?Tr(e[n-1]):t}function qr(t,n){return t.parent==n.parent?1:2}function Cr(t){var n=t.children;return n&&n.length?n[0]:t._tree.thread}function zr(t){var n,e=t.children;return e&&(n=e.length)?e[n-1]:t._tree.thread}function Dr(t,n){var e=t.children;if(e&&(u=e.length))for(var r,u,i=-1;u>++i;)n(r=Dr(e[i],n),t)>0&&(t=r);return t}function Lr(t,n){return t.x-n.x}function Fr(t,n){return n.x-t.x}function Hr(t,n){return t.depth-n.depth}function Rr(t,n){function e(t,r){var u=t.children;if(u&&(a=u.length))for(var i,a,o=null,c=-1;a>++c;)i=u[c],e(i,o),o=i;n(t,r)}e(t,null)}function Pr(t){for(var n,e=0,r=0,u=t.children,i=u.length;--i>=0;)n=u[i]._tree,n.prelim+=e,n.mod+=e,e+=n.shift+(r+=n.change)}function jr(t,n,e){t=t._tree,n=n._tree;var r=e/(n.number-t.number);t.change+=r,n.change-=r,n.shift+=e,n.prelim+=e,n.mod+=e}function Or(t,n,e){return t._tree.ancestor.parent==n.parent?t._tree.ancestor:e}function Yr(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function Ur(t,n){var e=t.x+n[3],r=t.y+n[0],u=t.dx-n[1]-n[3],i=t.dy-n[0]-n[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function Ir(t,n){function e(t,e){return d3.xhr(t,n,e).response(r)}function r(t){return e.parse(t.responseText)}function u(n){return n.map(i).join(t)}function i(t){return a.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}var a=RegExp('["'+t+"\n]"),o=t.charCodeAt(0);return e.parse=function(t){var n;return e.parseRows(t,function(t){return n?n(t):(n=Function("d","return {"+t.map(function(t,n){return JSON.stringify(t)+": d["+n+"]"}).join(",")+"}"),void 0)})},e.parseRows=function(t,n){function e(){if(s>=l)return a;if(u)return u=!1,i;var n=s;if(34===t.charCodeAt(n)){for(var e=n;l>e++;)if(34===t.charCodeAt(e)){if(34!==t.charCodeAt(e+1))break;++e}s=e+2;var r=t.charCodeAt(e+1);return 13===r?(u=!0,10===t.charCodeAt(e+2)&&++s):10===r&&(u=!0),t.substring(n+1,e).replace(/""/g,'"')}for(;l>s;){var r=t.charCodeAt(s++),c=1;if(10===r)u=!0;else if(13===r)u=!0,10===t.charCodeAt(s)&&(++s,++c);else if(r!==o)continue;return t.substring(n,s-c)}return t.substring(n)}for(var r,u,i={},a={},c=[],l=t.length,s=0,f=0;(r=e())!==a;){for(var h=[];r!==i&&r!==a;)h.push(r),r=e();(!n||(h=n(h,f++)))&&c.push(h)}return c},e.format=function(t){return t.map(u).join("\n")},e}function Vr(t,n){no.hasOwnProperty(t.type)&&no[t.type](t,n)}function Xr(t,n,e){var r,u=-1,i=t.length-e;for(n.lineStart();i>++u;)r=t[u],n.point(r[0],r[1]);n.lineEnd()}function Zr(t,n){var e=-1,r=t.length;for(n.polygonStart();r>++e;)Xr(t[e],n,1);n.polygonEnd()}function Br(t){return[Math.atan2(t[1],t[0]),Math.asin(Math.max(-1,Math.min(1,t[2])))]}function $r(t,n){return Pi>Math.abs(t[0]-n[0])&&Pi>Math.abs(t[1]-n[1])}function Jr(t){var n=t[0],e=t[1],r=Math.cos(e);return[r*Math.cos(n),r*Math.sin(n),Math.sin(e)]}function Gr(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function Kr(t,n){return[t[1]*n[2]-t[2]*n[1],t[2]*n[0]-t[0]*n[2],t[0]*n[1]-t[1]*n[0]]}function Wr(t,n){t[0]+=n[0],t[1]+=n[1],t[2]+=n[2]}function Qr(t,n){return[t[0]*n,t[1]*n,t[2]*n]}function tu(t){var n=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=n,t[1]/=n,t[2]/=n}function nu(t){function n(n){function r(e,r){e=t(e,r),n.point(e[0],e[1])}function i(){s=0/0,p.point=a,n.lineStart()}function a(r,i){var a=Jr([r,i]),o=t(r,i);e(s,f,l,h,d,g,s=o[0],f=o[1],l=r,h=a[0],d=a[1],g=a[2],u,n),n.point(s,f)}function o(){p.point=r,n.lineEnd()}function c(){var t,r,c,m,v,y,M;i(),p.point=function(n,e){a(t=n,r=e),c=s,m=f,v=h,y=d,M=g,p.point=a},p.lineEnd=function(){e(s,f,l,h,d,g,c,m,t,v,y,M,u,n),p.lineEnd=o,o()}}var l,s,f,h,d,g,p={point:r,lineStart:i,lineEnd:o,polygonStart:function(){n.polygonStart(),p.lineStart=c},polygonEnd:function(){n.polygonEnd(),p.lineStart=i}};return p}function e(n,u,i,a,o,c,l,s,f,h,d,g,p,m){var v=l-n,y=s-u,M=v*v+y*y;if(M>4*r&&p--){var b=a+h,x=o+d,_=c+g,w=Math.sqrt(b*b+x*x+_*_),S=Math.asin(_/=w),k=Pi>Math.abs(Math.abs(_)-1)?(i+f)/2:Math.atan2(x,b),E=t(k,S),A=E[0],N=E[1],T=A-n,q=N-u,C=y*T-v*q;(C*C/M>r||Math.abs((v*T+y*q)/M-.5)>.3)&&(e(n,u,i,a,o,c,A,N,k,b/=w,x/=w,_,p,m),m.point(A,N),e(A,N,k,b,x,_,l,s,f,h,d,g,p,m))}}var r=.5,u=16;return n.precision=function(t){return arguments.length?(u=(r=t*t)>0&&16,n):Math.sqrt(r)},n}function eu(t,n){function e(t,n){var e=Math.sqrt(i-2*u*Math.sin(n))/u;return[e*Math.sin(t*=u),a-e*Math.cos(t)]}var r=Math.sin(t),u=(r+Math.sin(n))/2,i=1+r*(2*u-r),a=Math.sqrt(i)/u;return e.invert=function(t,n){var e=a-n;return[Math.atan2(t,e)/u,Math.asin((i-(t*t+e*e)*u*u)/(2*u))]},e}function ru(t){function n(t,n){r>t&&(r=t),t>i&&(i=t),u>n&&(u=n),n>a&&(a=n)}function e(){o.point=o.lineEnd=Pn}var r,u,i,a,o={point:n,lineStart:Pn,lineEnd:Pn,polygonStart:function(){o.lineEnd=e},polygonEnd:function(){o.point=n}};return function(n){return a=i=-(r=u=1/0),d3.geo.stream(n,t(o)),[[r,u],[i,a]]}}function uu(t,n){if(!uo){++io,t*=ji;var e=Math.cos(n*=ji);ao+=(e*Math.cos(t)-ao)/io,oo+=(e*Math.sin(t)-oo)/io,co+=(Math.sin(n)-co)/io}}function iu(){var t,n;uo=1,au(),uo=2;var e=lo.point;lo.point=function(r,u){e(t=r,n=u)},lo.lineEnd=function(){lo.point(t,n),ou(),lo.lineEnd=ou}}function au(){function t(t,u){t*=ji;var i=Math.cos(u*=ji),a=i*Math.cos(t),o=i*Math.sin(t),c=Math.sin(u),l=Math.atan2(Math.sqrt((l=e*c-r*o)*l+(l=r*a-n*c)*l+(l=n*o-e*a)*l),n*a+e*o+r*c);io+=l,ao+=l*(n+(n=a)),oo+=l*(e+(e=o)),co+=l*(r+(r=c))}var n,e,r;uo>1||(1>uo&&(uo=1,io=ao=oo=co=0),lo.point=function(u,i){u*=ji;var a=Math.cos(i*=ji);n=a*Math.cos(u),e=a*Math.sin(u),r=Math.sin(i),lo.point=t})}function ou(){lo.point=uu}function cu(t,n){var e=Math.cos(t),r=Math.sin(t);return function(u,i,a,o){null!=u?(u=lu(e,u),i=lu(e,i),(a>0?i>u:u>i)&&(u+=2*a*Ri)):(u=t+2*a*Ri,i=t);for(var c,l=a*n,s=u;a>0?s>i:i>s;s-=l)o.point((c=Br([e,-r*Math.cos(s),-r*Math.sin(s)]))[0],c[1])}}function lu(t,n){var e=Jr(n);e[0]-=t,tu(e);var r=Math.acos(Math.max(-1,Math.min(1,-e[1])));return((0>-e[2]?-r:r)+2*Math.PI-Pi)%(2*Math.PI)}function su(t,n,e){return function(r){function u(n,e){t(n,e)&&r.point(n,e)}function i(t,n){m.point(t,n)}function a(){v.point=i,m.lineStart()}function o(){v.point=u,m.lineEnd()}function c(t,n){M.point(t,n),p.push([t,n])}function l(){M.lineStart(),p=[]}function s(){c(p[0][0],p[0][1]),M.lineEnd();var t,n=M.clean(),e=y.buffer(),u=e.length;if(!u)return g=!0,d+=mu(p,-1),p=null,void 0;if(p=null,1&n){t=e[0],h+=mu(t,1);var i,u=t.length-1,a=-1;for(r.lineStart();u>++a;)r.point((i=t[a])[0],i[1]);return r.lineEnd(),void 0}u>1&&2&n&&e.push(e.pop().concat(e.shift())),f.push(e.filter(gu))}var f,h,d,g,p,m=n(r),v={point:u,lineStart:a,lineEnd:o,polygonStart:function(){v.point=c,v.lineStart=l,v.lineEnd=s,g=!1,d=h=0,f=[],r.polygonStart() -},polygonEnd:function(){v.point=u,v.lineStart=a,v.lineEnd=o,f=d3.merge(f),f.length?fu(f,e,r):(-Pi>h||g&&-Pi>d)&&(r.lineStart(),e(null,null,1,r),r.lineEnd()),r.polygonEnd(),f=null},sphere:function(){r.polygonStart(),r.lineStart(),e(null,null,1,r),r.lineEnd(),r.polygonEnd()}},y=pu(),M=n(y);return v}}function fu(t,n,e){var r=[],u=[];if(t.forEach(function(t){var n=t.length;if(!(1>=n)){var e=t[0],i=t[n-1],a={point:e,points:t,other:null,visited:!1,entry:!0,subject:!0},o={point:e,points:[e],other:a,visited:!1,entry:!1,subject:!1};a.other=o,r.push(a),u.push(o),a={point:i,points:[i],other:null,visited:!1,entry:!1,subject:!0},o={point:i,points:[i],other:a,visited:!1,entry:!0,subject:!1},a.other=o,r.push(a),u.push(o)}}),u.sort(du),hu(r),hu(u),r.length)for(var i,a,o,c=r[0];;){for(i=c;i.visited;)if((i=i.next)===c)return;a=i.points,e.lineStart();do{if(i.visited=i.other.visited=!0,i.entry){if(i.subject)for(var l=0;a.length>l;l++)e.point((o=a[l])[0],o[1]);else n(i.point,i.next.point,1,e);i=i.next}else{if(i.subject){a=i.prev.points;for(var l=a.length;--l>=0;)e.point((o=a[l])[0],o[1])}else n(i.point,i.prev.point,-1,e);i=i.prev}i=i.other,a=i.points}while(!i.visited);e.lineEnd()}}function hu(t){if(n=t.length){for(var n,e,r=0,u=t[0];n>++r;)u.next=e=t[r],e.prev=u,u=e;u.next=e=t[0],e.prev=u}}function du(t,n){return(0>(t=t.point)[0]?t[1]-Ri/2-Pi:Ri/2-t[1])-(0>(n=n.point)[0]?n[1]-Ri/2-Pi:Ri/2-n[1])}function gu(t){return t.length>1}function pu(){var t,n=[];return{lineStart:function(){n.push(t=[])},point:function(n,e){t.push([n,e])},lineEnd:Pn,buffer:function(){var e=n;return n=[],t=null,e}}}function mu(t,n){if(!(e=t.length))return 0;for(var e,r,u,i=0,a=0,o=t[0],c=o[0],l=o[1],s=Math.cos(l),f=Math.atan2(n*Math.sin(c)*s,Math.sin(l)),h=1-n*Math.cos(c)*s,d=f;e>++i;)o=t[i],s=Math.cos(l=o[1]),r=Math.atan2(n*Math.sin(c=o[0])*s,Math.sin(l)),u=1-n*Math.cos(c)*s,Pi>Math.abs(h-2)&&Pi>Math.abs(u-2)||(Pi>Math.abs(u)||Pi>Math.abs(h)||(Pi>Math.abs(Math.abs(r-f)-Ri)?u+h>2&&(a+=4*(r-f)):a+=Pi>Math.abs(h-2)?4*(r-d):((3*Ri+r-f)%(2*Ri)-Ri)*(h+u)),d=f,f=r,h=u);return a}function vu(t){var n,e=0/0,r=0/0,u=0/0;return{lineStart:function(){t.lineStart(),n=1},point:function(i,a){var o=i>0?Ri:-Ri,c=Math.abs(i-e);Pi>Math.abs(c-Ri)?(t.point(e,r=(r+a)/2>0?Ri/2:-Ri/2),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),t.point(i,r),n=0):u!==o&&c>=Ri&&(Pi>Math.abs(e-u)&&(e-=u*Pi),Pi>Math.abs(i-o)&&(i-=o*Pi),r=yu(e,r,i,a),t.point(u,r),t.lineEnd(),t.lineStart(),t.point(o,r),n=0),t.point(e=i,r=a),u=o},lineEnd:function(){t.lineEnd(),e=r=0/0},clean:function(){return 2-n}}}function yu(t,n,e,r){var u,i,a=Math.sin(t-e);return Math.abs(a)>Pi?Math.atan((Math.sin(n)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(n))*Math.sin(t))/(u*i*a)):(n+r)/2}function Mu(t,n,e,r){var u;if(null==t)u=e*Ri/2,r.point(-Ri,u),r.point(0,u),r.point(Ri,u),r.point(Ri,0),r.point(Ri,-u),r.point(0,-u),r.point(-Ri,-u),r.point(-Ri,0),r.point(-Ri,u);else if(Math.abs(t[0]-n[0])>Pi){var i=(t[0]<n[0]?1:-1)*Ri;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(n[0],n[1])}function bu(t){function n(t,n){return Math.cos(t)*Math.cos(n)>i}function e(t){var e,u,i,a;return{lineStart:function(){i=u=!1,a=1},point:function(o,c){var l,s=[o,c],f=n(o,c);!e&&(i=u=f)&&t.lineStart(),f!==u&&(l=r(e,s),($r(e,l)||$r(s,l))&&(s[0]+=Pi,s[1]+=Pi,f=n(s[0],s[1]))),f!==u&&(a=0,(u=f)?(t.lineStart(),l=r(s,e),t.point(l[0],l[1])):(l=r(e,s),t.point(l[0],l[1]),t.lineEnd()),e=l),!f||e&&$r(e,s)||t.point(s[0],s[1]),e=s},lineEnd:function(){u&&t.lineEnd(),e=null},clean:function(){return a|(i&&u)<<1}}}function r(t,n){var e=Jr(t,0),r=Jr(n,0),u=[1,0,0],a=Kr(e,r),o=Gr(a,a),c=a[0],l=o-c*c;if(!l)return t;var s=i*o/l,f=-i*c/l,h=Kr(u,a),d=Qr(u,s),g=Qr(a,f);Wr(d,g);var p=h,m=Gr(d,p),v=Gr(p,p),y=Math.sqrt(m*m-v*(Gr(d,d)-1)),M=Qr(p,(-m-y)/v);return Wr(M,d),Br(M)}var u=t*ji,i=Math.cos(u),a=cu(u,6*ji);return su(n,e,a)}function xu(t,n){function e(e,r){return e=t(e,r),n(e[0],e[1])}return t.invert&&n.invert&&(e.invert=function(e,r){return e=n.invert(e,r),t.invert(e[0],e[1])}),e}function _u(t,n){return[t,n]}function wu(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[t,n]})}}function Su(t,n,e){var r=d3.range(t,n-Pi,e).concat(n);return function(t){return r.map(function(n){return[n,t]})}}function ku(t,n,e,r){function u(t){var n=Math.sin(t*=d)*g,e=Math.sin(d-t)*g,r=e*l+n*f,u=e*s+n*h,i=e*a+n*c;return[Math.atan2(u,r)/ji,Math.atan2(i,Math.sqrt(r*r+u*u))/ji]}var i=Math.cos(n),a=Math.sin(n),o=Math.cos(r),c=Math.sin(r),l=i*Math.cos(t),s=i*Math.sin(t),f=o*Math.cos(e),h=o*Math.sin(e),d=Math.acos(Math.max(-1,Math.min(1,a*c+i*o*Math.cos(e-t)))),g=1/Math.sin(d);return u.distance=d,u}function Eu(t,n){return[t/(2*Ri),Math.max(-.5,Math.min(.5,Math.log(Math.tan(Ri/4+n/2))/(2*Ri)))]}function Au(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}function Nu(t){var n=nu(function(n,e){return t([n*Oi,e*Oi])});return function(t){return t=n(t),{point:function(n,e){t.point(n*ji,e*ji)},sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}}function Tu(){function t(t,n){a.push("M",t,",",n,i)}function n(t,n){a.push("M",t,",",n),o.point=e}function e(t,n){a.push("L",t,",",n)}function r(){o.point=t}function u(){a.push("Z")}var i=Au(4.5),a=[],o={point:t,lineStart:function(){o.point=n},lineEnd:r,polygonStart:function(){o.lineEnd=u},polygonEnd:function(){o.lineEnd=r,o.point=t},pointRadius:function(t){return i=Au(t),o},result:function(){if(a.length){var t=a.join("");return a=[],t}}};return o}function qu(t){function n(n,e){t.moveTo(n,e),t.arc(n,e,a,0,2*Ri)}function e(n,e){t.moveTo(n,e),o.point=r}function r(n,e){t.lineTo(n,e)}function u(){o.point=n}function i(){t.closePath()}var a=4.5,o={point:n,lineStart:function(){o.point=e},lineEnd:u,polygonStart:function(){o.lineEnd=i},polygonEnd:function(){o.lineEnd=u,o.point=n},pointRadius:function(t){return a=t,o},result:Pn};return o}function Cu(){function t(t,n){po+=u*t-r*n,r=t,u=n}var n,e,r,u;mo.point=function(i,a){mo.point=t,n=r=i,e=u=a},mo.lineEnd=function(){t(n,e)}}function zu(t,n){uo||(ao+=t,oo+=n,++co)}function Du(){function t(t,r){var u=t-n,i=r-e,a=Math.sqrt(u*u+i*i);ao+=a*(n+t)/2,oo+=a*(e+r)/2,co+=a,n=t,e=r}var n,e;if(1!==uo){if(!(1>uo))return;uo=1,ao=oo=co=0}vo.point=function(r,u){vo.point=t,n=r,e=u}}function Lu(){vo.point=zu}function Fu(){function t(t,n){var e=u*t-r*n;ao+=e*(r+t),oo+=e*(u+n),co+=3*e,r=t,u=n}var n,e,r,u;2>uo&&(uo=2,ao=oo=co=0),vo.point=function(i,a){vo.point=t,n=r=i,e=u=a},vo.lineEnd=function(){t(n,e)}}function Hu(){function t(t,n){if(t*=ji,n*=ji,!(Pi>Math.abs(Math.abs(i)-Ri/2)&&Pi>Math.abs(Math.abs(n)-Ri/2))){var e=Math.cos(n),c=Math.sin(n);if(Pi>Math.abs(i-Ri/2))Mo+=2*(t-r);else{var l=t-u,s=Math.cos(l),f=Math.atan2(Math.sqrt((f=e*Math.sin(l))*f+(f=a*c-o*e*s)*f),o*c+a*e*s),h=(f+Ri+i+n)/4;Mo+=(0>l&&l>-Ri||l>Ri?-4:4)*Math.atan(Math.sqrt(Math.abs(Math.tan(h)*Math.tan(h-f/2)*Math.tan(h-Ri/4-i/2)*Math.tan(h-Ri/4-n/2))))}r=u,u=t,i=n,a=e,o=c}}var n,e,r,u,i,a,o;bo.point=function(c,l){bo.point=t,r=u=(n=c)*ji,i=(e=l)*ji,a=Math.cos(i),o=Math.sin(i)},bo.lineEnd=function(){t(n,e)}}function Ru(t){return Pu(function(){return t})()}function Pu(t){function n(t){return t=a(t[0]*ji,t[1]*ji),[t[0]*s+o,c-t[1]*s]}function e(t){return t=a.invert((t[0]-o)/s,(c-t[1])/s),[t[0]*Oi,t[1]*Oi]}function r(){a=xu(i=Ou(p,m,v),u);var t=u(d,g);return o=f-t[0]*s,c=h+t[1]*s,n}var u,i,a,o,c,l=nu(function(t,n){return t=u(t,n),[t[0]*s+o,c-t[1]*s]}),s=150,f=480,h=250,d=0,g=0,p=0,m=0,v=0,y=so,M=null;return n.stream=function(t){return ju(i,y(l(t)))},n.clipAngle=function(t){return arguments.length?(y=null==t?(M=t,so):bu(M=+t),n):M},n.scale=function(t){return arguments.length?(s=+t,r()):s},n.translate=function(t){return arguments.length?(f=+t[0],h=+t[1],r()):[f,h]},n.center=function(t){return arguments.length?(d=t[0]%360*ji,g=t[1]%360*ji,r()):[d*Oi,g*Oi]},n.rotate=function(t){return arguments.length?(p=t[0]%360*ji,m=t[1]%360*ji,v=t.length>2?t[2]%360*ji:0,r()):[p*Oi,m*Oi,v*Oi]},d3.rebind(n,l,"precision"),function(){return u=t.apply(this,arguments),n.invert=u.invert&&e,r()}}function ju(t,n){return{point:function(e,r){r=t(e*ji,r*ji),e=r[0],n.point(e>Ri?e-2*Ri:-Ri>e?e+2*Ri:e,r[1])},sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function Ou(t,n,e){return t?n||e?xu(Uu(t),Iu(n,e)):Uu(t):n||e?Iu(n,e):_u}function Yu(t){return function(n,e){return n+=t,[n>Ri?n-2*Ri:-Ri>n?n+2*Ri:n,e]}}function Uu(t){var n=Yu(t);return n.invert=Yu(-t),n}function Iu(t,n){function e(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*r+o*u;return[Math.atan2(c*i-s*a,o*r-l*u),Math.asin(Math.max(-1,Math.min(1,s*i+c*a)))]}var r=Math.cos(t),u=Math.sin(t),i=Math.cos(n),a=Math.sin(n);return e.invert=function(t,n){var e=Math.cos(n),o=Math.cos(t)*e,c=Math.sin(t)*e,l=Math.sin(n),s=l*i-c*a;return[Math.atan2(c*i+l*a,o*r+s*u),Math.asin(Math.max(-1,Math.min(1,s*r-o*u)))]},e}function Vu(t,n){function e(n,e){var r=Math.cos(n),u=Math.cos(e),i=t(r*u);return[i*u*Math.sin(n),i*Math.sin(e)]}return e.invert=function(t,e){var r=Math.sqrt(t*t+e*e),u=n(r),i=Math.sin(u),a=Math.cos(u);return[Math.atan2(t*i,r*a),Math.asin(r&&e*i/r)]},e}function Xu(t,n,e,r){var u,i,a,o,c,l,s;return u=r[t],i=u[0],a=u[1],u=r[n],o=u[0],c=u[1],u=r[e],l=u[0],s=u[1],(s-a)*(o-i)-(c-a)*(l-i)>0}function Zu(t,n,e){return(e[0]-n[0])*(t[1]-n[1])<(e[1]-n[1])*(t[0]-n[0])}function Bu(t,n,e,r){var u=t[0],i=e[0],a=n[0]-u,o=r[0]-i,c=t[1],l=e[1],s=n[1]-c,f=r[1]-l,h=(o*(c-l)-f*(u-i))/(f*a-o*s);return[u+h*a,c+h*s]}function $u(t,n){var e={list:t.map(function(t,n){return{index:n,x:t[0],y:t[1]}}).sort(function(t,n){return t.y<n.y?-1:t.y>n.y?1:t.x<n.x?-1:t.x>n.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(t,n){return{edge:t,side:n,vertex:null,l:null,r:null}},insert:function(t,n){n.l=t,n.r=t.r,t.r.l=n,t.r=n},leftBound:function(t){var n=r.leftEnd;do n=n.r;while(n!=r.rightEnd&&u.rightOf(n,t));return n=n.l},del:function(t){t.l.r=t.r,t.r.l=t.l,t.edge=null},right:function(t){return t.r},left:function(t){return t.l},leftRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[t.side]},rightRegion:function(t){return null==t.edge?e.bottomSite:t.edge.region[_o[t.side]]}},u={bisect:function(t,n){var e={region:{l:t,r:n},ep:{l:null,r:null}},r=n.x-t.x,u=n.y-t.y,i=r>0?r:-r,a=u>0?u:-u;return e.c=t.x*r+t.y*u+.5*(r*r+u*u),i>a?(e.a=1,e.b=u/r,e.c/=r):(e.b=1,e.a=r/u,e.c/=u),e},intersect:function(t,n){var e=t.edge,r=n.edge;if(!e||!r||e.region.r==r.region.r)return null;var u=e.a*r.b-e.b*r.a;if(1e-10>Math.abs(u))return null;var i,a,o=(e.c*r.b-r.c*e.b)/u,c=(r.c*e.a-e.c*r.a)/u,l=e.region.r,s=r.region.r;l.y<s.y||l.y==s.y&&l.x<s.x?(i=t,a=e):(i=n,a=r);var f=o>=a.region.r.x;return f&&"l"===i.side||!f&&"r"===i.side?null:{x:o,y:c}},rightOf:function(t,n){var e=t.edge,r=e.region.r,u=n.x>r.x;if(u&&"l"===t.side)return 1;if(!u&&"r"===t.side)return 0;if(1===e.a){var i=n.y-r.y,a=n.x-r.x,o=0,c=0;if(!u&&0>e.b||u&&e.b>=0?c=o=i>=e.b*a:(c=n.x+n.y*e.b>e.c,0>e.b&&(c=!c),c||(o=1)),!o){var l=r.x-e.region.l.x;c=e.b*(a*a-i*i)<l*i*(1+2*a/l+e.b*e.b),0>e.b&&(c=!c)}}else{var s=e.c-e.a*n.x,f=n.y-s,h=n.x-r.x,d=s-r.y;c=f*f>h*h+d*d}return"l"===t.side?c:!c},endPoint:function(t,e,r){t.ep[e]=r,t.ep[_o[e]]&&n(t)},distance:function(t,n){var e=t.x-n.x,r=t.y-n.y;return Math.sqrt(e*e+r*r)}},i={list:[],insert:function(t,n,e){t.vertex=n,t.ystar=n.y+e;for(var r=0,u=i.list,a=u.length;a>r;r++){var o=u[r];if(!(t.ystar>o.ystar||t.ystar==o.ystar&&n.x>o.vertex.x))break}u.splice(r,0,t)},del:function(t){for(var n=0,e=i.list,r=e.length;r>n&&e[n]!=t;++n);e.splice(n,1)},empty:function(){return 0===i.list.length},nextEvent:function(t){for(var n=0,e=i.list,r=e.length;r>n;++n)if(e[n]==t)return e[n+1];return null},min:function(){var t=i.list[0];return{x:t.vertex.x,y:t.ystar}},extractMin:function(){return i.list.shift()}};r.init(),e.bottomSite=e.list.shift();for(var a,o,c,l,s,f,h,d,g,p,m,v,y,M=e.list.shift();;)if(i.empty()||(a=i.min()),M&&(i.empty()||M.y<a.y||M.y==a.y&&M.x<a.x))o=r.leftBound(M),c=r.right(o),h=r.rightRegion(o),v=u.bisect(h,M),f=r.createHalfEdge(v,"l"),r.insert(o,f),p=u.intersect(o,f),p&&(i.del(o),i.insert(o,p,u.distance(p,M))),o=f,f=r.createHalfEdge(v,"r"),r.insert(o,f),p=u.intersect(f,c),p&&i.insert(f,p,u.distance(p,M)),M=e.list.shift();else{if(i.empty())break;o=i.extractMin(),l=r.left(o),c=r.right(o),s=r.right(c),h=r.leftRegion(o),d=r.rightRegion(c),m=o.vertex,u.endPoint(o.edge,o.side,m),u.endPoint(c.edge,c.side,m),r.del(o),i.del(c),r.del(c),y="l",h.y>d.y&&(g=h,h=d,d=g,y="r"),v=u.bisect(h,d),f=r.createHalfEdge(v,y),r.insert(l,f),u.endPoint(v,_o[y],m),p=u.intersect(l,f),p&&(i.del(l),i.insert(l,p,u.distance(p,h))),p=u.intersect(f,s),p&&i.insert(f,p,u.distance(p,h))}for(o=r.right(r.leftEnd);o!=r.rightEnd;o=r.right(o))n(o.edge)}function Ju(){return{leaf:!0,nodes:[],point:null}}function Gu(t,n,e,r,u,i){if(!t(n,e,r,u,i)){var a=.5*(e+u),o=.5*(r+i),c=n.nodes;c[0]&&Gu(t,c[0],e,r,a,o),c[1]&&Gu(t,c[1],a,r,u,o),c[2]&&Gu(t,c[2],e,o,a,i),c[3]&&Gu(t,c[3],a,o,u,i)}}function Ku(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function Wu(t,n,e,r){for(var u,i,a=0,o=n.length,c=e.length;o>a;){if(r>=c)return-1;if(u=n.charCodeAt(a++),37===u){if(i=Yo[n.charAt(a++)],!i||0>(r=i(t,e,r)))return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function Qu(t){return RegExp("^(?:"+t.map(d3.requote).join("|")+")","i")}function ti(t){for(var n=new i,e=-1,r=t.length;r>++e;)n.set(t[e].toLowerCase(),e);return n}function ni(t,n,e){t+="";var r=t.length;return e>r?Array(e-r+1).join(n)+t:t}function ei(t,n,e){Lo.lastIndex=0;var r=Lo.exec(n.substring(e));return r?e+=r[0].length:-1}function ri(t,n,e){Do.lastIndex=0;var r=Do.exec(n.substring(e));return r?e+=r[0].length:-1}function ui(t,n,e){Ro.lastIndex=0;var r=Ro.exec(n.substring(e));return r?(t.m=Po.get(r[0].toLowerCase()),e+=r[0].length):-1}function ii(t,n,e){Fo.lastIndex=0;var r=Fo.exec(n.substring(e));return r?(t.m=Ho.get(r[0].toLowerCase()),e+=r[0].length):-1}function ai(t,n,e){return Wu(t,""+Oo.c,n,e)}function oi(t,n,e){return Wu(t,""+Oo.x,n,e)}function ci(t,n,e){return Wu(t,""+Oo.X,n,e)}function li(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+4));return r?(t.y=+r[0],e+=r[0].length):-1}function si(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.y=fi(+r[0]),e+=r[0].length):-1}function fi(t){return t+(t>68?1900:2e3)}function hi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.m=r[0]-1,e+=r[0].length):-1}function di(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.d=+r[0],e+=r[0].length):-1}function gi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.H=+r[0],e+=r[0].length):-1}function pi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.M=+r[0],e+=r[0].length):-1}function mi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+2));return r?(t.S=+r[0],e+=r[0].length):-1}function vi(t,n,e){Uo.lastIndex=0;var r=Uo.exec(n.substring(e,e+3));return r?(t.L=+r[0],e+=r[0].length):-1}function yi(t,n,e){var r=Io.get(n.substring(e,e+=2).toLowerCase());return null==r?-1:(t.p=r,e)}function Mi(t){var n=t.getTimezoneOffset(),e=n>0?"-":"+",r=~~(Math.abs(n)/60),u=Math.abs(n)%60;return e+ni(r,"0",2)+ni(u,"0",2)}function bi(t){return t.toISOString()}function xi(t,n,e){function r(n){var e=t(n),r=i(e,1);return r-n>n-e?e:r}function u(e){return n(e=t(new wo(e-1)),1),e}function i(t,e){return n(t=new wo(+t),e),t}function a(t,r,i){var a=u(t),o=[];if(i>1)for(;r>a;)e(a)%i||o.push(new Date(+a)),n(a,1);else for(;r>a;)o.push(new Date(+a)),n(a,1);return o}function o(t,n,e){try{wo=Ku;var r=new Ku;return r._=t,a(r,n,e)}finally{wo=Date}}t.floor=t,t.round=r,t.ceil=u,t.offset=i,t.range=a;var c=t.utc=_i(t);return c.floor=c,c.round=_i(r),c.ceil=_i(u),c.offset=_i(i),c.range=o,t}function _i(t){return function(n,e){try{wo=Ku;var r=new Ku;return r._=n,t(r,e)._}finally{wo=Date}}}function wi(t,n,e){function r(n){return t(n)}return r.invert=function(n){return ki(t.invert(n))},r.domain=function(n){return arguments.length?(t.domain(n),r):t.domain().map(ki)},r.nice=function(t){return r.domain(Yn(r.domain(),function(){return t}))},r.ticks=function(e,u){var i=Si(r.domain());if("function"!=typeof e){var a=i[1]-i[0],o=a/e,c=d3.bisect(Xo,o);if(c==Xo.length)return n.year(i,e);if(!c)return t.ticks(e).map(ki);Math.log(o/Xo[c-1])<Math.log(Xo[c]/o)&&--c,e=n[c],u=e[1],e=e[0].range}return e(i[0],new Date(+i[1]+1),u)},r.tickFormat=function(){return e},r.copy=function(){return wi(t.copy(),n,e)},d3.rebind(r,t,"range","rangeRound","interpolate","clamp")}function Si(t){var n=t[0],e=t[t.length-1];return e>n?[n,e]:[e,n]}function ki(t){return new Date(t)}function Ei(t){return function(n){for(var e=t.length-1,r=t[e];!r[1](n);)r=t[--e];return r[0](n)}}function Ai(t){var n=new Date(t,0,1);return n.setFullYear(t),n}function Ni(t){var n=t.getFullYear(),e=Ai(n),r=Ai(n+1);return n+(t-e)/(r-e)}function Ti(t){var n=new Date(Date.UTC(t,0,1));return n.setUTCFullYear(t),n}function qi(t){var n=t.getUTCFullYear(),e=Ti(n),r=Ti(n+1);return n+(t-e)/(r-e)}var Ci=".",zi=",",Di=[3,3];Date.now||(Date.now=function(){return+new Date});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Li){var Fi=CSSStyleDeclaration.prototype,Hi=Fi.setProperty;Fi.setProperty=function(t,n,e){Hi.call(this,t,n+"",e)}}d3={version:"3.0.2"};var Ri=Math.PI,Pi=1e-6,ji=Ri/180,Oi=180/Ri,Yi=u;try{Yi(document.documentElement.childNodes)[0].nodeType}catch(Ui){Yi=r}var Ii=[].__proto__?function(t,n){t.__proto__=n}:function(t,n){for(var e in n)t[e]=n[e]};d3.map=function(t){var n=new i;for(var e in t)n.set(e,t[e]);return n},e(i,{has:function(t){return Vi+t in this},get:function(t){return this[Vi+t]},set:function(t,n){return this[Vi+t]=n},remove:function(t){return t=Vi+t,t in this&&delete this[t]},keys:function(){var t=[];return this.forEach(function(n){t.push(n)}),t},values:function(){var t=[];return this.forEach(function(n,e){t.push(e)}),t},entries:function(){var t=[];return this.forEach(function(n,e){t.push({key:n,value:e})}),t},forEach:function(t){for(var n in this)n.charCodeAt(0)===Xi&&t.call(this,n.substring(1),this[n])}});var Vi="\0",Xi=Vi.charCodeAt(0);d3.functor=c,d3.rebind=function(t,n){for(var e,r=1,u=arguments.length;u>++r;)t[e=arguments[r]]=l(t,n,n[e]);return t},d3.ascending=function(t,n){return n>t?-1:t>n?1:t>=n?0:0/0},d3.descending=function(t,n){return t>n?-1:n>t?1:n>=t?0:0/0},d3.mean=function(t,n){var e,r=t.length,u=0,i=-1,a=0;if(1===arguments.length)for(;r>++i;)s(e=t[i])&&(u+=(e-u)/++a);else for(;r>++i;)s(e=n.call(t,t[i],i))&&(u+=(e-u)/++a);return a?u:void 0},d3.median=function(t,n){return arguments.length>1&&(t=t.map(n)),t=t.filter(s),t.length?d3.quantile(t.sort(d3.ascending),.5):void 0},d3.min=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&e>r&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&e>r&&(e=r)}return e},d3.max=function(t,n){var e,r,u=-1,i=t.length;if(1===arguments.length){for(;i>++u&&(null==(e=t[u])||e!=e);)e=void 0;for(;i>++u;)null!=(r=t[u])&&r>e&&(e=r)}else{for(;i>++u&&(null==(e=n.call(t,t[u],u))||e!=e);)e=void 0;for(;i>++u;)null!=(r=n.call(t,t[u],u))&&r>e&&(e=r)}return e},d3.extent=function(t,n){var e,r,u,i=-1,a=t.length;if(1===arguments.length){for(;a>++i&&(null==(e=u=t[i])||e!=e);)e=u=void 0;for(;a>++i;)null!=(r=t[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;a>++i&&(null==(e=u=n.call(t,t[i],i))||e!=e);)e=void 0;for(;a>++i;)null!=(r=n.call(t,t[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},d3.random={normal:function(t,n){var e=arguments.length;return 2>e&&(n=1),1>e&&(t=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return t+n*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(t,n){var e=arguments.length;2>e&&(n=1),1>e&&(t=0);var r=d3.random.normal();return function(){return Math.exp(t+n*r())}},irwinHall:function(t){return function(){for(var n=0,e=0;t>e;e++)n+=Math.random();return n/t}}},d3.sum=function(t,n){var e,r=0,u=t.length,i=-1;if(1===arguments.length)for(;u>++i;)isNaN(e=+t[i])||(r+=e);else for(;u>++i;)isNaN(e=+n.call(t,t[i],i))||(r+=e);return r},d3.quantile=function(t,n){var e=(t.length-1)*n+1,r=Math.floor(e),u=+t[r-1],i=e-r;return i?u+i*(t[r]-u):u},d3.shuffle=function(t){for(var n,e,r=t.length;r;)e=0|Math.random()*r--,n=t[r],t[r]=t[e],t[e]=n;return t},d3.transpose=function(t){return d3.zip.apply(d3,t)},d3.zip=function(){if(!(r=arguments.length))return[];for(var t=-1,n=d3.min(arguments,f),e=Array(n);n>++t;)for(var r,u=-1,i=e[t]=Array(r);r>++u;)i[u]=arguments[u][t];return e},d3.bisector=function(t){return{left:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;e>t.call(n,n[i],i)?r=i+1:u=i}return r},right:function(n,e,r,u){for(3>arguments.length&&(r=0),4>arguments.length&&(u=n.length);u>r;){var i=r+u>>>1;t.call(n,n[i],i)>e?u=i:r=i+1}return r}}};var Zi=d3.bisector(function(t){return t});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.nest=function(){function t(n,o){if(o>=a.length)return r?r.call(u,n):e?n.sort(e):n;for(var c,l,s,f=-1,h=n.length,d=a[o++],g=new i,p={};h>++f;)(s=g.get(c=d(l=n[f])))?s.push(l):g.set(c,[l]);return g.forEach(function(n,e){p[n]=t(e,o)}),p}function n(t,e){if(e>=a.length)return t;var r,u=[],i=o[e++];for(r in t)u.push({key:r,values:n(t[r],e)});return i&&u.sort(function(t,n){return i(t.key,n.key)}),u}var e,r,u={},a=[],o=[];return u.map=function(n){return t(n,0)},u.entries=function(e){return n(t(e,0),0)},u.key=function(t){return a.push(t),u},u.sortKeys=function(t){return o[a.length-1]=t,u},u.sortValues=function(t){return e=t,u},u.rollup=function(t){return r=t,u},u},d3.keys=function(t){var n=[];for(var e in t)n.push(e);return n},d3.values=function(t){var n=[];for(var e in t)n.push(t[e]);return n},d3.entries=function(t){var n=[];for(var e in t)n.push({key:e,value:t[e]});return n},d3.permute=function(t,n){for(var e=[],r=-1,u=n.length;u>++r;)e[r]=t[n[r]];return e},d3.merge=function(t){return Array.prototype.concat.apply([],t)},d3.range=function(t,n,e){if(3>arguments.length&&(e=1,2>arguments.length&&(n=t,t=0)),1/0===(n-t)/e)throw Error("infinite range");var r,u=[],i=d(Math.abs(e)),a=-1;if(t*=i,n*=i,e*=i,0>e)for(;(r=t+e*++a)>n;)u.push(r/i);else for(;n>(r=t+e*++a);)u.push(r/i);return u},d3.requote=function(t){return t.replace(Bi,"\\$&")};var Bi=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(t,n){return n?Math.round(t*(n=Math.pow(10,n)))/n:Math.round(t)},d3.xhr=function(t,n,e){function r(){var t=l.status;!t&&l.responseText||t>=200&&300>t||304===t?i.load.call(u,c.call(u,l)):i.error.call(u,l)}var u={},i=d3.dispatch("progress","load","error"),o={},c=a,l=new(window.XDomainRequest&&/^(http(s)?:)?\/\//.test(t)?XDomainRequest:XMLHttpRequest);return"onload"in l?l.onload=l.onerror=r:l.onreadystatechange=function(){l.readyState>3&&r()},l.onprogress=function(t){var n=d3.event;d3.event=t;try{i.progress.call(u,l)}finally{d3.event=n}},u.header=function(t,n){return t=(t+"").toLowerCase(),2>arguments.length?o[t]:(null==n?delete o[t]:o[t]=n+"",u)},u.mimeType=function(t){return arguments.length?(n=null==t?null:t+"",u):n},u.response=function(t){return c=t,u},["get","post"].forEach(function(t){u[t]=function(){return u.send.apply(u,[t].concat(Yi(arguments)))}}),u.send=function(e,r,i){if(2===arguments.length&&"function"==typeof r&&(i=r,r=null),l.open(e,t,!0),null==n||"accept"in o||(o.accept=n+",*/*"),l.setRequestHeader)for(var a in o)l.setRequestHeader(a,o[a]);return null!=n&&l.overrideMimeType&&l.overrideMimeType(n),null!=i&&u.on("error",i).on("load",function(t){i(null,t)}),l.send(null==r?null:r),u},u.abort=function(){return l.abort(),u},d3.rebind(u,i,"on"),2===arguments.length&&"function"==typeof n&&(e=n,n=null),null==e?u:u.get(g(e))},d3.text=function(){return d3.xhr.apply(d3,arguments).response(p)},d3.json=function(t,n){return d3.xhr(t,"application/json",n).response(m)},d3.html=function(t,n){return d3.xhr(t,"text/html",n).response(v)},d3.xml=function(){return d3.xhr.apply(d3,arguments).response(y)};var $i={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:$i,qualify:function(t){var n=t.indexOf(":"),e=t;return n>=0&&(e=t.substring(0,n),t=t.substring(n+1)),$i.hasOwnProperty(e)?{space:$i[e],local:t}:t}},d3.dispatch=function(){for(var t=new M,n=-1,e=arguments.length;e>++n;)t[arguments[n]]=b(t);return t},M.prototype.on=function(t,n){var e=t.indexOf("."),r="";return e>0&&(r=t.substring(e+1),t=t.substring(0,e)),2>arguments.length?this[t].on(r):this[t].on(r,n)},d3.format=function(t){var n=Ji.exec(t),e=n[1]||" ",r=n[2]||">",u=n[3]||"",i=n[4]||"",a=n[5],o=+n[6],c=n[7],l=n[8],s=n[9],f=1,h="",d=!1;switch(l&&(l=+l.substring(1)),(a||"0"===e&&"="===r)&&(a=e="0",r="=",c&&(o-=Math.floor((o-1)/4))),s){case"n":c=!0,s="g";break;case"%":f=100,h="%",s="f";break;case"p":f=100,h="%",s="r";break;case"b":case"o":case"x":case"X":i&&(i="0"+s.toLowerCase());case"c":case"d":d=!0,l=0;break;case"s":f=-1,s="r"}"#"===i&&(i=""),"r"!=s||l||(s="g"),s=Gi.get(s)||_;var g=a&&c;return function(t){if(d&&t%1)return"";var n=0>t||0===t&&0>1/t?(t=-t,"-"):u;if(0>f){var p=d3.formatPrefix(t,l);t=p.scale(t),h=p.symbol}else t*=f;t=s(t,l),!a&&c&&(t=Ki(t));var m=i.length+t.length+(g?0:n.length),v=o>m?Array(m=o-m+1).join(e):"";return g&&(t=Ki(v+t)),Ci&&t.replace(".",Ci),n+=i,("<"===r?n+t+v:">"===r?v+n+t:"^"===r?v.substring(0,m>>=1)+n+t+v.substring(m):n+(g?t:v+t))+h}};var Ji=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,Gi=d3.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,n){return t.toPrecision(n)},e:function(t,n){return t.toExponential(n)},f:function(t,n){return t.toFixed(n)},r:function(t,n){return d3.round(t,n=x(t,n)).toFixed(Math.max(0,Math.min(20,n)))}}),Ki=a;if(Di){var Wi=Di.length;Ki=function(t){for(var n=t.lastIndexOf("."),e=n>=0?"."+t.substring(n+1):(n=t.length,""),r=[],u=0,i=Di[0];n>0&&i>0;)r.push(t.substring(n-=i,n+i)),i=Di[u=(u+1)%Wi];return r.reverse().join(zi||"")+e}}var Qi=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(w);d3.formatPrefix=function(t,n){var e=0;return t&&(0>t&&(t*=-1),n&&(t=d3.round(t,x(t,n))),e=1+Math.floor(1e-12+Math.log(t)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),Qi[8+e/3]};var ta=function(){return a},na=d3.map({linear:ta,poly:q,quad:function(){return A},cubic:function(){return N},sin:function(){return C},exp:function(){return z},circle:function(){return D},elastic:L,back:F,bounce:function(){return H}}),ea=d3.map({"in":a,out:k,"in-out":E,"out-in":function(t){return E(k(t))}});d3.ease=function(t){var n=t.indexOf("-"),e=n>=0?t.substring(0,n):t,r=n>=0?t.substring(n+1):"in";return e=na.get(e)||ta,r=ea.get(r)||a,S(r(e.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(t){var n=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(t){n.setAttribute("transform",t);var e=n.transform.baseVal.consolidate();return new O(e?e.matrix:ra)})(t)},O.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ra={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(t,n){for(var e,r=d3.interpolators.length;--r>=0&&!(e=d3.interpolators[r](t,n)););return e},d3.interpolateNumber=function(t,n){return n-=t,function(e){return t+n*e}},d3.interpolateRound=function(t,n){return n-=t,function(e){return Math.round(t+n*e)}},d3.interpolateString=function(t,n){var e,r,u,i,a,o=0,c=0,l=[],s=[];for(ua.lastIndex=0,r=0;e=ua.exec(n);++r)e.index&&l.push(n.substring(o,c=e.index)),s.push({i:l.length,x:e[0]}),l.push(null),o=ua.lastIndex;for(n.length>o&&l.push(n.substring(o)),r=0,i=s.length;(e=ua.exec(t))&&i>r;++r)if(a=s[r],a.x==e[0]){if(a.i)if(null==l[a.i+1])for(l[a.i-1]+=a.x,l.splice(a.i,1),u=r+1;i>u;++u)s[u].i--;else for(l[a.i-1]+=a.x+l[a.i+1],l.splice(a.i,2),u=r+1;i>u;++u)s[u].i-=2;else if(null==l[a.i+1])l[a.i]=a.x;else for(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1),u=r+1;i>u;++u)s[u].i--;s.splice(r,1),i--,r--}else a.x=d3.interpolateNumber(parseFloat(e[0]),parseFloat(a.x));for(;i>r;)a=s.pop(),null==l[a.i+1]?l[a.i]=a.x:(l[a.i]=a.x+l[a.i+1],l.splice(a.i+1,1)),i--;return 1===l.length?null==l[0]?s[0].x:function(){return n}:function(t){for(r=0;i>r;++r)l[(a=s[r]).i]=a.x(t);return l.join("")}},d3.interpolateTransform=function(t,n){var e,r=[],u=[],i=d3.transform(t),a=d3.transform(n),o=i.translate,c=a.translate,l=i.rotate,s=a.rotate,f=i.skew,h=a.skew,d=i.scale,g=a.scale;return o[0]!=c[0]||o[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:d3.interpolateNumber(o[0],c[0])},{i:3,x:d3.interpolateNumber(o[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),l!=s?(l-s>180?s+=360:s-l>180&&(l+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(l,s)})):s&&r.push(r.pop()+"rotate("+s+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),d[0]!=g[0]||d[1]!=g[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:d3.interpolateNumber(d[0],g[0])},{i:e-2,x:d3.interpolateNumber(d[1],g[1])})):(1!=g[0]||1!=g[1])&&r.push(r.pop()+"scale("+g+")"),e=u.length,function(t){for(var n,i=-1;e>++i;)r[(n=u[i]).i]=n.x(t);return r.join("")}},d3.interpolateRgb=function(t,n){t=d3.rgb(t),n=d3.rgb(n);var e=t.r,r=t.g,u=t.b,i=n.r-e,a=n.g-r,o=n.b-u;return function(t){return"#"+G(Math.round(e+i*t))+G(Math.round(r+a*t))+G(Math.round(u+o*t))}},d3.interpolateHsl=function(t,n){t=d3.hsl(t),n=d3.hsl(n);var e=t.h,r=t.s,u=t.l,i=n.h-e,a=n.s-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return un(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateLab=function(t,n){t=d3.lab(t),n=d3.lab(n);var e=t.l,r=t.a,u=t.b,i=n.l-e,a=n.a-r,o=n.b-u;return function(t){return fn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateHcl=function(t,n){t=d3.hcl(t),n=d3.hcl(n);var e=t.h,r=t.c,u=t.l,i=n.h-e,a=n.c-r,o=n.l-u;return i>180?i-=360:-180>i&&(i+=360),function(t){return cn(e+i*t,r+a*t,u+o*t)+""}},d3.interpolateArray=function(t,n){var e,r=[],u=[],i=t.length,a=n.length,o=Math.min(t.length,n.length);for(e=0;o>e;++e)r.push(d3.interpolate(t[e],n[e]));for(;i>e;++e)u[e]=t[e];for(;a>e;++e)u[e]=n[e];return function(t){for(e=0;o>e;++e)u[e]=r[e](t);return u}},d3.interpolateObject=function(t,n){var e,r={},u={};for(e in t)e in n?r[e]=V(e)(t[e],n[e]):u[e]=t[e];for(e in n)e in t||(u[e]=n[e]);return function(t){for(e in r)u[e]=r[e](t);return u}};var ua=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(t,n){return n instanceof Array&&d3.interpolateArray(t,n)},function(t,n){return("string"==typeof t||"string"==typeof n)&&d3.interpolateString(t+"",n+"")},function(t,n){return("string"==typeof n?aa.has(n)||/^(#|rgb\(|hsl\()/.test(n):n instanceof B)&&d3.interpolateRgb(t,n)},function(t,n){return!isNaN(t=+t)&&!isNaN(n=+n)&&d3.interpolateNumber(t,n)}],B.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(t,n,e){return 1===arguments.length?t instanceof J?$(t.r,t.g,t.b):K(""+t,$,un):$(~~t,~~n,~~e)};var ia=J.prototype=new B;ia.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var n=this.r,e=this.g,r=this.b,u=30;return n||e||r?(n&&u>n&&(n=u),e&&u>e&&(e=u),r&&u>r&&(r=u),$(Math.min(255,Math.floor(n/t)),Math.min(255,Math.floor(e/t)),Math.min(255,Math.floor(r/t)))):$(u,u,u)},ia.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),$(Math.floor(t*this.r),Math.floor(t*this.g),Math.floor(t*this.b)) -},ia.hsl=function(){return W(this.r,this.g,this.b)},ia.toString=function(){return"#"+G(this.r)+G(this.g)+G(this.b)};var aa=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});aa.forEach(function(t,n){aa.set(t,K(n,$,un))}),d3.hsl=function(t,n,e){return 1===arguments.length?t instanceof rn?en(t.h,t.s,t.l):K(""+t,W,en):en(+t,+n,+e)};var oa=rn.prototype=new B;oa.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,this.l/t)},oa.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),en(this.h,this.s,t*this.l)},oa.rgb=function(){return un(this.h,this.s,this.l)},d3.hcl=function(t,n,e){return 1===arguments.length?t instanceof on?an(t.h,t.c,t.l):t instanceof sn?hn(t.l,t.a,t.b):hn((t=Q((t=d3.rgb(t)).r,t.g,t.b)).l,t.a,t.b):an(+t,+n,+e)};var ca=on.prototype=new B;ca.brighter=function(t){return an(this.h,this.c,Math.min(100,this.l+la*(arguments.length?t:1)))},ca.darker=function(t){return an(this.h,this.c,Math.max(0,this.l-la*(arguments.length?t:1)))},ca.rgb=function(){return cn(this.h,this.c,this.l).rgb()},d3.lab=function(t,n,e){return 1===arguments.length?t instanceof sn?ln(t.l,t.a,t.b):t instanceof on?cn(t.l,t.c,t.h):Q((t=d3.rgb(t)).r,t.g,t.b):ln(+t,+n,+e)};var la=18,sa=.95047,fa=1,ha=1.08883,da=sn.prototype=new B;da.brighter=function(t){return ln(Math.min(100,this.l+la*(arguments.length?t:1)),this.a,this.b)},da.darker=function(t){return ln(Math.max(0,this.l-la*(arguments.length?t:1)),this.a,this.b)},da.rgb=function(){return fn(this.l,this.a,this.b)};var ga=function(t,n){return n.querySelector(t)},pa=function(t,n){return n.querySelectorAll(t)},ma=document.documentElement,va=ma.matchesSelector||ma.webkitMatchesSelector||ma.mozMatchesSelector||ma.msMatchesSelector||ma.oMatchesSelector,ya=function(t,n){return va.call(t,n)};"function"==typeof Sizzle&&(ga=function(t,n){return Sizzle(t,n)[0]||null},pa=function(t,n){return Sizzle.uniqueSort(Sizzle(t,n))},ya=Sizzle.matchesSelector);var Ma=[];d3.selection=function(){return ba},d3.selection.prototype=Ma,Ma.select=function(t){var n,e,r,u,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]),n.parentNode=(r=this[a]).parentNode;for(var c=-1,l=r.length;l>++c;)(u=r[c])?(n.push(e=t.call(u,u.__data__,c)),e&&"__data__"in u&&(e.__data__=u.__data__)):n.push(null)}return mn(i)},Ma.selectAll=function(t){var n,e,r=[];"function"!=typeof t&&(t=yn(t));for(var u=-1,i=this.length;i>++u;)for(var a=this[u],o=-1,c=a.length;c>++o;)(e=a[o])&&(r.push(n=Yi(t.call(e,e.__data__,o))),n.parentNode=e);return mn(r)},Ma.attr=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node();return t=d3.ns.qualify(t),t.local?e.getAttributeNS(t.space,t.local):e.getAttribute(t)}for(n in t)this.each(Mn(n,t[n]));return this}return this.each(Mn(t,n))},Ma.classed=function(t,n){if(2>arguments.length){if("string"==typeof t){var e=this.node(),r=(t=t.trim().split(/^|\s+/g)).length,u=-1;if(n=e.classList){for(;r>++u;)if(!n.contains(t[u]))return!1}else for(n=e.className,null!=n.baseVal&&(n=n.baseVal);r>++u;)if(!bn(t[u]).test(n))return!1;return!0}for(n in t)this.each(xn(n,t[n]));return this}return this.each(xn(t,n))},Ma.style=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n="");for(e in t)this.each(wn(e,t[e],n));return this}if(2>r)return getComputedStyle(this.node(),null).getPropertyValue(t);e=""}return this.each(wn(t,n,e))},Ma.property=function(t,n){if(2>arguments.length){if("string"==typeof t)return this.node()[t];for(n in t)this.each(Sn(n,t[n]));return this}return this.each(Sn(t,n))},Ma.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.textContent=null==n?"":n}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Ma.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var n=t.apply(this,arguments);this.innerHTML=null==n?"":n}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Ma.append=function(t){function n(){return this.appendChild(document.createElementNS(this.namespaceURI,t))}function e(){return this.appendChild(document.createElementNS(t.space,t.local))}return t=d3.ns.qualify(t),this.select(t.local?e:n)},Ma.insert=function(t,n){function e(){return this.insertBefore(document.createElementNS(this.namespaceURI,t),ga(n,this))}function r(){return this.insertBefore(document.createElementNS(t.space,t.local),ga(n,this))}return t=d3.ns.qualify(t),this.select(t.local?r:e)},Ma.remove=function(){return this.each(function(){var t=this.parentNode;t&&t.removeChild(this)})},Ma.data=function(t,n){function e(t,e){var r,u,a,o=t.length,f=e.length,h=Math.min(o,f),d=Math.max(o,f),g=[],p=[],m=[];if(n){var v,y=new i,M=[],b=e.length;for(r=-1;o>++r;)v=n.call(u=t[r],u.__data__,r),y.has(v)?m[b++]=u:y.set(v,u),M.push(v);for(r=-1;f>++r;)v=n.call(e,a=e[r],r),y.has(v)?(g[r]=u=y.get(v),u.__data__=a,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null),y.remove(v);for(r=-1;o>++r;)y.has(M[r])&&(m[r]=t[r])}else{for(r=-1;h>++r;)u=t[r],a=e[r],u?(u.__data__=a,g[r]=u,p[r]=m[r]=null):(p[r]=kn(a),g[r]=m[r]=null);for(;f>r;++r)p[r]=kn(e[r]),g[r]=m[r]=null;for(;d>r;++r)m[r]=t[r],p[r]=g[r]=null}p.update=g,p.parentNode=g.parentNode=m.parentNode=t.parentNode,c.push(p),l.push(g),s.push(m)}var r,u,a=-1,o=this.length;if(!arguments.length){for(t=Array(o=(r=this[0]).length);o>++a;)(u=r[a])&&(t[a]=u.__data__);return t}var c=qn([]),l=mn([]),s=mn([]);if("function"==typeof t)for(;o>++a;)e(r=this[a],t.call(r,r.parentNode.__data__,a));else for(;o>++a;)e(r=this[a],t);return l.enter=function(){return c},l.exit=function(){return s},l},Ma.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Ma.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]),n.parentNode=(e=this[i]).parentNode;for(var o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return mn(u)},Ma.order=function(){for(var t=-1,n=this.length;n>++t;)for(var e,r=this[t],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},Ma.sort=function(t){t=An.apply(this,arguments);for(var n=-1,e=this.length;e>++n;)this[n].sort(t);return this.order()},Ma.on=function(t,n,e){var r=arguments.length;if(3>r){if("string"!=typeof t){2>r&&(n=!1);for(e in t)this.each(Nn(e,t[e],n));return this}if(2>r)return(r=this.node()["__on"+t])&&r._;e=!1}return this.each(Nn(t,n,e))},Ma.each=function(t){return Tn(this,function(n,e,r){t.call(n,n.__data__,e,r)})},Ma.call=function(t){var n=Yi(arguments);return t.apply(n[0]=this,n),this},Ma.empty=function(){return!this.node()},Ma.node=function(){for(var t=0,n=this.length;n>t;t++)for(var e=this[t],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},Ma.transition=function(){var t,n,e=_a||++Sa,r=[],u=Object.create(ka);u.time=Date.now();for(var i=-1,a=this.length;a>++i;){r.push(t=[]);for(var o=this[i],c=-1,l=o.length;l>++c;)(n=o[c])&&zn(n,c,e,u),t.push(n)}return Cn(r,e)};var ba=mn([[document]]);ba[0].parentNode=ma,d3.select=function(t){return"string"==typeof t?ba.select(t):mn([[t]])},d3.selectAll=function(t){return"string"==typeof t?ba.selectAll(t):mn([Yi(t)])};var xa=[];d3.selection.enter=qn,d3.selection.enter.prototype=xa,xa.append=Ma.append,xa.insert=Ma.insert,xa.empty=Ma.empty,xa.node=Ma.node,xa.select=function(t){for(var n,e,r,u,i,a=[],o=-1,c=this.length;c>++o;){r=(u=this[o]).update,a.push(n=[]),n.parentNode=u.parentNode;for(var l=-1,s=u.length;s>++l;)(i=u[l])?(n.push(r[l]=e=t.call(u.parentNode,i.__data__,l)),e.__data__=i.__data__):n.push(null)}return mn(a)};var _a,wa=[],Sa=0,ka={ease:T,delay:0,duration:250};wa.call=Ma.call,wa.empty=Ma.empty,wa.node=Ma.node,d3.transition=function(t){return arguments.length?_a?t.transition():t:ba.transition()},d3.transition.prototype=wa,wa.select=function(t){var n,e,r,u=this.id,i=[];"function"!=typeof t&&(t=vn(t));for(var a=-1,o=this.length;o>++a;){i.push(n=[]);for(var c=this[a],l=-1,s=c.length;s>++l;)(r=c[l])&&(e=t.call(r,r.__data__,l))?("__data__"in r&&(e.__data__=r.__data__),zn(e,l,u,r.__transition__[u]),n.push(e)):n.push(null)}return Cn(i,u)},wa.selectAll=function(t){var n,e,r,u,i,a=this.id,o=[];"function"!=typeof t&&(t=yn(t));for(var c=-1,l=this.length;l>++c;)for(var s=this[c],f=-1,h=s.length;h>++f;)if(r=s[f]){i=r.__transition__[a],e=t.call(r,r.__data__,f),o.push(n=[]);for(var d=-1,g=e.length;g>++d;)zn(u=e[d],d,a,i),n.push(u)}return Cn(o,a)},wa.filter=function(t){var n,e,r,u=[];"function"!=typeof t&&(t=En(t));for(var i=0,a=this.length;a>i;i++){u.push(n=[]);for(var e=this[i],o=0,c=e.length;c>o;o++)(r=e[o])&&t.call(r,r.__data__,o)&&n.push(r)}return Cn(u,this.id,this.time).ease(this.ease())},wa.attr=function(t,n){function e(){this.removeAttribute(i)}function r(){this.removeAttributeNS(i.space,i.local)}if(2>arguments.length){for(n in t)this.attr(n,t[n]);return this}var u=V(t),i=d3.ns.qualify(t);return Ln(this,"attr."+t,n,function(t){function n(){var n,e=this.getAttribute(i);return e!==t&&(n=u(e,t),function(t){this.setAttribute(i,n(t))})}function a(){var n,e=this.getAttributeNS(i.space,i.local);return e!==t&&(n=u(e,t),function(t){this.setAttributeNS(i.space,i.local,n(t))})}return null==t?i.local?r:e:(t+="",i.local?a:n)})},wa.attrTween=function(t,n){function e(t,e){var r=n.call(this,t,e,this.getAttribute(u));return r&&function(t){this.setAttribute(u,r(t))}}function r(t,e){var r=n.call(this,t,e,this.getAttributeNS(u.space,u.local));return r&&function(t){this.setAttributeNS(u.space,u.local,r(t))}}var u=d3.ns.qualify(t);return this.tween("attr."+t,u.local?r:e)},wa.style=function(t,n,e){function r(){this.style.removeProperty(t)}var u=arguments.length;if(3>u){if("string"!=typeof t){2>u&&(n="");for(e in t)this.style(e,t[e],n);return this}e=""}var i=V(t);return Ln(this,"style."+t,n,function(n){function u(){var r,u=getComputedStyle(this,null).getPropertyValue(t);return u!==n&&(r=i(u,n),function(n){this.style.setProperty(t,r(n),e)})}return null==n?r:(n+="",u)})},wa.styleTween=function(t,n,e){return 3>arguments.length&&(e=""),this.tween("style."+t,function(r,u){var i=n.call(this,r,u,getComputedStyle(this,null).getPropertyValue(t));return i&&function(n){this.style.setProperty(t,i(n),e)}})},wa.text=function(t){return Ln(this,"text",t,Dn)},wa.remove=function(){return this.each("end.transition",function(){var t;!this.__transition__&&(t=this.parentNode)&&t.removeChild(this)})},wa.ease=function(t){var n=this.id;return 1>arguments.length?this.node().__transition__[n].ease:("function"!=typeof t&&(t=d3.ease.apply(d3,arguments)),Tn(this,function(e){e.__transition__[n].ease=t}))},wa.delay=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].delay=0|t.call(e,e.__data__,r,u)}:(t|=0,function(e){e.__transition__[n].delay=t}))},wa.duration=function(t){var n=this.id;return Tn(this,"function"==typeof t?function(e,r,u){e.__transition__[n].duration=Math.max(1,0|t.call(e,e.__data__,r,u))}:(t=Math.max(1,0|t),function(e){e.__transition__[n].duration=t}))},wa.each=function(t,n){var e=this.id;if(2>arguments.length){var r=ka,u=_a;_a=e,Tn(this,function(n,r,u){ka=n.__transition__[e],t.call(n,n.__data__,r,u)}),ka=r,_a=u}else Tn(this,function(r){r.__transition__[e].event.on(t,n)});return this},wa.transition=function(){for(var t,n,e,r,u=this.id,i=++Sa,a=[],o=0,c=this.length;c>o;o++){a.push(t=[]);for(var n=this[o],l=0,s=n.length;s>l;l++)(e=n[l])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,zn(e,l,i,r)),t.push(e)}return Cn(a,i)},wa.tween=function(t,n){var e=this.id;return 2>arguments.length?this.node().__transition__[e].tween.get(t):Tn(this,null==n?function(n){n.__transition__[e].tween.remove(t)}:function(r){r.__transition__[e].tween.set(t,n)})};var Ea,Aa,Na=0,Ta={},qa=null;d3.timer=function(t,n,e){if(3>arguments.length){if(2>arguments.length)n=0;else if(!isFinite(n))return;e=Date.now()}var r=Ta[t.id];r&&r.callback===t?(r.then=e,r.delay=n):Ta[t.id=++Na]=qa={callback:t,then:e,delay:n,next:qa},Ea||(Aa=clearTimeout(Aa),Ea=1,Ca(Fn))},d3.timer.flush=function(){for(var t,n=Date.now(),e=qa;e;)t=n-e.then,e.delay||(e.flush=e.callback(t)),e=e.next;Hn()};var Ca=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){setTimeout(t,17)};d3.mouse=function(t){return Rn(t,P())};var za=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(t,n){return 2>arguments.length&&(n=P().touches),n?Yi(n).map(function(n){var e=Rn(t,n);return e.identifier=n.identifier,e}):[]},d3.scale={},d3.scale.linear=function(){return In([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Kn(d3.scale.linear(),Wn)};var Da=d3.format(".0e");Wn.pow=function(t){return Math.pow(10,t)},Qn.pow=function(t){return-Math.pow(10,-t)},d3.scale.pow=function(){return te(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return ee([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(La)},d3.scale.category20=function(){return d3.scale.ordinal().range(Fa)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Ha)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Ra)};var La=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Fa=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Ha=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Ra=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return re([],[])},d3.scale.quantize=function(){return ue(0,1,[0,1])},d3.scale.threshold=function(){return ie([.5],[0,1])},d3.scale.identity=function(){return ae([0,1])},d3.svg={},d3.svg.arc=function(){function t(){var t=n.apply(this,arguments),i=e.apply(this,arguments),a=r.apply(this,arguments)+Pa,o=u.apply(this,arguments)+Pa,c=(a>o&&(c=a,a=o,o=c),o-a),l=Ri>c?"0":"1",s=Math.cos(a),f=Math.sin(a),h=Math.cos(o),d=Math.sin(o);return c>=ja?t?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+t+"A"+t+","+t+" 0 1,0 0,"+-t+"A"+t+","+t+" 0 1,0 0,"+t+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":t?"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L"+t*h+","+t*d+"A"+t+","+t+" 0 "+l+",0 "+t*s+","+t*f+"Z":"M"+i*s+","+i*f+"A"+i+","+i+" 0 "+l+",1 "+i*h+","+i*d+"L0,0"+"Z"}var n=oe,e=ce,r=le,u=se;return t.innerRadius=function(e){return arguments.length?(n=c(e),t):n},t.outerRadius=function(n){return arguments.length?(e=c(n),t):e},t.startAngle=function(n){return arguments.length?(r=c(n),t):r},t.endAngle=function(n){return arguments.length?(u=c(n),t):u},t.centroid=function(){var t=(n.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+Pa;return[Math.cos(i)*t,Math.sin(i)*t]},t};var Pa=-Ri/2,ja=2*Ri-1e-6;d3.svg.line=function(){return fe(a)};var Oa=d3.map({linear:ge,"linear-closed":pe,"step-before":me,"step-after":ve,basis:we,"basis-open":Se,"basis-closed":ke,bundle:Ee,cardinal:be,"cardinal-open":ye,"cardinal-closed":Me,monotone:ze});Oa.forEach(function(t,n){n.key=t,n.closed=/-closed$/.test(t)});var Ya=[0,2/3,1/3,0],Ua=[0,1/3,2/3,0],Ia=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var t=fe(De);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},me.reverse=ve,ve.reverse=me,d3.svg.area=function(){return Le(a)},d3.svg.area.radial=function(){var t=Le(De);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},d3.svg.chord=function(){function e(t,n){var e=r(this,o,t,n),c=r(this,l,t,n);return"M"+e.p0+i(e.r,e.p1,e.a1-e.a0)+(u(e,c)?a(e.r,e.p1,e.r,e.p0):a(e.r,e.p1,c.r,c.p0)+i(c.r,c.p1,c.a1-c.a0)+a(c.r,c.p1,e.r,e.p0))+"Z"}function r(t,n,e,r){var u=n.call(t,e,r),i=s.call(t,u,r),a=f.call(t,u,r)+Pa,o=h.call(t,u,r)+Pa;return{r:i,a0:a,a1:o,p0:[i*Math.cos(a),i*Math.sin(a)],p1:[i*Math.cos(o),i*Math.sin(o)]}}function u(t,n){return t.a0==n.a0&&t.a1==n.a1}function i(t,n,e){return"A"+t+","+t+" 0 "+ +(e>Ri)+",1 "+n}function a(t,n,e,r){return"Q 0,0 "+r}var o=n,l=t,s=Fe,f=le,h=se;return e.radius=function(t){return arguments.length?(s=c(t),e):s},e.source=function(t){return arguments.length?(o=c(t),e):o},e.target=function(t){return arguments.length?(l=c(t),e):l},e.startAngle=function(t){return arguments.length?(f=c(t),e):f},e.endAngle=function(t){return arguments.length?(h=c(t),e):h},e},d3.svg.diagonal=function(){function e(t,n){var e=r.call(this,t,n),a=u.call(this,t,n),o=(e.y+a.y)/2,c=[e,{x:e.x,y:o},{x:a.x,y:o},a];return c=c.map(i),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var r=n,u=t,i=He;return e.source=function(t){return arguments.length?(r=c(t),e):r},e.target=function(t){return arguments.length?(u=c(t),e):u},e.projection=function(t){return arguments.length?(i=t,e):i},e},d3.svg.diagonal.radial=function(){var t=d3.svg.diagonal(),n=He,e=t.projection;return t.projection=function(t){return arguments.length?e(Re(n=t)):n},t},d3.svg.symbol=function(){function t(t,r){return(Va.get(n.call(this,t,r))||Oe)(e.call(this,t,r))}var n=je,e=Pe;return t.type=function(e){return arguments.length?(n=c(e),t):n},t.size=function(n){return arguments.length?(e=c(n),t):e},t};var Va=d3.map({circle:Oe,cross:function(t){var n=Math.sqrt(t/5)/2;return"M"+-3*n+","+-n+"H"+-n+"V"+-3*n+"H"+n+"V"+-n+"H"+3*n+"V"+n+"H"+n+"V"+3*n+"H"+-n+"V"+n+"H"+-3*n+"Z"},diamond:function(t){var n=Math.sqrt(t/(2*Za)),e=n*Za;return"M0,"+-n+"L"+e+",0"+" 0,"+n+" "+-e+",0"+"Z"},square:function(t){var n=Math.sqrt(t)/2;return"M"+-n+","+-n+"L"+n+","+-n+" "+n+","+n+" "+-n+","+n+"Z"},"triangle-down":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+e+"L"+n+","+-e+" "+-n+","+-e+"Z"},"triangle-up":function(t){var n=Math.sqrt(t/Xa),e=n*Xa/2;return"M0,"+-e+"L"+n+","+e+" "+-n+","+e+"Z"}});d3.svg.symbolTypes=Va.keys();var Xa=Math.sqrt(3),Za=Math.tan(30*ji);d3.svg.axis=function(){function t(t){t.each(function(){var t,f=d3.select(this),h=null==l?e.ticks?e.ticks.apply(e,c):e.domain():l,d=null==n?e.tickFormat?e.tickFormat.apply(e,c):String:n,g=Ie(e,h,s),p=f.selectAll(".minor").data(g,String),m=p.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),v=d3.transition(p.exit()).style("opacity",1e-6).remove(),y=d3.transition(p).style("opacity",1),M=f.selectAll("g").data(h,String),b=M.enter().insert("g","path").style("opacity",1e-6),x=d3.transition(M.exit()).style("opacity",1e-6).remove(),_=d3.transition(M).style("opacity",1),w=On(e),S=f.selectAll(".domain").data([0]),k=d3.transition(S),E=e.copy(),A=this.__chart__||E;this.__chart__=E,S.enter().append("path").attr("class","domain"),b.append("line").attr("class","tick"),b.append("text");var N=b.select("line"),T=_.select("line"),q=M.select("text").text(d),C=b.select("text"),z=_.select("text");switch(r){case"bottom":t=Ye,m.attr("y2",i),y.attr("x2",0).attr("y2",i),N.attr("y2",u),C.attr("y",Math.max(u,0)+o),T.attr("x2",0).attr("y2",u),z.attr("x",0).attr("y",Math.max(u,0)+o),q.attr("dy",".71em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+a+"V0H"+w[1]+"V"+a);break;case"top":t=Ye,m.attr("y2",-i),y.attr("x2",0).attr("y2",-i),N.attr("y2",-u),C.attr("y",-(Math.max(u,0)+o)),T.attr("x2",0).attr("y2",-u),z.attr("x",0).attr("y",-(Math.max(u,0)+o)),q.attr("dy","0em").style("text-anchor","middle"),k.attr("d","M"+w[0]+","+-a+"V0H"+w[1]+"V"+-a);break;case"left":t=Ue,m.attr("x2",-i),y.attr("x2",-i).attr("y2",0),N.attr("x2",-u),C.attr("x",-(Math.max(u,0)+o)),T.attr("x2",-u).attr("y2",0),z.attr("x",-(Math.max(u,0)+o)).attr("y",0),q.attr("dy",".32em").style("text-anchor","end"),k.attr("d","M"+-a+","+w[0]+"H0V"+w[1]+"H"+-a);break;case"right":t=Ue,m.attr("x2",i),y.attr("x2",i).attr("y2",0),N.attr("x2",u),C.attr("x",Math.max(u,0)+o),T.attr("x2",u).attr("y2",0),z.attr("x",Math.max(u,0)+o).attr("y",0),q.attr("dy",".32em").style("text-anchor","start"),k.attr("d","M"+a+","+w[0]+"H0V"+w[1]+"H"+a)}if(e.ticks)b.call(t,A),_.call(t,E),x.call(t,E),m.call(t,A),y.call(t,E),v.call(t,E);else{var D=E.rangeBand()/2,L=function(t){return E(t)+D};b.call(t,L),_.call(t,L)}})}var n,e=d3.scale.linear(),r="bottom",u=6,i=6,a=6,o=3,c=[10],l=null,s=0;return t.scale=function(n){return arguments.length?(e=n,t):e},t.orient=function(n){return arguments.length?(r=n,t):r},t.ticks=function(){return arguments.length?(c=arguments,t):c},t.tickValues=function(n){return arguments.length?(l=n,t):l},t.tickFormat=function(e){return arguments.length?(n=e,t):n},t.tickSize=function(n,e){if(!arguments.length)return u;var r=arguments.length-1;return u=+n,i=r>1?+e:u,a=r>0?+arguments[r]:u,t},t.tickPadding=function(n){return arguments.length?(o=+n,t):o},t.tickSubdivide=function(n){return arguments.length?(s=+n,t):s},t},d3.svg.brush=function(){function t(i){i.each(function(){var i,a=d3.select(this),s=a.selectAll(".background").data([0]),f=a.selectAll(".extent").data([0]),h=a.selectAll(".resize").data(l,String);a.style("pointer-events","all").on("mousedown.brush",u).on("touchstart.brush",u),s.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),f.enter().append("rect").attr("class","extent").style("cursor","move"),h.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ba[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),h.style("display",t.empty()?"none":null),h.exit().remove(),o&&(i=On(o),s.attr("x",i[0]).attr("width",i[1]-i[0]),e(a)),c&&(i=On(c),s.attr("y",i[0]).attr("height",i[1]-i[0]),r(a)),n(a)})}function n(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+s[+/e$/.test(t)][0]+","+s[+/^s/.test(t)][1]+")"})}function e(t){t.select(".extent").attr("x",s[0][0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1][0]-s[0][0])}function r(t){t.select(".extent").attr("y",s[0][1]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",s[1][1]-s[0][1])}function u(){function u(){var t=d3.event.changedTouches;return t?d3.touches(v,t)[0]:d3.mouse(v)}function l(){32==d3.event.keyCode&&(S||(p=null,k[0]-=s[1][0],k[1]-=s[1][1],S=2),R())}function f(){32==d3.event.keyCode&&2==S&&(k[0]+=s[1][0],k[1]+=s[1][1],S=0,R())}function h(){var t=u(),i=!1;m&&(t[0]+=m[0],t[1]+=m[1]),S||(d3.event.altKey?(p||(p=[(s[0][0]+s[1][0])/2,(s[0][1]+s[1][1])/2]),k[0]=s[+(t[0]<p[0])][0],k[1]=s[+(t[1]<p[1])][1]):p=null),_&&d(t,o,0)&&(e(b),i=!0),w&&d(t,c,1)&&(r(b),i=!0),i&&(n(b),M({type:"brush",mode:S?"move":"resize"}))}function d(t,n,e){var r,u,a=On(n),o=a[0],c=a[1],l=k[e],f=s[1][e]-s[0][e];return S&&(o-=l,c-=f+l),r=Math.max(o,Math.min(c,t[e])),S?u=(r+=l)+f:(p&&(l=Math.max(o,Math.min(c,2*p[e]-r))),r>l?(u=r,r=l):u=l),s[0][e]!==r||s[1][e]!==u?(i=null,s[0][e]=r,s[1][e]=u,!0):void 0}function g(){h(),b.style("pointer-events","all").selectAll(".resize").style("display",t.empty()?"none":null),d3.select("body").style("cursor",null),E.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),M({type:"brushend"}),R()}var p,m,v=this,y=d3.select(d3.event.target),M=a.of(v,arguments),b=d3.select(v),x=y.datum(),_=!/^(n|s)$/.test(x)&&o,w=!/^(e|w)$/.test(x)&&c,S=y.classed("extent"),k=u(),E=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",g).on("touchmove.brush",h).on("touchend.brush",g).on("keydown.brush",l).on("keyup.brush",f);if(S)k[0]=s[0][0]-k[0],k[1]=s[0][1]-k[1];else if(x){var A=+/w$/.test(x),N=+/^n/.test(x);m=[s[1-A][0]-k[0],s[1-N][1]-k[1]],k[0]=s[A][0],k[1]=s[N][1]}else d3.event.altKey&&(p=k.slice());b.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",y.style("cursor")),M({type:"brushstart"}),h(),R()}var i,a=j(t,"brushstart","brush","brushend"),o=null,c=null,l=$a[0],s=[[0,0],[0,0]];return t.x=function(n){return arguments.length?(o=n,l=$a[!o<<1|!c],t):o},t.y=function(n){return arguments.length?(c=n,l=$a[!o<<1|!c],t):c},t.extent=function(n){var e,r,u,a,l;return arguments.length?(i=[[0,0],[0,0]],o&&(e=n[0],r=n[1],c&&(e=e[0],r=r[0]),i[0][0]=e,i[1][0]=r,o.invert&&(e=o(e),r=o(r)),e>r&&(l=e,e=r,r=l),s[0][0]=0|e,s[1][0]=0|r),c&&(u=n[0],a=n[1],o&&(u=u[1],a=a[1]),i[0][1]=u,i[1][1]=a,c.invert&&(u=c(u),a=c(a)),u>a&&(l=u,u=a,a=l),s[0][1]=0|u,s[1][1]=0|a),t):(n=i||s,o&&(e=n[0][0],r=n[1][0],i||(e=s[0][0],r=s[1][0],o.invert&&(e=o.invert(e),r=o.invert(r)),e>r&&(l=e,e=r,r=l))),c&&(u=n[0][1],a=n[1][1],i||(u=s[0][1],a=s[1][1],c.invert&&(u=c.invert(u),a=c.invert(a)),u>a&&(l=u,u=a,a=l))),o&&c?[[e,u],[r,a]]:o?[e,r]:c&&[u,a])},t.clear=function(){return i=null,s[0][0]=s[0][1]=s[1][0]=s[1][1]=0,t},t.empty=function(){return o&&s[0][0]===s[1][0]||c&&s[0][1]===s[1][1]},d3.rebind(t,a,"on")};var Ba={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},$a=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function t(){this.on("mousedown.drag",n).on("touchstart.drag",n)}function n(){function t(){var t=o.parentNode;return null!=s?d3.touches(t).filter(function(t){return t.identifier===s})[0]:d3.mouse(t)}function n(){if(!o.parentNode)return u();var n=t(),e=n[0]-f[0],r=n[1]-f[1];h|=e|r,f=n,R(),c({type:"drag",x:n[0]+a[0],y:n[1]+a[1],dx:e,dy:r})}function u(){c({type:"dragend"}),h&&(R(),d3.event.target===l&&d.on("click.drag",i,!0)),d.on(null!=s?"touchmove.drag-"+s:"mousemove.drag",null).on(null!=s?"touchend.drag-"+s:"mouseup.drag",null)}function i(){R(),d.on("click.drag",null)}var a,o=this,c=e.of(o,arguments),l=d3.event.target,s=d3.event.touches?d3.event.changedTouches[0].identifier:null,f=t(),h=0,d=d3.select(window).on(null!=s?"touchmove.drag-"+s:"mousemove.drag",n).on(null!=s?"touchend.drag-"+s:"mouseup.drag",u,!0);r?(a=r.apply(o,arguments),a=[a.x-f[0],a.y-f[1]]):a=[0,0],null==s&&R(),c({type:"dragstart"})}var e=j(t,"drag","dragstart","dragend"),r=null;return t.origin=function(n){return arguments.length?(r=n,t):r},d3.rebind(t,e,"on")},d3.behavior.zoom=function(){function t(){this.on("mousedown.zoom",o).on("mousewheel.zoom",c).on("mousemove.zoom",l).on("DOMMouseScroll.zoom",c).on("dblclick.zoom",s).on("touchstart.zoom",f).on("touchmove.zoom",h).on("touchend.zoom",f)}function n(t){return[(t[0]-b[0])/x,(t[1]-b[1])/x]}function e(t){return[t[0]*x+b[0],t[1]*x+b[1]]}function r(t){x=Math.max(_[0],Math.min(_[1],t))}function u(t,n){n=e(n),b[0]+=t[0]-n[0],b[1]+=t[1]-n[1]}function i(){m&&m.domain(p.range().map(function(t){return(t-b[0])/x}).map(p.invert)),y&&y.domain(v.range().map(function(t){return(t-b[1])/x}).map(v.invert))}function a(t){i(),d3.event.preventDefault(),t({type:"zoom",scale:x,translate:b})}function o(){function t(){l=1,u(d3.mouse(i),f),a(o)}function e(){l&&R(),s.on("mousemove.zoom",null).on("mouseup.zoom",null),l&&d3.event.target===c&&s.on("click.zoom",r,!0)}function r(){R(),s.on("click.zoom",null)}var i=this,o=w.of(i,arguments),c=d3.event.target,l=0,s=d3.select(window).on("mousemove.zoom",t).on("mouseup.zoom",e),f=n(d3.mouse(i));window.focus(),R()}function c(){d||(d=n(d3.mouse(this))),r(Math.pow(2,.002*Ve())*x),u(d3.mouse(this),d),a(w.of(this,arguments))}function l(){d=null}function s(){var t=d3.mouse(this),e=n(t),i=Math.log(x)/Math.LN2;r(Math.pow(2,d3.event.shiftKey?Math.ceil(i)-1:Math.floor(i)+1)),u(t,e),a(w.of(this,arguments))}function f(){var t=d3.touches(this),e=Date.now();if(g=x,d={},t.forEach(function(t){d[t.identifier]=n(t)}),R(),1===t.length){if(500>e-M){var i=t[0],o=n(t[0]);r(2*x),u(i,o),a(w.of(this,arguments))}M=e}}function h(){var t=d3.touches(this),n=t[0],e=d[n.identifier];if(i=t[1]){var i,o=d[i.identifier];n=[(n[0]+i[0])/2,(n[1]+i[1])/2],e=[(e[0]+o[0])/2,(e[1]+o[1])/2],r(d3.event.scale*g)}u(n,e),M=null,a(w.of(this,arguments))}var d,g,p,m,v,y,M,b=[0,0],x=1,_=Ga,w=j(t,"zoom");return t.translate=function(n){return arguments.length?(b=n.map(Number),i(),t):b},t.scale=function(n){return arguments.length?(x=+n,i(),t):x},t.scaleExtent=function(n){return arguments.length?(_=null==n?Ga:n.map(Number),t):_},t.x=function(n){return arguments.length?(m=n,p=n.copy(),b=[0,0],x=1,t):m},t.y=function(n){return arguments.length?(y=n,v=n.copy(),b=[0,0],x=1,t):y},d3.rebind(t,w,"on")};var Ja,Ga=[0,1/0];d3.layout={},d3.layout.bundle=function(){return function(t){for(var n=[],e=-1,r=t.length;r>++e;)n.push(Xe(t[e]));return n}},d3.layout.chord=function(){function t(){var t,l,f,h,d,g={},p=[],m=d3.range(i),v=[];for(e=[],r=[],t=0,h=-1;i>++h;){for(l=0,d=-1;i>++d;)l+=u[h][d];p.push(l),v.push(d3.range(i)),t+=l}for(a&&m.sort(function(t,n){return a(p[t],p[n]) -}),o&&v.forEach(function(t,n){t.sort(function(t,e){return o(u[n][t],u[n][e])})}),t=(2*Ri-s*i)/t,l=0,h=-1;i>++h;){for(f=l,d=-1;i>++d;){var y=m[h],M=v[y][d],b=u[y][M],x=l,_=l+=b*t;g[y+"-"+M]={index:y,subindex:M,startAngle:x,endAngle:_,value:b}}r[y]={index:y,startAngle:f,endAngle:l,value:(l-f)/t},l+=s}for(h=-1;i>++h;)for(d=h-1;i>++d;){var w=g[h+"-"+d],S=g[d+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&n()}function n(){e.sort(function(t,n){return c((t.source.value+t.target.value)/2,(n.source.value+n.target.value)/2)})}var e,r,u,i,a,o,c,l={},s=0;return l.matrix=function(t){return arguments.length?(i=(u=t)&&u.length,e=r=null,l):u},l.padding=function(t){return arguments.length?(s=t,e=r=null,l):s},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(c=t,e&&n(),l):c},l.chords=function(){return e||t(),e},l.groups=function(){return r||t(),r},l},d3.layout.force=function(){function t(t){return function(n,e,r,u){if(n.point!==t){var i=n.cx-t.x,a=n.cy-t.y,o=1/Math.sqrt(i*i+a*a);if(v>(u-e)*o){var c=n.charge*o*o;return t.px-=i*c,t.py-=a*c,!0}if(n.point&&isFinite(o)){var c=n.pointCharge*o*o;t.px-=i*c,t.py-=a*c}}return!n.charge}}function n(t){t.px=d3.event.x,t.py=d3.event.y,l.resume()}var e,r,u,i,o,l={},s=d3.dispatch("start","tick","end"),f=[1,1],h=.9,d=Qe,g=tr,p=-30,m=.1,v=.8,y=[],M=[];return l.tick=function(){if(.005>(r*=.99))return s.end({type:"end",alpha:r=0}),!0;var n,e,a,c,l,d,g,v,b,x=y.length,_=M.length;for(e=0;_>e;++e)a=M[e],c=a.source,l=a.target,v=l.x-c.x,b=l.y-c.y,(d=v*v+b*b)&&(d=r*i[e]*((d=Math.sqrt(d))-u[e])/d,v*=d,b*=d,l.x-=v*(g=c.weight/(l.weight+c.weight)),l.y-=b*g,c.x+=v*(g=1-g),c.y+=b*g);if((g=r*m)&&(v=f[0]/2,b=f[1]/2,e=-1,g))for(;x>++e;)a=y[e],a.x+=(v-a.x)*g,a.y+=(b-a.y)*g;if(p)for(We(n=d3.geom.quadtree(y),r,o),e=-1;x>++e;)(a=y[e]).fixed||n.visit(t(a));for(e=-1;x>++e;)a=y[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*h,a.y-=(a.py-(a.py=a.y))*h);s.tick({type:"tick",alpha:r})},l.nodes=function(t){return arguments.length?(y=t,l):y},l.links=function(t){return arguments.length?(M=t,l):M},l.size=function(t){return arguments.length?(f=t,l):f},l.linkDistance=function(t){return arguments.length?(d=c(t),l):d},l.distance=l.linkDistance,l.linkStrength=function(t){return arguments.length?(g=c(t),l):g},l.friction=function(t){return arguments.length?(h=t,l):h},l.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,l):p},l.gravity=function(t){return arguments.length?(m=t,l):m},l.theta=function(t){return arguments.length?(v=t,l):v},l.alpha=function(t){return arguments.length?(r?r=t>0?t:0:t>0&&(s.start({type:"start",alpha:r=t}),d3.timer(l.tick)),l):r},l.start=function(){function t(t,r){for(var u,i=n(e),a=-1,o=i.length;o>++a;)if(!isNaN(u=i[a][t]))return u;return Math.random()*r}function n(){if(!a){for(a=[],r=0;s>r;++r)a[r]=[];for(r=0;h>r;++r){var t=M[r];a[t.source.index].push(t.target),a[t.target.index].push(t.source)}}return a[e]}var e,r,a,c,s=y.length,h=M.length,m=f[0],v=f[1];for(e=0;s>e;++e)(c=y[e]).index=e,c.weight=0;for(u=[],i=[],e=0;h>e;++e)c=M[e],"number"==typeof c.source&&(c.source=y[c.source]),"number"==typeof c.target&&(c.target=y[c.target]),u[e]=d.call(this,c,e),i[e]=g.call(this,c,e),++c.source.weight,++c.target.weight;for(e=0;s>e;++e)c=y[e],isNaN(c.x)&&(c.x=t("x",m)),isNaN(c.y)&&(c.y=t("y",v)),isNaN(c.px)&&(c.px=c.x),isNaN(c.py)&&(c.py=c.y);if(o=[],"function"==typeof p)for(e=0;s>e;++e)o[e]=+p.call(this,y[e],e);else for(e=0;s>e;++e)o[e]=p;return l.resume()},l.resume=function(){return l.alpha(.1)},l.stop=function(){return l.alpha(0)},l.drag=function(){e||(e=d3.behavior.drag().origin(a).on("dragstart",$e).on("drag",n).on("dragend",Je)),this.on("mouseover.force",Ge).on("mouseout.force",Ke).call(e)},d3.rebind(l,s,"on")},d3.layout.partition=function(){function t(n,e,r,u){var i=n.children;if(n.x=e,n.y=n.depth*u,n.dx=r,n.dy=u,i&&(a=i.length)){var a,o,c,l=-1;for(r=n.value?r/n.value:0;a>++l;)t(o=i[l],e,c=o.value*r,u),e+=c}}function n(t){var e=t.children,r=0;if(e&&(u=e.length))for(var u,i=-1;u>++i;)r=Math.max(r,n(e[i]));return 1+r}function e(e,i){var a=r.call(this,e,i);return t(a[0],0,u[0],u[1]/n(a[0])),a}var r=d3.layout.hierarchy(),u=[1,1];return e.size=function(t){return arguments.length?(u=t,e):u},hr(e,r)},d3.layout.pie=function(){function t(i){var a=i.map(function(e,r){return+n.call(t,e,r)}),o=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-r)/d3.sum(a),l=d3.range(i.length);null!=e&&l.sort(e===Ka?function(t,n){return a[n]-a[t]}:function(t,n){return e(i[t],i[n])});var s=[];return l.forEach(function(t){var n;s[t]={data:i[t],value:n=a[t],startAngle:o,endAngle:o+=n*c}}),s}var n=Number,e=Ka,r=0,u=2*Ri;return t.value=function(e){return arguments.length?(n=e,t):n},t.sort=function(n){return arguments.length?(e=n,t):e},t.startAngle=function(n){return arguments.length?(r=n,t):r},t.endAngle=function(n){return arguments.length?(u=n,t):u},t};var Ka={};d3.layout.stack=function(){function t(a,c){var l=a.map(function(e,r){return n.call(t,e,r)}),s=l.map(function(n){return n.map(function(n,e){return[i.call(t,n,e),o.call(t,n,e)]})}),f=e.call(t,s,c);l=d3.permute(l,f),s=d3.permute(s,f);var h,d,g,p=r.call(t,s,c),m=l.length,v=l[0].length;for(d=0;v>d;++d)for(u.call(t,l[0][d],g=p[d],s[0][d][1]),h=1;m>h;++h)u.call(t,l[h][d],g+=s[h-1][d][1],s[h][d][1]);return a}var n=a,e=ur,r=ir,u=rr,i=nr,o=er;return t.values=function(e){return arguments.length?(n=e,t):n},t.order=function(n){return arguments.length?(e="function"==typeof n?n:Wa.get(n)||ur,t):e},t.offset=function(n){return arguments.length?(r="function"==typeof n?n:Qa.get(n)||ir,t):r},t.x=function(n){return arguments.length?(i=n,t):i},t.y=function(n){return arguments.length?(o=n,t):o},t.out=function(n){return arguments.length?(u=n,t):u},t};var Wa=d3.map({"inside-out":function(t){var n,e,r=t.length,u=t.map(ar),i=t.map(or),a=d3.range(r).sort(function(t,n){return u[t]-u[n]}),o=0,c=0,l=[],s=[];for(n=0;r>n;++n)e=a[n],c>o?(o+=i[e],l.push(e)):(c+=i[e],s.push(e));return s.reverse().concat(l)},reverse:function(t){return d3.range(t.length).reverse()},"default":ur}),Qa=d3.map({silhouette:function(t){var n,e,r,u=t.length,i=t[0].length,a=[],o=0,c=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];r>o&&(o=r),a.push(r)}for(e=0;i>e;++e)c[e]=(o-a[e])/2;return c},wiggle:function(t){var n,e,r,u,i,a,o,c,l,s=t.length,f=t[0],h=f.length,d=[];for(d[0]=c=l=0,e=1;h>e;++e){for(n=0,u=0;s>n;++n)u+=t[n][e][1];for(n=0,i=0,o=f[e][0]-f[e-1][0];s>n;++n){for(r=0,a=(t[n][e][1]-t[n][e-1][1])/(2*o);n>r;++r)a+=(t[r][e][1]-t[r][e-1][1])/o;i+=a*t[n][e][1]}d[e]=c-=u?i/u*o:0,l>c&&(l=c)}for(e=0;h>e;++e)d[e]-=l;return d},expand:function(t){var n,e,r,u=t.length,i=t[0].length,a=1/u,o=[];for(e=0;i>e;++e){for(n=0,r=0;u>n;n++)r+=t[n][e][1];if(r)for(n=0;u>n;n++)t[n][e][1]/=r;else for(n=0;u>n;n++)t[n][e][1]=a}for(e=0;i>e;++e)o[e]=0;return o},zero:ir});d3.layout.histogram=function(){function t(t,i){for(var a,o,c=[],l=t.map(e,this),s=r.call(this,l,i),f=u.call(this,s,l,i),i=-1,h=l.length,d=f.length-1,g=n?1:1/h;d>++i;)a=c[i]=[],a.dx=f[i+1]-(a.x=f[i]),a.y=0;if(d>0)for(i=-1;h>++i;)o=l[i],o>=s[0]&&s[1]>=o&&(a=c[d3.bisect(f,o,1,d)-1],a.y+=g,a.push(t[i]));return c}var n=!0,e=Number,r=fr,u=lr;return t.value=function(n){return arguments.length?(e=n,t):e},t.range=function(n){return arguments.length?(r=c(n),t):r},t.bins=function(n){return arguments.length?(u="number"==typeof n?function(t){return sr(t,n)}:c(n),t):u},t.frequency=function(e){return arguments.length?(n=!!e,t):n},t},d3.layout.hierarchy=function(){function t(n,a,o){var c=u.call(e,n,a);if(n.depth=a,o.push(n),c&&(l=c.length)){for(var l,s,f=-1,h=n.children=[],d=0,g=a+1;l>++f;)s=t(c[f],g,o),s.parent=n,h.push(s),d+=s.value;r&&h.sort(r),i&&(n.value=d)}else i&&(n.value=+i.call(e,n,a)||0);return n}function n(t,r){var u=t.children,a=0;if(u&&(o=u.length))for(var o,c=-1,l=r+1;o>++c;)a+=n(u[c],l);else i&&(a=+i.call(e,t,r)||0);return i&&(t.value=a),a}function e(n){var e=[];return t(n,0,e),e}var r=pr,u=dr,i=gr;return e.sort=function(t){return arguments.length?(r=t,e):r},e.children=function(t){return arguments.length?(u=t,e):u},e.value=function(t){return arguments.length?(i=t,e):i},e.revalue=function(t){return n(t,0),t},e},d3.layout.pack=function(){function t(t,u){var i=n.call(this,t,u),a=i[0];a.x=0,a.y=0,Rr(a,function(t){t.r=Math.sqrt(t.value)}),Rr(a,xr);var o=r[0],c=r[1],l=Math.max(2*a.r/o,2*a.r/c);if(e>0){var s=e*l/2;Rr(a,function(t){t.r+=s}),Rr(a,xr),Rr(a,function(t){t.r-=s}),l=Math.max(2*a.r/o,2*a.r/c)}return Sr(a,o/2,c/2,1/l),i}var n=d3.layout.hierarchy().sort(vr),e=0,r=[1,1];return t.size=function(n){return arguments.length?(r=n,t):r},t.padding=function(n){return arguments.length?(e=+n,t):e},hr(t,n)},d3.layout.cluster=function(){function t(t,u){var i,a=n.call(this,t,u),o=a[0],c=0;Rr(o,function(t){var n=t.children;n&&n.length?(t.x=Ar(n),t.y=Er(n)):(t.x=i?c+=e(t,i):0,t.y=0,i=t)});var l=Nr(o),s=Tr(o),f=l.x-e(l,s)/2,h=s.x+e(s,l)/2;return Rr(o,function(t){t.x=(t.x-f)/(h-f)*r[0],t.y=(1-(o.y?t.y/o.y:1))*r[1]}),a}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.tree=function(){function t(t,u){function i(t,n){var r=t.children,u=t._tree;if(r&&(a=r.length)){for(var a,c,l,s=r[0],f=s,h=-1;a>++h;)l=r[h],i(l,c),f=o(l,c,f),c=l;Pr(t);var d=.5*(s._tree.prelim+l._tree.prelim);n?(u.prelim=n._tree.prelim+e(t,n),u.mod=u.prelim-d):u.prelim=d}else n&&(u.prelim=n._tree.prelim+e(t,n))}function a(t,n){t.x=t._tree.prelim+n;var e=t.children;if(e&&(r=e.length)){var r,u=-1;for(n+=t._tree.mod;r>++u;)a(e[u],n)}}function o(t,n,r){if(n){for(var u,i=t,a=t,o=n,c=t.parent.children[0],l=i._tree.mod,s=a._tree.mod,f=o._tree.mod,h=c._tree.mod;o=zr(o),i=Cr(i),o&&i;)c=Cr(c),a=zr(a),a._tree.ancestor=t,u=o._tree.prelim+f-i._tree.prelim-l+e(o,i),u>0&&(jr(Or(o,t,r),t,u),l+=u,s+=u),f+=o._tree.mod,l+=i._tree.mod,h+=c._tree.mod,s+=a._tree.mod;o&&!zr(a)&&(a._tree.thread=o,a._tree.mod+=f-s),i&&!Cr(c)&&(c._tree.thread=i,c._tree.mod+=l-h,r=t)}return r}var c=n.call(this,t,u),l=c[0];Rr(l,function(t,n){t._tree={ancestor:t,prelim:0,mod:0,change:0,shift:0,number:n?n._tree.number+1:0}}),i(l),a(l,-l._tree.prelim);var s=Dr(l,Fr),f=Dr(l,Lr),h=Dr(l,Hr),d=s.x-e(s,f)/2,g=f.x+e(f,s)/2,p=h.depth||1;return Rr(l,function(t){t.x=(t.x-d)/(g-d)*r[0],t.y=t.depth/p*r[1],delete t._tree}),c}var n=d3.layout.hierarchy().sort(null).value(null),e=qr,r=[1,1];return t.separation=function(n){return arguments.length?(e=n,t):e},t.size=function(n){return arguments.length?(r=n,t):r},hr(t,n)},d3.layout.treemap=function(){function t(t,n){for(var e,r,u=-1,i=t.length;i>++u;)r=(e=t[u]).value*(0>n?0:n),e.area=isNaN(r)||0>=r?0:r}function n(e){var i=e.children;if(i&&i.length){var a,o,c,l=f(e),s=[],h=i.slice(),g=1/0,p="slice"===d?l.dx:"dice"===d?l.dy:"slice-dice"===d?1&e.depth?l.dy:l.dx:Math.min(l.dx,l.dy);for(t(h,l.dx*l.dy/e.value),s.area=0;(c=h.length)>0;)s.push(a=h[c-1]),s.area+=a.area,"squarify"!==d||g>=(o=r(s,p))?(h.pop(),g=o):(s.area-=s.pop().area,u(s,p,l,!1),p=Math.min(l.dx,l.dy),s.length=s.area=0,g=1/0);s.length&&(u(s,p,l,!0),s.length=s.area=0),i.forEach(n)}}function e(n){var r=n.children;if(r&&r.length){var i,a=f(n),o=r.slice(),c=[];for(t(o,a.dx*a.dy/n.value),c.area=0;i=o.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?a.dx:a.dy,a,!o.length),c.length=c.area=0);r.forEach(e)}}function r(t,n){for(var e,r=t.area,u=0,i=1/0,a=-1,o=t.length;o>++a;)(e=t[a].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,n*=n,r?Math.max(n*u*g/r,r/(n*i*g)):1/0}function u(t,n,e,r){var u,i=-1,a=t.length,o=e.x,l=e.y,s=n?c(t.area/n):0;if(n==e.dx){for((r||s>e.dy)&&(s=e.dy);a>++i;)u=t[i],u.x=o,u.y=l,u.dy=s,o+=u.dx=Math.min(e.x+e.dx-o,s?c(u.area/s):0);u.z=!0,u.dx+=e.x+e.dx-o,e.y+=s,e.dy-=s}else{for((r||s>e.dx)&&(s=e.dx);a>++i;)u=t[i],u.x=o,u.y=l,u.dx=s,l+=u.dy=Math.min(e.y+e.dy-l,s?c(u.area/s):0);u.z=!1,u.dy+=e.y+e.dy-l,e.x+=s,e.dx-=s}}function i(r){var u=a||o(r),i=u[0];return i.x=0,i.y=0,i.dx=l[0],i.dy=l[1],a&&o.revalue(i),t([i],i.dx*i.dy/i.value),(a?e:n)(i),h&&(a=u),u}var a,o=d3.layout.hierarchy(),c=Math.round,l=[1,1],s=null,f=Yr,h=!1,d="squarify",g=.5*(1+Math.sqrt(5));return i.size=function(t){return arguments.length?(l=t,i):l},i.padding=function(t){function n(n){var e=t.call(i,n,n.depth);return null==e?Yr(n):Ur(n,"number"==typeof e?[e,e,e,e]:e)}function e(n){return Ur(n,t)}if(!arguments.length)return s;var r;return f=null==(s=t)?Yr:"function"==(r=typeof t)?n:"number"===r?(t=[t,t,t,t],e):e,i},i.round=function(t){return arguments.length?(c=t?Math.round:Number,i):c!=Number},i.sticky=function(t){return arguments.length?(h=t,a=null,i):h},i.ratio=function(t){return arguments.length?(g=t,i):g},i.mode=function(t){return arguments.length?(d=t+"",i):d},hr(i,o)},d3.csv=Ir(",","text/csv"),d3.tsv=Ir(" ","text/tab-separated-values"),d3.geo={},d3.geo.stream=function(t,n){to.hasOwnProperty(t.type)?to[t.type](t,n):Vr(t,n)};var to={Feature:function(t,n){Vr(t.geometry,n)},FeatureCollection:function(t,n){for(var e=t.features,r=-1,u=e.length;u>++r;)Vr(e[r].geometry,n)}},no={Sphere:function(t,n){n.sphere()},Point:function(t,n){var e=t.coordinates;n.point(e[0],e[1])},MultiPoint:function(t,n){for(var e,r=t.coordinates,u=-1,i=r.length;i>++u;)e=r[u],n.point(e[0],e[1])},LineString:function(t,n){Xr(t.coordinates,n,0)},MultiLineString:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Xr(e[r],n,0)},Polygon:function(t,n){Zr(t.coordinates,n)},MultiPolygon:function(t,n){for(var e=t.coordinates,r=-1,u=e.length;u>++r;)Zr(e[r],n)},GeometryCollection:function(t,n){for(var e=t.geometries,r=-1,u=e.length;u>++r;)Vr(e[r],n)}};d3.geo.albersUsa=function(){function t(t){return n(t)(t)}function n(t){var n=t[0],a=t[1];return a>50?r:-140>n?u:21>a?i:e}var e=d3.geo.albers(),r=d3.geo.albers().rotate([160,0]).center([0,60]).parallels([55,65]),u=d3.geo.albers().rotate([160,0]).center([0,20]).parallels([8,18]),i=d3.geo.albers().rotate([60,0]).center([0,10]).parallels([8,18]);return t.scale=function(n){return arguments.length?(e.scale(n),r.scale(.6*n),u.scale(n),i.scale(1.5*n),t.translate(e.translate())):e.scale()},t.translate=function(n){if(!arguments.length)return e.translate();var a=e.scale(),o=n[0],c=n[1];return e.translate(n),r.translate([o-.4*a,c+.17*a]),u.translate([o-.19*a,c+.2*a]),i.translate([o+.58*a,c+.43*a]),t},t.scale(e.scale())},(d3.geo.albers=function(){var t=29.5*ji,n=45.5*ji,e=Pu(eu),r=e(t,n);return r.parallels=function(r){return arguments.length?e(t=r[0]*ji,n=r[1]*ji):[t*Oi,n*Oi]},r.rotate([98,0]).center([0,38]).scale(1e3)}).raw=eu;var eo=Vu(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(d3.geo.azimuthalEqualArea=function(){return Ru(eo)}).raw=eo;var ro=Vu(function(t){var n=Math.acos(t);return n&&n/Math.sin(n)},a);(d3.geo.azimuthalEquidistant=function(){return Ru(ro)}).raw=ro,d3.geo.bounds=ru(a),d3.geo.centroid=function(t){uo=io=ao=oo=co=0,d3.geo.stream(t,lo);var n;return io&&Math.abs(n=Math.sqrt(ao*ao+oo*oo+co*co))>Pi?[Math.atan2(oo,ao)*Oi,Math.asin(Math.max(-1,Math.min(1,co/n)))*Oi]:void 0};var uo,io,ao,oo,co,lo={sphere:function(){2>uo&&(uo=2,io=ao=oo=co=0)},point:uu,lineStart:au,lineEnd:ou,polygonStart:function(){2>uo&&(uo=2,io=ao=oo=co=0),lo.lineStart=iu},polygonEnd:function(){lo.lineStart=au}};d3.geo.circle=function(){function t(){var t="function"==typeof r?r.apply(this,arguments):r,n=Ou(-t[0]*ji,-t[1]*ji,0).invert,u=[];return e(null,null,1,{point:function(t,e){u.push(t=n(t,e)),t[0]*=Oi,t[1]*=Oi}}),{type:"Polygon",coordinates:[u]}}var n,e,r=[0,0],u=6;return t.origin=function(n){return arguments.length?(r=n,t):r},t.angle=function(r){return arguments.length?(e=cu((n=+r)*ji,u*ji),t):n},t.precision=function(r){return arguments.length?(e=cu(n*ji,(u=+r)*ji),t):u},t.angle(90)};var so=su(o,vu,Mu);(d3.geo.equirectangular=function(){return Ru(_u).scale(250/Ri)}).raw=_u.invert=_u;var fo=Vu(function(t){return 1/t},Math.atan);(d3.geo.gnomonic=function(){return Ru(fo)}).raw=fo,d3.geo.graticule=function(){function t(){return{type:"MultiLineString",coordinates:n()}}function n(){return d3.range(Math.ceil(r/c)*c,e,c).map(a).concat(d3.range(Math.ceil(i/l)*l,u,l).map(o))}var e,r,u,i,a,o,c=22.5,l=c,s=2.5;return t.lines=function(){return n().map(function(t){return{type:"LineString",coordinates:t}})},t.outline=function(){return{type:"Polygon",coordinates:[a(r).concat(o(u).slice(1),a(e).reverse().slice(1),o(i).reverse().slice(1))]}},t.extent=function(n){return arguments.length?(r=+n[0][0],e=+n[1][0],i=+n[0][1],u=+n[1][1],r>e&&(n=r,r=e,e=n),i>u&&(n=i,i=u,u=n),t.precision(s)):[[r,i],[e,u]]},t.step=function(n){return arguments.length?(c=+n[0],l=+n[1],t):[c,l]},t.precision=function(n){return arguments.length?(s=+n,a=wu(i,u,s),o=Su(r,e,s),t):s},t.extent([[-180+Pi,-90+Pi],[180-Pi,90-Pi]])},d3.geo.interpolate=function(t,n){return ku(t[0]*ji,t[1]*ji,n[0]*ji,n[1]*ji)},d3.geo.greatArc=function(){function e(){for(var t=r||a.apply(this,arguments),n=u||o.apply(this,arguments),e=i||d3.geo.interpolate(t,n),u=0,l=c/e.distance,s=[t];1>(u+=l);)s.push(e(u));return s.push(n),{type:"LineString",coordinates:s}}var r,u,i,a=n,o=t,c=6*ji;return e.distance=function(){return(i||d3.geo.interpolate(r||a.apply(this,arguments),u||o.apply(this,arguments))).distance},e.source=function(t){return arguments.length?(a=t,r="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):a},e.target=function(t){return arguments.length?(o=t,u="function"==typeof t?null:t,i=r&&u?d3.geo.interpolate(r,u):null,e):o},e.precision=function(t){return arguments.length?(c=t*ji,e):c/ji},e},Eu.invert=function(t,n){return[2*Ri*t,2*Math.atan(Math.exp(2*Ri*n))-Ri/2]},(d3.geo.mercator=function(){return Ru(Eu).scale(500)}).raw=Eu;var ho=Vu(function(){return 1},Math.asin);(d3.geo.orthographic=function(){return Ru(ho)}).raw=ho,d3.geo.path=function(){function t(t){return t&&d3.geo.stream(t,r(u.pointRadius("function"==typeof i?+i.apply(this,arguments):i))),u.result()}var n,e,r,u,i=4.5;return t.area=function(t){return go=0,d3.geo.stream(t,r(mo)),go},t.centroid=function(t){return uo=ao=oo=co=0,d3.geo.stream(t,r(vo)),co?[ao/co,oo/co]:void 0},t.bounds=function(t){return ru(r)(t)},t.projection=function(e){return arguments.length?(r=(n=e)?e.stream||Nu(e):a,t):n},t.context=function(n){return arguments.length?(u=null==(e=n)?new Tu:new qu(n),t):e},t.pointRadius=function(n){return arguments.length?(i="function"==typeof n?n:+n,t):i},t.projection(d3.geo.albersUsa()).context(null)};var go,po,mo={point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){po=0,mo.lineStart=Cu},polygonEnd:function(){mo.lineStart=mo.lineEnd=mo.point=Pn,go+=Math.abs(po/2)}},vo={point:zu,lineStart:Du,lineEnd:Lu,polygonStart:function(){vo.lineStart=Fu},polygonEnd:function(){vo.point=zu,vo.lineStart=Du,vo.lineEnd=Lu}};d3.geo.area=function(t){return yo=0,d3.geo.stream(t,bo),yo};var yo,Mo,bo={sphere:function(){yo+=4*Ri},point:Pn,lineStart:Pn,lineEnd:Pn,polygonStart:function(){Mo=0,bo.lineStart=Hu},polygonEnd:function(){yo+=0>Mo?4*Ri+Mo:Mo,bo.lineStart=bo.lineEnd=bo.point=Pn}};d3.geo.projection=Ru,d3.geo.projectionMutator=Pu;var xo=Vu(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});(d3.geo.stereographic=function(){return Ru(xo)}).raw=xo,d3.geom={},d3.geom.hull=function(t){if(3>t.length)return[];var n,e,r,u,i,a,o,c,l,s,f=t.length,h=f-1,d=[],g=[],p=0;for(n=1;f>n;++n)t[n][1]<t[p][1]?p=n:t[n][1]==t[p][1]&&(p=t[n][0]<t[p][0]?n:p);for(n=0;f>n;++n)n!==p&&(u=t[n][1]-t[p][1],r=t[n][0]-t[p][0],d.push({angle:Math.atan2(u,r),index:n}));for(d.sort(function(t,n){return t.angle-n.angle}),l=d[0].angle,c=d[0].index,o=0,n=1;h>n;++n)e=d[n].index,l==d[n].angle?(r=t[c][0]-t[p][0],u=t[c][1]-t[p][1],i=t[e][0]-t[p][0],a=t[e][1]-t[p][1],r*r+u*u>=i*i+a*a?d[n].index=-1:(d[o].index=-1,l=d[n].angle,o=n,c=e)):(l=d[n].angle,o=n,c=e);for(g.push(p),n=0,e=0;2>n;++e)-1!==d[e].index&&(g.push(d[e].index),n++);for(s=g.length;h>e;++e)if(-1!==d[e].index){for(;!Xu(g[s-2],g[s-1],d[e].index,t);)--s;g[s++]=d[e].index}var m=[];for(n=0;s>n;++n)m.push(t[g[n]]);return m},d3.geom.polygon=function(t){return t.area=function(){for(var n=0,e=t.length,r=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];e>++n;)r+=t[n-1][1]*t[n][0]-t[n-1][0]*t[n][1];return.5*r},t.centroid=function(n){var e,r,u=-1,i=t.length,a=0,o=0,c=t[i-1];for(arguments.length||(n=-1/(6*t.area()));i>++u;)e=c,c=t[u],r=e[0]*c[1]-c[0]*e[1],a+=(e[0]+c[0])*r,o+=(e[1]+c[1])*r;return[a*n,o*n]},t.clip=function(n){for(var e,r,u,i,a,o,c=-1,l=t.length,s=t[l-1];l>++c;){for(e=n.slice(),n.length=0,i=t[c],a=e[(u=e.length)-1],r=-1;u>++r;)o=e[r],Zu(o,s,i)?(Zu(a,s,i)||n.push(Bu(a,o,s,i)),n.push(o)):Zu(a,s,i)&&n.push(Bu(a,o,s,i)),a=o;s=i}return n},t},d3.geom.voronoi=function(t){var n=t.map(function(){return[]}),e=1e6;return $u(t,function(t){var r,u,i,a,o,c;1===t.a&&t.b>=0?(r=t.ep.r,u=t.ep.l):(r=t.ep.l,u=t.ep.r),1===t.a?(o=r?r.y:-e,i=t.c-t.b*o,c=u?u.y:e,a=t.c-t.b*c):(i=r?r.x:-e,o=t.c-t.a*i,a=u?u.x:e,c=t.c-t.a*a);var l=[i,o],s=[a,c];n[t.region.l.index].push(l,s),n[t.region.r.index].push(l,s)}),n=n.map(function(n,e){var r=t[e][0],u=t[e][1],i=n.map(function(t){return Math.atan2(t[0]-r,t[1]-u)});return d3.range(n.length).sort(function(t,n){return i[t]-i[n]}).filter(function(t,n,e){return!n||i[t]-i[e[n-1]]>Pi}).map(function(t){return n[t]})}),n.forEach(function(n,r){var u=n.length;if(!u)return n.push([-e,-e],[-e,e],[e,e],[e,-e]);if(!(u>2)){var i=t[r],a=n[0],o=n[1],c=i[0],l=i[1],s=a[0],f=a[1],h=o[0],d=o[1],g=Math.abs(h-s),p=d-f;if(Pi>Math.abs(p)){var m=f>l?-e:e;n.push([-e,m],[e,m])}else if(Pi>g){var v=s>c?-e:e;n.push([v,-e],[v,e])}else{var m=(s-c)*(d-f)>(h-s)*(f-l)?e:-e,y=Math.abs(p)-g;Pi>Math.abs(y)?n.push([0>p?m:-m,m]):(y>0&&(m*=-1),n.push([-e,m],[e,m]))}}}),n};var _o={l:"r",r:"l"};d3.geom.delaunay=function(t){var n=t.map(function(){return[]}),e=[];return $u(t,function(e){n[e.region.l.index].push(t[e.region.r.index])}),n.forEach(function(n,r){var u=t[r],i=u[0],a=u[1];n.forEach(function(t){t.angle=Math.atan2(t[0]-i,t[1]-a)}),n.sort(function(t,n){return t.angle-n.angle});for(var o=0,c=n.length-1;c>o;o++)e.push([u,n[o],n[o+1]])}),e},d3.geom.quadtree=function(t,n,e,r,u){function i(t,n,e,r,u,i){if(!isNaN(n.x)&&!isNaN(n.y))if(t.leaf){var o=t.point;o?.01>Math.abs(o.x-n.x)+Math.abs(o.y-n.y)?a(t,n,e,r,u,i):(t.point=null,a(t,o,e,r,u,i),a(t,n,e,r,u,i)):t.point=n}else a(t,n,e,r,u,i)}function a(t,n,e,r,u,a){var o=.5*(e+u),c=.5*(r+a),l=n.x>=o,s=n.y>=c,f=(s<<1)+l;t.leaf=!1,t=t.nodes[f]||(t.nodes[f]=Ju()),l?e=o:u=o,s?r=c:a=c,i(t,n,e,r,u,a)}var o,c=-1,l=t.length;if(5>arguments.length)if(3===arguments.length)u=e,r=n,e=n=0;else for(n=e=1/0,r=u=-1/0;l>++c;)o=t[c],n>o.x&&(n=o.x),e>o.y&&(e=o.y),o.x>r&&(r=o.x),o.y>u&&(u=o.y);var s=r-n,f=u-e;s>f?u=e+s:r=n+f;var h=Ju();return h.add=function(t){i(h,t,n,e,r,u)},h.visit=function(t){Gu(t,h,n,e,r,u)},t.forEach(h.add),h},d3.time={};var wo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];Ku.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){ko.setUTCDate.apply(this._,arguments)},setDay:function(){ko.setUTCDay.apply(this._,arguments)},setFullYear:function(){ko.setUTCFullYear.apply(this._,arguments)},setHours:function(){ko.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){ko.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){ko.setUTCMinutes.apply(this._,arguments)},setMonth:function(){ko.setUTCMonth.apply(this._,arguments)},setSeconds:function(){ko.setUTCSeconds.apply(this._,arguments)},setTime:function(){ko.setTime.apply(this._,arguments)}};var ko=Date.prototype,Eo="%a %b %e %X %Y",Ao="%m/%d/%Y",No="%H:%M:%S",To=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],qo=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Co=["January","February","March","April","May","June","July","August","September","October","November","December"],zo=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];d3.time.format=function(t){function n(n){for(var r,u,i,a=[],o=-1,c=0;e>++o;)37===t.charCodeAt(o)&&(a.push(t.substring(c,o)),null!=(u=jo[r=t.charAt(++o)])&&(r=t.charAt(++o)),(i=Oo[r])&&(r=i(n,null==u?"e"===r?" ":"0":u)),a.push(r),c=o+1);return a.push(t.substring(c,o)),a.join("")}var e=t.length;return n.parse=function(n){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=Wu(e,t,n,0);if(r!=n.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=new wo;return u.setFullYear(e.y,e.m,e.d),u.setHours(e.H,e.M,e.S,e.L),u},n.toString=function(){return t},n};var Do=Qu(To),Lo=Qu(qo),Fo=Qu(Co),Ho=ti(Co),Ro=Qu(zo),Po=ti(zo),jo={"-":"",_:" ",0:"0"},Oo={a:function(t){return qo[t.getDay()]},A:function(t){return To[t.getDay()]},b:function(t){return zo[t.getMonth()]},B:function(t){return Co[t.getMonth()]},c:d3.time.format(Eo),d:function(t,n){return ni(t.getDate(),n,2)},e:function(t,n){return ni(t.getDate(),n,2)},H:function(t,n){return ni(t.getHours(),n,2)},I:function(t,n){return ni(t.getHours()%12||12,n,2)},j:function(t,n){return ni(1+d3.time.dayOfYear(t),n,3)},L:function(t,n){return ni(t.getMilliseconds(),n,3)},m:function(t,n){return ni(t.getMonth()+1,n,2)},M:function(t,n){return ni(t.getMinutes(),n,2)},p:function(t){return t.getHours()>=12?"PM":"AM"},S:function(t,n){return ni(t.getSeconds(),n,2)},U:function(t,n){return ni(d3.time.sundayOfYear(t),n,2)},w:function(t){return t.getDay()},W:function(t,n){return ni(d3.time.mondayOfYear(t),n,2)},x:d3.time.format(Ao),X:d3.time.format(No),y:function(t,n){return ni(t.getFullYear()%100,n,2)},Y:function(t,n){return ni(t.getFullYear()%1e4,n,4)},Z:Mi,"%":function(){return"%"}},Yo={a:ei,A:ri,b:ui,B:ii,c:ai,d:di,e:di,H:gi,I:gi,L:vi,m:hi,M:pi,p:yi,S:mi,x:oi,X:ci,y:si,Y:li},Uo=/^\s*\d+/,Io=d3.map({am:0,pm:1});d3.time.format.utc=function(t){function n(t){try{wo=Ku;var n=new wo;return n._=t,e(n)}finally{wo=Date}}var e=d3.time.format(t);return n.parse=function(t){try{wo=Ku;var n=e.parse(t);return n&&n._}finally{wo=Date}},n.toString=e.toString,n};var Vo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?bi:Vo,bi.parse=function(t){var n=new Date(t);return isNaN(n)?null:n},bi.toString=Vo.toString,d3.time.second=xi(function(t){return new wo(1e3*Math.floor(t/1e3))},function(t,n){t.setTime(t.getTime()+1e3*Math.floor(n))},function(t){return t.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=xi(function(t){return new wo(6e4*Math.floor(t/6e4))},function(t,n){t.setTime(t.getTime()+6e4*Math.floor(n))},function(t){return t.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=xi(function(t){var n=t.getTimezoneOffset()/60;return new wo(36e5*(Math.floor(t/36e5-n)+n))},function(t,n){t.setTime(t.getTime()+36e5*Math.floor(n))},function(t){return t.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=xi(function(t){var n=new wo(1970,0);return n.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),n},function(t,n){t.setDate(t.getDate()+n)},function(t){return t.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(t){var n=d3.time.year(t);return Math.floor((t-n-6e4*(t.getTimezoneOffset()-n.getTimezoneOffset()))/864e5)},So.forEach(function(t,n){t=t.toLowerCase(),n=7-n;var e=d3.time[t]=xi(function(t){return(t=d3.time.day(t)).setDate(t.getDate()-(t.getDay()+n)%7),t},function(t,n){t.setDate(t.getDate()+7*Math.floor(n))},function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)-(e!==n)});d3.time[t+"s"]=e.range,d3.time[t+"s"].utc=e.utc.range,d3.time[t+"OfYear"]=function(t){var e=d3.time.year(t).getDay();return Math.floor((d3.time.dayOfYear(t)+(e+n)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=xi(function(t){return t=d3.time.day(t),t.setDate(1),t},function(t,n){t.setMonth(t.getMonth()+n)},function(t){return t.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=xi(function(t){return t=d3.time.day(t),t.setMonth(0,1),t},function(t,n){t.setFullYear(t.getFullYear()+n)},function(t){return t.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Xo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Zo=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Bo=[[d3.time.format("%Y"),o],[d3.time.format("%B"),function(t){return t.getMonth()}],[d3.time.format("%b %d"),function(t){return 1!=t.getDate()}],[d3.time.format("%a %d"),function(t){return t.getDay()&&1!=t.getDate()}],[d3.time.format("%I %p"),function(t){return t.getHours()}],[d3.time.format("%I:%M"),function(t){return t.getMinutes()}],[d3.time.format(":%S"),function(t){return t.getSeconds()}],[d3.time.format(".%L"),function(t){return t.getMilliseconds()}]],$o=d3.scale.linear(),Jo=Ei(Bo);Zo.year=function(t,n){return $o.domain(t.map(Ni)).ticks(n).map(Ai)},d3.time.scale=function(){return wi(d3.scale.linear(),Zo,Jo)};var Go=Zo.map(function(t){return[t[0].utc,t[1]]}),Ko=[[d3.time.format.utc("%Y"),o],[d3.time.format.utc("%B"),function(t){return t.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(t){return 1!=t.getUTCDate()}],[d3.time.format.utc("%a %d"),function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],[d3.time.format.utc("%I %p"),function(t){return t.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(t){return t.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(t){return t.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(t){return t.getUTCMilliseconds()}]],Wo=Ei(Ko);Go.year=function(t,n){return $o.domain(t.map(qi)).ticks(n).map(Ti)},d3.time.scale.utc=function(){return wi(d3.scale.linear(),Go,Wo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html deleted file mode 100644 index ff554adf7c8..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/index.html +++ /dev/null @@ -1,641 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Lane Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/pie.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - <style type="text/css"> - </head> - <body> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var div = d3.select("body").append("div") - .attr("class", "tooltip") - .style("opacity", 0); - - loadData() - -function loadData () { - statisticsArray = [] - - var dataSetProperties; - dsu.retrieveDataSetsForSample(webAppContext.getEntityIdentifier(), getProperties); - //console.log (statisticsArray) - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - - statisticsArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - } - - //console.log (statisticsArray.length) - var sums = calculateSum(statisticsArray, true) - var sumsWithNOINDEX = calculateSum(statisticsArray, false) - - if (! isNaN(statisticsArray[0].percFilteringPass)) { - plotLaneTable(sumsWithNOINDEX, false) - placeholder(); - plotLaneTable(sums, true) - placeholder(); - plotTable (statisticsArray); - downloadButton ("tableStats"); - placeholder(); - plotPercFilteringPass (statisticsArray); - downloadButton ("filteredChart"); - plotReadsSum (statisticsArray, sums); - downloadButton ("unfilteredReads"); - plotPercRawClustersPerLane (statisticsArray); - downloadButton ("percRawClusters"); - - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - $("#save_as" + "filteredChart").click(function() { submit_download_form("svg", "filteredChart"); }); - $("#save_as" + "unfilteredReads").click(function() { submit_download_form("svg", "unfilteredReads"); }); - $("#save_as" + "percRawClusters").click(function() { submit_download_form("svg", "percRawClusters"); }); - } - else { - d3.select("body").append("text").text("No data available!") - } - } -} - -colors = ["#FED976", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#800026", "#610B5E", "#4C0B5F", - "#0B0B61", "#0B4C5F", "#0B5F48","#0B5F1E", "#4C5F0B", "#5F480B", "#5F1E0B", "#5F0B22", - ] -var formatThousands = d3.format(","); - -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function plotLaneTable (sums, withNOINDEX) { - - d3.select("body").append("text") - .text("Lane Based Summary Table") - .attr("class", "h4"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return " without NOINDEX";} return " with NOINDEX";}) - .attr("class", "h6"); - - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableLaneStats") - .attr("class", "tableStats") - ; - - header = {"Average Passed Filtering (PF)":1, "Sum Raw Reads":1, "Sum PF Reads":1, "Sum Raw Bases":1, "Sum PF Bases":1, "Average Raw Clusters in % per Index":1, "Average PF Phred Score":1, "Average > 30 Phred Score":1 } - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // fill the table - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sums).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function plotTable (statisticsArray) { - console.log(statisticsArray) - /* - d3.select("body").append("text") - .text("Index Based Summary Table") - .attr("class", "h4"); - */ - - var tableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - var header={"External Sample Name": "Name given by the customer", - "Index1": "First Index", - "Index2": "Second Index", - "Passed Filtering(PF) in %": "Reads which passed the Illumina Filter", - "Raw Reads": "Number of all Reads", - "PF Reads": "Number of Reads which passed the Illumina Filter", - "Raw Bases": "Number of all Bases", - "PF Bases": "Number of all Bases which passed the Illumina Filter", - "% in Lane": "Percentage of this Index within the Lane", - "Mean Phred Score": "Mean Phred Score (0-40)", - "> 30 Phred Score in %": "How many Bases are above the Phred Score 30(0.001)?" - } - - - // create the table header - var thead = tableStats.selectAll("th") - //.data(d3.keys(statisticsArray[0])) // got replaced with more readable names - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - .data(d3.values(header)) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", "120px") - div.html(d) - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }) - ; - - // fill the table - // create rows - var tr = tableStats.selectAll("tr") - .data(statisticsArray).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - //.on("mouseover", function(){d3.select(this).style("background-color", "aliceblue")}) - //.on("mouseout", function(){d3.select(this).style("background-color", "white")}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; - - -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1500) - .attr("height", 50) - ; -} - - -function plotPercFilteringPass (statisticsArray) { - - if (statisticsArray.length > 60) {var svgWidth = 7000;} - else if (statisticsArray.length > 10) {var svgWidth = 4000;} - else {var svgWidth = 3000;} - - svgWidth = statisticsArray.length * 100 - if (svgWidth < 200) {svgWidth = 300;} - - - var barPadding = 1; - var valuePadding = 0.01; - var agenda = [100,90,80,70,60,50,40,30,20,10,0] - var agendaWidth = 100 - var AgendaWidthOffset = 30 - - var margin = {top: 20, right: 20, bottom: 40, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - -//d3.select("#ex1").append("svg") - - var svgFilteredChartAgenda = d3.select("body") - .append("svg") - .attr("id", "chartAgenda") - .attr("width", agendaWidth ) - .attr("height", svgHeight + margin.top + margin.bottom) - ; - - var filteredChartAgenda = svgFilteredChartAgenda.selectAll("percFilteringPassChartAgenda") - .data(agenda) - .enter() - .append("rect") - .attr("rx", 3) - .attr("y", function(d, i) { return i * (svgHeight / agenda.length) ;}) - .attr("x", function(d) { return 0; }) - .attr("width", function (d) { return agendaWidth - AgendaWidthOffset }) - .attr("height", function (d) { return svgHeight / agenda.length - barPadding;}) - .attr("fill", function (d) { return "hsla("+ Math.round(d)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChartAgenda.selectAll("agendaText") - .data(agenda) - .enter() - .append("text") - .text(function(d) { return d + " %"; }) - .attr("fill", function(d) { return "white";}) - .attr("x", function(d) { return (agendaWidth - AgendaWidthOffset)/2 ; }) - .attr("y", function(d, i) { return i * (svgHeight / agenda.length) + (svgHeight / agenda.length - barPadding) / 2 + 3;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - ; - - var svgFilteredChart = d3.select("body") - .append("svg") - .attr("id", "filteredChart") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - svgFilteredChart.append('text') - .text("% passes Illumina Filtering (PF)") - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - //.rangeRoundBands([0, svgWidth], .001); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom") - //.tickPadding(25); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - //.tickFormat(formatPercent); - - //x.domain(statisticsArray.map(function(d) { return d.externalSampleName+": "+d.index1;} )); - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - //y.domain([0, d3.max(statisticsArray, function(d) { return d.percFilteringPass; })]); - y.domain([0, 100]); - - svgFilteredChart.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - var filteredChart = svgFilteredChart.selectAll("percFilteringPassChart") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.percFilteringPass);}) - .attr("height", function (d,i) {return svgHeight - y(d.percFilteringPass);}) - .attr("fill", function (d) { return "hsla("+ Math.round(d.percFilteringPass)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChart.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - svgFilteredChart.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("transform", "rotate(0)") - .attr("x", 16) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("%"); - - - svgFilteredChart.selectAll("svgFilteredChartText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return d.percFilteringPass + " %"; }) - .attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -15; }) - .attr("y", function(d) { - if (d.percFilteringPass < 40) { return svgHeight - d.percFilteringPass - margin.top - margin.bottom; } - return (svgHeight - d.percFilteringPass - margin.bottom) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "12px") - .attr("fill", function(d) { if (d.percFilteringPass < 60) { return "black";} - return "white";}) -} - - -function plotReadsSum (statisticsArray, sums){ - - svgWidth = statisticsArray.length * 100 - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 40, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgReadsSum = d3.select("body") - .append("svg") - .attr("id", "unfilteredReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var rawReadsSum = 0; - rawReadsSum = sums[0].rawReadsSum - - svgReadsSum.append('text') - .text("Number of raw Reads: " + formatThousands(rawReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.rawReadsSum - 20; })]); - - svgReadsSum.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgReadsSum.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgReadsSum.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.rawReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.rawReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.rawReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.rawReadsSum); }) - ; - - svgReadsSum.selectAll("svgReadsSumText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.rawReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 20;}) - .attr("y", function(d) { - return (svgHeight - margin.top - margin.bottom + 20) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.rawReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - -function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); -} - - -function calculateSum(statisticsArray, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane /Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - - //console.log(sums); - return sums; - -} - - -function plotPercRawClustersPerLane (percRawClustersPerLaneArray) { - - var colorRange = d3.scale.ordinal() - .range(colors) - - var margin = {top: 60, right: 20, bottom: 40, left: 40}, - width = 500 - margin.left - margin.right, - height = 500 - margin.top - margin.bottom; - - var radius = Math.min(width, height) / 2; - - var arc = d3.svg.arc() - .outerRadius(radius - 50) - .innerRadius(radius - 90); - - var pie = d3.layout.pie() - .sort(null) - .value(function(d) { return d.percRawClustersPerLane; }); - - var svgPercRawClustersPerLaneChart = d3.select("body").append("svg") - .attr("id", "percRawClusters") - .attr("width", width) - .attr("height", height) - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2+ ")"); - - percRawClustersPerLaneArray.forEach(function(d) { - d.percRawClustersPerLane = +d.percRawClustersPerLane; - }); - - var g = svgPercRawClustersPerLaneChart.selectAll(".arc") - .data(pie(percRawClustersPerLaneArray)) - .enter().append("g") - .attr("class", "arc"); - - g.append("path") - .attr("d", arc) - .style("fill", function(d) { return colorRange(d.data.index1); }); - - g.append("text") - .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) - .attr("dy", ".35em") - .style("text-anchor", "middle") - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - .text(function (d) { - var perc = d.data.percRawClustersPerLane + " %"; - if (d.data.externalSampleName == undefined || d.data.externalSampleName.length > 10) {return d.data.index1 + " " + perc} - return d.data.externalSampleName + " " + perc }) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", Math.max(d.data.externalSampleName.length, d.data.index1.length) * 8 + "px") - div.html(d.data.externalSampleName + "<br/>" + d.data.index1 + "<br/>" + d.data.percRawClustersPerLane + " %") - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }); - - - svgPercRawClustersPerLaneChart.append('text') - .text("% in Lane") - .attr("fill", "black") - .attr("transform", "translate(" + "0" + "," + (height -220) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - -} - - -function downloadButton (buttonName) { - - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; -} - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_Lane_" + lane + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js deleted file mode 100644 index 31b23f08346..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/openbis-dsu.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the data sets for a sample specified by sample identifier - */ -openbis_dsu.prototype.retrieveDataSetsForSample = function(sampleIdentifier, action) -{ - var sampleIdentifierTokens = sampleIdentifier.split("/"); - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sampleIdentifierTokens[2] - }] - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} - diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js deleted file mode 100755 index 4d6788a48bf..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/pie.js +++ /dev/null @@ -1,94 +0,0 @@ -d3.layout.pie = function() { - var value = Number, - sort = d3_layout_pieSortByValue, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data) { - - // Compute the numeric values for each data element. - var values = data.map(function(d, i) { return +value.call(pie, d, i); }); - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular scale factor: from value to radians. - var k = ((typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle) - / d3.sum(values); - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(sort === d3_layout_pieSortByValue - ? function(i, j) { return values[j] - values[i]; } - : function(i, j) { return sort(data[i], data[j]); }); - - // Compute the arcs! - // They are stored in the original data's order. - var arcs = []; - index.forEach(function(i) { - var d; - arcs[i] = { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - return arcs; - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; - -var d3_layout_pieSortByValue = {}; diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css deleted file mode 100644 index 985d8ac6db0..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties b/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties deleted file mode 100644 index bbdf23ed3bf..00000000000 --- a/deep_sequencing_unit/source/core-plugins/laneStatistics/1/as/webapps/laneStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_LANE -label = Lane Statistics (BETA) diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css deleted file mode 100644 index 06e55c0b45b..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap-responsive.css +++ /dev/null @@ -1,815 +0,0 @@ -/*! - * Bootstrap Responsive v2.0.4 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.hidden { - display: none; - visibility: hidden; -} - -.visible-phone { - display: none !important; -} - -.visible-tablet { - display: none !important; -} - -.hidden-desktop { - display: none !important; -} - -@media (max-width: 767px) { - .visible-phone { - display: inherit !important; - } - .hidden-phone { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .visible-tablet { - display: inherit !important; - } - .hidden-tablet { - display: none !important; - } - .hidden-desktop { - display: inherit !important; - } - .visible-desktop { - display: none !important ; - } -} - -@media (max-width: 480px) { - .nav-collapse { - -webkit-transform: translate3d(0, 0, 0); - } - .page-header h1 small { - display: block; - line-height: 18px; - } - input[type="checkbox"], - input[type="radio"] { - border: 1px solid #ccc; - } - .form-horizontal .control-group > label { - float: none; - width: auto; - padding-top: 0; - text-align: left; - } - .form-horizontal .controls { - margin-left: 0; - } - .form-horizontal .control-list { - padding-top: 0; - } - .form-horizontal .form-actions { - padding-right: 10px; - padding-left: 10px; - } - .modal { - position: absolute; - top: 10px; - right: 10px; - left: 10px; - width: auto; - margin: 0; - } - .modal.fade.in { - top: auto; - } - .modal-header .close { - padding: 10px; - margin: -10px; - } - .carousel-caption { - position: static; - } -} - -@media (max-width: 767px) { - body { - padding-right: 20px; - padding-left: 20px; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - margin-right: -20px; - margin-left: -20px; - } - .container-fluid { - padding: 0; - } - .dl-horizontal dt { - float: none; - width: auto; - clear: none; - text-align: left; - } - .dl-horizontal dd { - margin-left: 0; - } - .container { - width: auto; - } - .row-fluid { - width: 100%; - } - .row, - .thumbnails { - margin-left: 0; - } - [class*="span"], - .row-fluid [class*="span"] { - display: block; - float: none; - width: auto; - margin-left: 0; - } - .input-large, - .input-xlarge, - .input-xxlarge, - input[class*="span"], - select[class*="span"], - textarea[class*="span"], - .uneditable-input { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .input-prepend input, - .input-append input, - .input-prepend input[class*="span"], - .input-append input[class*="span"] { - display: inline-block; - width: auto; - } -} - -@media (min-width: 768px) and (max-width: 979px) { - .row { - margin-left: -20px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 20px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 724px; - } - .span12 { - width: 724px; - } - .span11 { - width: 662px; - } - .span10 { - width: 600px; - } - .span9 { - width: 538px; - } - .span8 { - width: 476px; - } - .span7 { - width: 414px; - } - .span6 { - width: 352px; - } - .span5 { - width: 290px; - } - .span4 { - width: 228px; - } - .span3 { - width: 166px; - } - .span2 { - width: 104px; - } - .span1 { - width: 42px; - } - .offset12 { - margin-left: 764px; - } - .offset11 { - margin-left: 702px; - } - .offset10 { - margin-left: 640px; - } - .offset9 { - margin-left: 578px; - } - .offset8 { - margin-left: 516px; - } - .offset7 { - margin-left: 454px; - } - .offset6 { - margin-left: 392px; - } - .offset5 { - margin-left: 330px; - } - .offset4 { - margin-left: 268px; - } - .offset3 { - margin-left: 206px; - } - .offset2 { - margin-left: 144px; - } - .offset1 { - margin-left: 82px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.762430939%; - *margin-left: 2.709239449638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 99.999999993%; - *width: 99.9468085036383%; - } - .row-fluid .span11 { - width: 91.436464082%; - *width: 91.38327259263829%; - } - .row-fluid .span10 { - width: 82.87292817100001%; - *width: 82.8197366816383%; - } - .row-fluid .span9 { - width: 74.30939226%; - *width: 74.25620077063829%; - } - .row-fluid .span8 { - width: 65.74585634900001%; - *width: 65.6926648596383%; - } - .row-fluid .span7 { - width: 57.182320438000005%; - *width: 57.129128948638304%; - } - .row-fluid .span6 { - width: 48.618784527%; - *width: 48.5655930376383%; - } - .row-fluid .span5 { - width: 40.055248616%; - *width: 40.0020571266383%; - } - .row-fluid .span4 { - width: 31.491712705%; - *width: 31.4385212156383%; - } - .row-fluid .span3 { - width: 22.928176794%; - *width: 22.874985304638297%; - } - .row-fluid .span2 { - width: 14.364640883%; - *width: 14.311449393638298%; - } - .row-fluid .span1 { - width: 5.801104972%; - *width: 5.747913482638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 714px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 652px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 590px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 528px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 466px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 404px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 342px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 280px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 218px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 156px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 94px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 32px; - } -} - -@media (min-width: 1200px) { - .row { - margin-left: -30px; - *zoom: 1; - } - .row:before, - .row:after { - display: table; - content: ""; - } - .row:after { - clear: both; - } - [class*="span"] { - float: left; - margin-left: 30px; - } - .container, - .navbar-fixed-top .container, - .navbar-fixed-bottom .container { - width: 1170px; - } - .span12 { - width: 1170px; - } - .span11 { - width: 1070px; - } - .span10 { - width: 970px; - } - .span9 { - width: 870px; - } - .span8 { - width: 770px; - } - .span7 { - width: 670px; - } - .span6 { - width: 570px; - } - .span5 { - width: 470px; - } - .span4 { - width: 370px; - } - .span3 { - width: 270px; - } - .span2 { - width: 170px; - } - .span1 { - width: 70px; - } - .offset12 { - margin-left: 1230px; - } - .offset11 { - margin-left: 1130px; - } - .offset10 { - margin-left: 1030px; - } - .offset9 { - margin-left: 930px; - } - .offset8 { - margin-left: 830px; - } - .offset7 { - margin-left: 730px; - } - .offset6 { - margin-left: 630px; - } - .offset5 { - margin-left: 530px; - } - .offset4 { - margin-left: 430px; - } - .offset3 { - margin-left: 330px; - } - .offset2 { - margin-left: 230px; - } - .offset1 { - margin-left: 130px; - } - .row-fluid { - width: 100%; - *zoom: 1; - } - .row-fluid:before, - .row-fluid:after { - display: table; - content: ""; - } - .row-fluid:after { - clear: both; - } - .row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.564102564%; - *margin-left: 2.510911074638298%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - } - .row-fluid [class*="span"]:first-child { - margin-left: 0; - } - .row-fluid .span12 { - width: 100%; - *width: 99.94680851063829%; - } - .row-fluid .span11 { - width: 91.45299145300001%; - *width: 91.3997999636383%; - } - .row-fluid .span10 { - width: 82.905982906%; - *width: 82.8527914166383%; - } - .row-fluid .span9 { - width: 74.358974359%; - *width: 74.30578286963829%; - } - .row-fluid .span8 { - width: 65.81196581200001%; - *width: 65.7587743226383%; - } - .row-fluid .span7 { - width: 57.264957265%; - *width: 57.2117657756383%; - } - .row-fluid .span6 { - width: 48.717948718%; - *width: 48.6647572286383%; - } - .row-fluid .span5 { - width: 40.170940171000005%; - *width: 40.117748681638304%; - } - .row-fluid .span4 { - width: 31.623931624%; - *width: 31.5707401346383%; - } - .row-fluid .span3 { - width: 23.076923077%; - *width: 23.0237315876383%; - } - .row-fluid .span2 { - width: 14.529914530000001%; - *width: 14.4767230406383%; - } - .row-fluid .span1 { - width: 5.982905983%; - *width: 5.929714493638298%; - } - input, - textarea, - .uneditable-input { - margin-left: 0; - } - input.span12, - textarea.span12, - .uneditable-input.span12 { - width: 1160px; - } - input.span11, - textarea.span11, - .uneditable-input.span11 { - width: 1060px; - } - input.span10, - textarea.span10, - .uneditable-input.span10 { - width: 960px; - } - input.span9, - textarea.span9, - .uneditable-input.span9 { - width: 860px; - } - input.span8, - textarea.span8, - .uneditable-input.span8 { - width: 760px; - } - input.span7, - textarea.span7, - .uneditable-input.span7 { - width: 660px; - } - input.span6, - textarea.span6, - .uneditable-input.span6 { - width: 560px; - } - input.span5, - textarea.span5, - .uneditable-input.span5 { - width: 460px; - } - input.span4, - textarea.span4, - .uneditable-input.span4 { - width: 360px; - } - input.span3, - textarea.span3, - .uneditable-input.span3 { - width: 260px; - } - input.span2, - textarea.span2, - .uneditable-input.span2 { - width: 160px; - } - input.span1, - textarea.span1, - .uneditable-input.span1 { - width: 60px; - } - .thumbnails { - margin-left: -30px; - } - .thumbnails > li { - margin-left: 30px; - } - .row-fluid .thumbnails { - margin-left: 0; - } -} - -@media (max-width: 979px) { - body { - padding-top: 0; - } - .navbar-fixed-top, - .navbar-fixed-bottom { - position: static; - } - .navbar-fixed-top { - margin-bottom: 18px; - } - .navbar-fixed-bottom { - margin-top: 18px; - } - .navbar-fixed-top .navbar-inner, - .navbar-fixed-bottom .navbar-inner { - padding: 5px; - } - .navbar .container { - width: auto; - padding: 0; - } - .navbar .brand { - padding-right: 10px; - padding-left: 10px; - margin: 0 0 0 -5px; - } - .nav-collapse { - clear: both; - } - .nav-collapse .nav { - float: none; - margin: 0 0 9px; - } - .nav-collapse .nav > li { - float: none; - } - .nav-collapse .nav > li > a { - margin-bottom: 2px; - } - .nav-collapse .nav > .divider-vertical { - display: none; - } - .nav-collapse .nav .nav-header { - color: #999999; - text-shadow: none; - } - .nav-collapse .nav > li > a, - .nav-collapse .dropdown-menu a { - padding: 6px 15px; - font-weight: bold; - color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - } - .nav-collapse .btn { - padding: 4px 10px 4px; - font-weight: normal; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - } - .nav-collapse .dropdown-menu li + li a { - margin-bottom: 2px; - } - .nav-collapse .nav > li > a:hover, - .nav-collapse .dropdown-menu a:hover { - background-color: #222222; - } - .nav-collapse.in .btn-group { - padding: 0; - margin-top: 5px; - } - .nav-collapse .dropdown-menu { - position: static; - top: auto; - left: auto; - display: block; - float: none; - max-width: none; - padding: 0; - margin: 0 15px; - background-color: transparent; - border: none; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .nav-collapse .dropdown-menu:before, - .nav-collapse .dropdown-menu:after { - display: none; - } - .nav-collapse .dropdown-menu .divider { - display: none; - } - .nav-collapse .navbar-form, - .nav-collapse .navbar-search { - float: none; - padding: 9px 15px; - margin: 9px 0; - border-top: 1px solid #222222; - border-bottom: 1px solid #222222; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - } - .navbar .nav-collapse .nav.pull-right { - float: none; - margin-left: 0; - } - .nav-collapse, - .nav-collapse.collapse { - height: 0; - overflow: hidden; - } - .navbar .btn-navbar { - display: block; - } - .navbar-static .navbar-inner { - padding-right: 10px; - padding-left: 10px; - } -} - -@media (min-width: 980px) { - .nav-collapse.collapse { - height: auto !important; - overflow: visible !important; - } -} diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css deleted file mode 100644 index 8c6fea7a84e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/bootstrap.css +++ /dev/null @@ -1,4984 +0,0 @@ -/*! - * Bootstrap v2.0.4 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -audio:not([controls]) { - display: none; -} - -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -a:hover, -a:active { - outline: 0; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - max-width: 100%; - vertical-align: middle; - border: 0; - -ms-interpolation-mode: bicubic; -} - -#map_canvas img { - max-width: none; -} - -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} - -button, -input { - *overflow: visible; - line-height: normal; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -.clearfix { - *zoom: 1; -} - -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} - -.clearfix:after { - clear: both; -} - -.hide-text { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} - -a { - color: #0088cc; - text-decoration: none; -} - -a:hover { - color: #005580; - text-decoration: underline; -} - -.row { - margin-left: -20px; - *zoom: 1; -} - -.row:before, -.row:after { - display: table; - content: ""; -} - -.row:after { - clear: both; -} - -[class*="span"] { - float: left; - margin-left: 20px; -} - -.container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.span12 { - width: 940px; -} - -.span11 { - width: 860px; -} - -.span10 { - width: 780px; -} - -.span9 { - width: 700px; -} - -.span8 { - width: 620px; -} - -.span7 { - width: 540px; -} - -.span6 { - width: 460px; -} - -.span5 { - width: 380px; -} - -.span4 { - width: 300px; -} - -.span3 { - width: 220px; -} - -.span2 { - width: 140px; -} - -.span1 { - width: 60px; -} - -.offset12 { - margin-left: 980px; -} - -.offset11 { - margin-left: 900px; -} - -.offset10 { - margin-left: 820px; -} - -.offset9 { - margin-left: 740px; -} - -.offset8 { - margin-left: 660px; -} - -.offset7 { - margin-left: 580px; -} - -.offset6 { - margin-left: 500px; -} - -.offset5 { - margin-left: 420px; -} - -.offset4 { - margin-left: 340px; -} - -.offset3 { - margin-left: 260px; -} - -.offset2 { - margin-left: 180px; -} - -.offset1 { - margin-left: 100px; -} - -.row-fluid { - width: 100%; - *zoom: 1; -} - -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} - -.row-fluid:after { - clear: both; -} - -.row-fluid [class*="span"] { - display: block; - float: left; - width: 100%; - min-height: 28px; - margin-left: 2.127659574%; - *margin-left: 2.0744680846382977%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} - -.row-fluid [class*="span"]:first-child { - margin-left: 0; -} - -.row-fluid .span12 { - width: 99.99999998999999%; - *width: 99.94680850063828%; -} - -.row-fluid .span11 { - width: 91.489361693%; - *width: 91.4361702036383%; -} - -.row-fluid .span10 { - width: 82.97872339599999%; - *width: 82.92553190663828%; -} - -.row-fluid .span9 { - width: 74.468085099%; - *width: 74.4148936096383%; -} - -.row-fluid .span8 { - width: 65.95744680199999%; - *width: 65.90425531263828%; -} - -.row-fluid .span7 { - width: 57.446808505%; - *width: 57.3936170156383%; -} - -.row-fluid .span6 { - width: 48.93617020799999%; - *width: 48.88297871863829%; -} - -.row-fluid .span5 { - width: 40.425531911%; - *width: 40.3723404216383%; -} - -.row-fluid .span4 { - width: 31.914893614%; - *width: 31.8617021246383%; -} - -.row-fluid .span3 { - width: 23.404255317%; - *width: 23.3510638276383%; -} - -.row-fluid .span2 { - width: 14.89361702%; - *width: 14.8404255306383%; -} - -.row-fluid .span1 { - width: 6.382978723%; - *width: 6.329787233638298%; -} - -.container { - margin-right: auto; - margin-left: auto; - *zoom: 1; -} - -.container:before, -.container:after { - display: table; - content: ""; -} - -.container:after { - clear: both; -} - -.container-fluid { - padding-right: 20px; - padding-left: 20px; - *zoom: 1; -} - -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} - -.container-fluid:after { - clear: both; -} - -p { - margin: 0 0 9px; -} - -p small { - font-size: 11px; - color: #999999; -} - -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: bold; - color: inherit; - text-rendering: optimizelegibility; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} - -h1 { - font-size: 30px; - line-height: 36px; -} - -h1 small { - font-size: 18px; -} - -h2 { - font-size: 24px; - line-height: 36px; -} - -h2 small { - font-size: 18px; -} - -h3 { - font-size: 18px; - line-height: 27px; -} - -h3 small { - font-size: 14px; -} - -h4, -h5, -h6 { - line-height: 18px; -} - -h4 { - font-size: 14px; -} - -h4 small { - font-size: 12px; -} - -h5 { - font-size: 12px; -} - -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} - -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} - -.page-header h1 { - line-height: 1; -} - -ul, -ol { - padding: 0; - margin: 0 0 9px 25px; -} - -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} - -ul { - list-style: disc; -} - -ol { - list-style: decimal; -} - -li { - line-height: 18px; -} - -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} - -dl { - margin-bottom: 18px; -} - -dt, -dd { - line-height: 18px; -} - -dt { - font-weight: bold; - line-height: 17px; -} - -dd { - margin-left: 9px; -} - -.dl-horizontal dt { - float: left; - width: 120px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; -} - -.dl-horizontal dd { - margin-left: 130px; -} - -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} - -strong { - font-weight: bold; -} - -em { - font-style: italic; -} - -.muted { - color: #999999; -} - -abbr[title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} - -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - float: right; - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 18px; - font-style: normal; - line-height: 18px; -} - -small { - font-size: 100%; -} - -cite { - font-style: normal; -} - -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} - -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12.025px; - line-height: 18px; - word-break: break-all; - word-wrap: break-word; - white-space: pre; - white-space: pre-wrap; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 18px; -} - -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -form { - margin: 0 0 18px; -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -legend small { - font-size: 13.5px; - color: #999999; -} - -label, -input, -button, -select, -textarea { - font-size: 13px; - font-weight: normal; - line-height: 18px; -} - -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} - -label { - display: block; - margin-bottom: 5px; -} - -select, -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - display: inline-block; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; -} - -input, -textarea { - width: 210px; -} - -textarea { - height: auto; -} - -textarea, -input[type="text"], -input[type="password"], -input[type="datetime"], -input[type="datetime-local"], -input[type="date"], -input[type="month"], -input[type="time"], -input[type="week"], -input[type="number"], -input[type="email"], -input[type="url"], -input[type="search"], -input[type="tel"], -input[type="color"], -.uneditable-input { - background-color: #ffffff; - border: 1px solid #cccccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} - -textarea:focus, -input[type="text"]:focus, -input[type="password"]:focus, -input[type="datetime"]:focus, -input[type="datetime-local"]:focus, -input[type="date"]:focus, -input[type="month"]:focus, -input[type="time"]:focus, -input[type="week"]:focus, -input[type="number"]:focus, -input[type="email"]:focus, -input[type="url"]:focus, -input[type="search"]:focus, -input[type="tel"]:focus, -input[type="color"]:focus, -.uneditable-input:focus { - border-color: rgba(82, 168, 236, 0.8); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); -} - -input[type="radio"], -input[type="checkbox"] { - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; -} - -input[type="submit"], -input[type="reset"], -input[type="button"], -input[type="radio"], -input[type="checkbox"] { - width: auto; -} - -.uneditable-textarea { - width: auto; - height: auto; -} - -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} - -select { - width: 220px; - border: 1px solid #bbb; -} - -select[multiple], -select[size] { - height: auto; -} - -select:focus, -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.radio, -.checkbox { - min-height: 18px; - padding-left: 18px; -} - -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} - -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} - -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} - -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} - -.input-mini { - width: 60px; -} - -.input-small { - width: 90px; -} - -.input-medium { - width: 150px; -} - -.input-large { - width: 210px; -} - -.input-xlarge { - width: 270px; -} - -.input-xxlarge { - width: 530px; -} - -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input[class*="span"], -.row-fluid input[class*="span"], -.row-fluid select[class*="span"], -.row-fluid textarea[class*="span"], -.row-fluid .uneditable-input[class*="span"] { - float: none; - margin-left: 0; -} - -.input-append input[class*="span"], -.input-append .uneditable-input[class*="span"], -.input-prepend input[class*="span"], -.input-prepend .uneditable-input[class*="span"], -.row-fluid .input-prepend [class*="span"], -.row-fluid .input-append [class*="span"] { - display: inline-block; -} - -input, -textarea, -.uneditable-input { - margin-left: 0; -} - -input.span12, -textarea.span12, -.uneditable-input.span12 { - width: 930px; -} - -input.span11, -textarea.span11, -.uneditable-input.span11 { - width: 850px; -} - -input.span10, -textarea.span10, -.uneditable-input.span10 { - width: 770px; -} - -input.span9, -textarea.span9, -.uneditable-input.span9 { - width: 690px; -} - -input.span8, -textarea.span8, -.uneditable-input.span8 { - width: 610px; -} - -input.span7, -textarea.span7, -.uneditable-input.span7 { - width: 530px; -} - -input.span6, -textarea.span6, -.uneditable-input.span6 { - width: 450px; -} - -input.span5, -textarea.span5, -.uneditable-input.span5 { - width: 370px; -} - -input.span4, -textarea.span4, -.uneditable-input.span4 { - width: 290px; -} - -input.span3, -textarea.span3, -.uneditable-input.span3 { - width: 210px; -} - -input.span2, -textarea.span2, -.uneditable-input.span2 { - width: 130px; -} - -input.span1, -textarea.span1, -.uneditable-input.span1 { - width: 50px; -} - -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - cursor: not-allowed; - background-color: #eeeeee; - border-color: #ddd; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"][readonly], -input[type="checkbox"][readonly] { - background-color: transparent; -} - -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} - -.control-group.warning .checkbox, -.control-group.warning .radio, -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} - -.control-group.warning .checkbox:focus, -.control-group.warning .radio:focus, -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} - -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} - -.control-group.error .checkbox, -.control-group.error .radio, -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} - -.control-group.error .checkbox:focus, -.control-group.error .radio:focus, -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} - -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} - -.control-group.success .checkbox, -.control-group.success .radio, -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} - -.control-group.success .checkbox:focus, -.control-group.success .radio:focus, -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} - -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} - -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} - -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - *zoom: 1; -} - -.form-actions:before, -.form-actions:after { - display: table; - content: ""; -} - -.form-actions:after { - clear: both; -} - -.uneditable-input { - overflow: hidden; - white-space: nowrap; - cursor: not-allowed; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -} - -:-moz-placeholder { - color: #999999; -} - -:-ms-input-placeholder { - color: #999999; -} - -::-webkit-input-placeholder { - color: #999999; -} - -.help-block, -.help-inline { - color: #555555; -} - -.help-block { - display: block; - margin-bottom: 9px; -} - -.help-inline { - display: inline-block; - *display: inline; - padding-left: 5px; - vertical-align: middle; - *zoom: 1; -} - -.input-prepend, -.input-append { - margin-bottom: 5px; -} - -.input-prepend input, -.input-append input, -.input-prepend select, -.input-append select, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - position: relative; - margin-bottom: 0; - *margin-left: 0; - vertical-align: middle; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend input:focus, -.input-append input:focus, -.input-prepend select:focus, -.input-append select:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - z-index: 2; -} - -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} - -.input-prepend .add-on, -.input-append .add-on { - display: inline-block; - width: auto; - height: 18px; - min-width: 16px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; -} - -.input-prepend .add-on, -.input-append .add-on, -.input-prepend .btn, -.input-append .btn { - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} - -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} - -.input-prepend .add-on:first-child, -.input-prepend .btn:first-child { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append input, -.input-append select, -.input-append .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-append .uneditable-input { - border-right-color: #ccc; - border-left-color: #eee; -} - -.input-append .add-on:last-child, -.input-append .btn:last-child { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.search-query { - padding-right: 14px; - padding-right: 4px \9; - padding-left: 14px; - padding-left: 4px \9; - /* IE7-8 doesn't have border-radius, so don't indent the padding */ - - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} - -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - *display: inline; - margin-bottom: 0; - *zoom: 1; -} - -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} - -.form-search label, -.form-inline label { - display: inline-block; -} - -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} - -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} - -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-right: 3px; - margin-left: 0; -} - -.control-group { - margin-bottom: 9px; -} - -legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} - -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} - -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; -} - -.form-horizontal .control-group:after { - clear: both; -} - -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} - -.form-horizontal .controls { - *display: inline-block; - *padding-left: 20px; - margin-left: 160px; - *margin-left: 0; -} - -.form-horizontal .controls:first-child { - *padding-left: 160px; -} - -.form-horizontal .help-block { - margin-top: 9px; - margin-bottom: 0; -} - -.form-horizontal .form-actions { - padding-left: 160px; -} - -table { - max-width: 100%; - background-color: transparent; - border-collapse: collapse; - border-spacing: 0; -} - -.table { - width: 100%; - margin-bottom: 18px; -} - -.table th, -.table td { - padding: 8px; - line-height: 18px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table th { - font-weight: bold; -} - -.table thead th { - vertical-align: bottom; -} - -.table caption + thead tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} - -.table-bordered { - border: 1px solid #dddddd; - border-collapse: separate; - *border-collapse: collapsed; - border-left: 0; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} - -.table-bordered caption + thead tr:first-child th, -.table-bordered caption + tbody tr:first-child th, -.table-bordered caption + tbody tr:first-child td, -.table-bordered colgroup + thead tr:first-child th, -.table-bordered colgroup + tbody tr:first-child th, -.table-bordered colgroup + tbody tr:first-child td, -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} - -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; -} - -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; -} - -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; -} - -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; -} - -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} - -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #f5f5f5; -} - -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} - -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} - -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} - -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} - -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} - -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} - -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} - -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} - -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} - -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} - -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} - -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} - -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} - -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} - -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} - -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} - -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} - -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} - -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} - -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} - -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} - -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} - -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} - -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} - -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - *margin-right: .3em; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; -} - -[class^="icon-"]:last-child, -[class*=" icon-"]:last-child { - *margin-left: 0; -} - -.icon-white { - background-image: url("../img/glyphicons-halflings-white.png"); -} - -.icon-glass { - background-position: 0 0; -} - -.icon-music { - background-position: -24px 0; -} - -.icon-search { - background-position: -48px 0; -} - -.icon-envelope { - background-position: -72px 0; -} - -.icon-heart { - background-position: -96px 0; -} - -.icon-star { - background-position: -120px 0; -} - -.icon-star-empty { - background-position: -144px 0; -} - -.icon-user { - background-position: -168px 0; -} - -.icon-film { - background-position: -192px 0; -} - -.icon-th-large { - background-position: -216px 0; -} - -.icon-th { - background-position: -240px 0; -} - -.icon-th-list { - background-position: -264px 0; -} - -.icon-ok { - background-position: -288px 0; -} - -.icon-remove { - background-position: -312px 0; -} - -.icon-zoom-in { - background-position: -336px 0; -} - -.icon-zoom-out { - background-position: -360px 0; -} - -.icon-off { - background-position: -384px 0; -} - -.icon-signal { - background-position: -408px 0; -} - -.icon-cog { - background-position: -432px 0; -} - -.icon-trash { - background-position: -456px 0; -} - -.icon-home { - background-position: 0 -24px; -} - -.icon-file { - background-position: -24px -24px; -} - -.icon-time { - background-position: -48px -24px; -} - -.icon-road { - background-position: -72px -24px; -} - -.icon-download-alt { - background-position: -96px -24px; -} - -.icon-download { - background-position: -120px -24px; -} - -.icon-upload { - background-position: -144px -24px; -} - -.icon-inbox { - background-position: -168px -24px; -} - -.icon-play-circle { - background-position: -192px -24px; -} - -.icon-repeat { - background-position: -216px -24px; -} - -.icon-refresh { - background-position: -240px -24px; -} - -.icon-list-alt { - background-position: -264px -24px; -} - -.icon-lock { - background-position: -287px -24px; -} - -.icon-flag { - background-position: -312px -24px; -} - -.icon-headphones { - background-position: -336px -24px; -} - -.icon-volume-off { - background-position: -360px -24px; -} - -.icon-volume-down { - background-position: -384px -24px; -} - -.icon-volume-up { - background-position: -408px -24px; -} - -.icon-qrcode { - background-position: -432px -24px; -} - -.icon-barcode { - background-position: -456px -24px; -} - -.icon-tag { - background-position: 0 -48px; -} - -.icon-tags { - background-position: -25px -48px; -} - -.icon-book { - background-position: -48px -48px; -} - -.icon-bookmark { - background-position: -72px -48px; -} - -.icon-print { - background-position: -96px -48px; -} - -.icon-camera { - background-position: -120px -48px; -} - -.icon-font { - background-position: -144px -48px; -} - -.icon-bold { - background-position: -167px -48px; -} - -.icon-italic { - background-position: -192px -48px; -} - -.icon-text-height { - background-position: -216px -48px; -} - -.icon-text-width { - background-position: -240px -48px; -} - -.icon-align-left { - background-position: -264px -48px; -} - -.icon-align-center { - background-position: -288px -48px; -} - -.icon-align-right { - background-position: -312px -48px; -} - -.icon-align-justify { - background-position: -336px -48px; -} - -.icon-list { - background-position: -360px -48px; -} - -.icon-indent-left { - background-position: -384px -48px; -} - -.icon-indent-right { - background-position: -408px -48px; -} - -.icon-facetime-video { - background-position: -432px -48px; -} - -.icon-picture { - background-position: -456px -48px; -} - -.icon-pencil { - background-position: 0 -72px; -} - -.icon-map-marker { - background-position: -24px -72px; -} - -.icon-adjust { - background-position: -48px -72px; -} - -.icon-tint { - background-position: -72px -72px; -} - -.icon-edit { - background-position: -96px -72px; -} - -.icon-share { - background-position: -120px -72px; -} - -.icon-check { - background-position: -144px -72px; -} - -.icon-move { - background-position: -168px -72px; -} - -.icon-step-backward { - background-position: -192px -72px; -} - -.icon-fast-backward { - background-position: -216px -72px; -} - -.icon-backward { - background-position: -240px -72px; -} - -.icon-play { - background-position: -264px -72px; -} - -.icon-pause { - background-position: -288px -72px; -} - -.icon-stop { - background-position: -312px -72px; -} - -.icon-forward { - background-position: -336px -72px; -} - -.icon-fast-forward { - background-position: -360px -72px; -} - -.icon-step-forward { - background-position: -384px -72px; -} - -.icon-eject { - background-position: -408px -72px; -} - -.icon-chevron-left { - background-position: -432px -72px; -} - -.icon-chevron-right { - background-position: -456px -72px; -} - -.icon-plus-sign { - background-position: 0 -96px; -} - -.icon-minus-sign { - background-position: -24px -96px; -} - -.icon-remove-sign { - background-position: -48px -96px; -} - -.icon-ok-sign { - background-position: -72px -96px; -} - -.icon-question-sign { - background-position: -96px -96px; -} - -.icon-info-sign { - background-position: -120px -96px; -} - -.icon-screenshot { - background-position: -144px -96px; -} - -.icon-remove-circle { - background-position: -168px -96px; -} - -.icon-ok-circle { - background-position: -192px -96px; -} - -.icon-ban-circle { - background-position: -216px -96px; -} - -.icon-arrow-left { - background-position: -240px -96px; -} - -.icon-arrow-right { - background-position: -264px -96px; -} - -.icon-arrow-up { - background-position: -289px -96px; -} - -.icon-arrow-down { - background-position: -312px -96px; -} - -.icon-share-alt { - background-position: -336px -96px; -} - -.icon-resize-full { - background-position: -360px -96px; -} - -.icon-resize-small { - background-position: -384px -96px; -} - -.icon-plus { - background-position: -408px -96px; -} - -.icon-minus { - background-position: -433px -96px; -} - -.icon-asterisk { - background-position: -456px -96px; -} - -.icon-exclamation-sign { - background-position: 0 -120px; -} - -.icon-gift { - background-position: -24px -120px; -} - -.icon-leaf { - background-position: -48px -120px; -} - -.icon-fire { - background-position: -72px -120px; -} - -.icon-eye-open { - background-position: -96px -120px; -} - -.icon-eye-close { - background-position: -120px -120px; -} - -.icon-warning-sign { - background-position: -144px -120px; -} - -.icon-plane { - background-position: -168px -120px; -} - -.icon-calendar { - background-position: -192px -120px; -} - -.icon-random { - background-position: -216px -120px; -} - -.icon-comment { - background-position: -240px -120px; -} - -.icon-magnet { - background-position: -264px -120px; -} - -.icon-chevron-up { - background-position: -288px -120px; -} - -.icon-chevron-down { - background-position: -313px -119px; -} - -.icon-retweet { - background-position: -336px -120px; -} - -.icon-shopping-cart { - background-position: -360px -120px; -} - -.icon-folder-close { - background-position: -384px -120px; -} - -.icon-folder-open { - background-position: -408px -120px; -} - -.icon-resize-vertical { - background-position: -432px -119px; -} - -.icon-resize-horizontal { - background-position: -456px -118px; -} - -.icon-hdd { - background-position: 0 -144px; -} - -.icon-bullhorn { - background-position: -24px -144px; -} - -.icon-bell { - background-position: -48px -144px; -} - -.icon-certificate { - background-position: -72px -144px; -} - -.icon-thumbs-up { - background-position: -96px -144px; -} - -.icon-thumbs-down { - background-position: -120px -144px; -} - -.icon-hand-right { - background-position: -144px -144px; -} - -.icon-hand-left { - background-position: -168px -144px; -} - -.icon-hand-up { - background-position: -192px -144px; -} - -.icon-hand-down { - background-position: -216px -144px; -} - -.icon-circle-arrow-right { - background-position: -240px -144px; -} - -.icon-circle-arrow-left { - background-position: -264px -144px; -} - -.icon-circle-arrow-up { - background-position: -288px -144px; -} - -.icon-circle-arrow-down { - background-position: -312px -144px; -} - -.icon-globe { - background-position: -336px -144px; -} - -.icon-wrench { - background-position: -360px -144px; -} - -.icon-tasks { - background-position: -384px -144px; -} - -.icon-filter { - background-position: -408px -144px; -} - -.icon-briefcase { - background-position: -432px -144px; -} - -.icon-fullscreen { - background-position: -456px -144px; -} - -.dropup, -.dropdown { - position: relative; -} - -.dropdown-toggle { - *margin-bottom: -3px; -} - -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-left: 4px solid transparent; - content: ""; - opacity: 0.3; - filter: alpha(opacity=30); -} - -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} - -.dropdown:hover .caret, -.open .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 4px 0; - margin: 1px 0 0; - list-style: none; - background-color: #ffffff; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.2); - *border-right-width: 2px; - *border-bottom-width: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} - -.open { - *z-index: 1000; -} - -.open > .dropdown-menu { - display: block; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: "\2191"; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -.collapse.in { - height: auto; -} - -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.4; - filter: alpha(opacity=40); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.btn { - display: inline-block; - *display: inline; - padding: 4px 10px 4px; - margin-bottom: 0; - *margin-left: .3em; - font-size: 13px; - line-height: 18px; - *line-height: 20px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - cursor: pointer; - background-color: #f5f5f5; - *background-color: #e6e6e6; - background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(top, #ffffff, #e6e6e6); - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - border: 1px solid #cccccc; - *border: 0; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - background-color: #e6e6e6; - *background-color: #d9d9d9; -} - -.btn:active, -.btn.active { - background-color: #cccccc \9; -} - -.btn:first-child { - *margin-left: 0; -} - -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - *background-color: #d9d9d9; - /* Buttons in IE7 don't get borders, so darken on hover */ - - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn.active, -.btn:active { - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn.disabled, -.btn[disabled] { - cursor: default; - background-color: #e6e6e6; - background-image: none; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} - -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.btn-large [class^="icon-"] { - margin-top: 1px; -} - -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} - -.btn-small [class^="icon-"] { - margin-top: -1px; -} - -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 14px; -} - -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} - -.btn { - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); -} - -.btn-primary { - background-color: #0074cc; - *background-color: #0055cc; - background-image: -ms-linear-gradient(top, #0088cc, #0055cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); - background-image: -o-linear-gradient(top, #0088cc, #0055cc); - background-image: -moz-linear-gradient(top, #0088cc, #0055cc); - background-image: linear-gradient(top, #0088cc, #0055cc); - background-repeat: repeat-x; - border-color: #0055cc #0055cc #003580; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0055cc; - *background-color: #004ab3; -} - -.btn-primary:active, -.btn-primary.active { - background-color: #004099 \9; -} - -.btn-warning { - background-color: #faa732; - *background-color: #f89406; - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; - *background-color: #df8505; -} - -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} - -.btn-danger { - background-color: #da4f49; - *background-color: #bd362f; - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; - *background-color: #a9302a; -} - -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} - -.btn-success { - background-color: #5bb75b; - *background-color: #51a351; - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; - *background-color: #499249; -} - -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} - -.btn-info { - background-color: #49afcd; - *background-color: #2f96b4; - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; - *background-color: #2a85a0; -} - -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} - -.btn-inverse { - background-color: #414141; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #555555, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); - background-image: -webkit-linear-gradient(top, #555555, #222222); - background-image: -o-linear-gradient(top, #555555, #222222); - background-image: -moz-linear-gradient(top, #555555, #222222); - background-image: linear-gradient(top, #555555, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} - -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} - -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} - -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} - -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} - -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} - -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} - -.btn-group { - position: relative; - *margin-left: .3em; - *zoom: 1; -} - -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} - -.btn-group:after { - clear: both; -} - -.btn-group:first-child { - *margin-left: 0; -} - -.btn-group + .btn-group { - margin-left: 5px; -} - -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} - -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} - -.btn-group > .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 4px; - border-bottom-left-radius: 4px; - -webkit-border-top-left-radius: 4px; - border-top-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-topleft: 4px; -} - -.btn-group > .btn:last-child, -.btn-group > .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - border-bottom-right-radius: 4px; - -moz-border-radius-topright: 4px; - -moz-border-radius-bottomright: 4px; -} - -.btn-group > .btn.large:first-child { - margin-left: 0; - -webkit-border-bottom-left-radius: 6px; - border-bottom-left-radius: 6px; - -webkit-border-top-left-radius: 6px; - border-top-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - -moz-border-radius-topleft: 6px; -} - -.btn-group > .btn.large:last-child, -.btn-group > .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - border-bottom-right-radius: 6px; - -moz-border-radius-topright: 6px; - -moz-border-radius-bottomright: 6px; -} - -.btn-group > .btn:hover, -.btn-group > .btn:focus, -.btn-group > .btn:active, -.btn-group > .btn.active { - z-index: 2; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group > .dropdown-toggle { - *padding-top: 4px; - padding-right: 8px; - *padding-bottom: 4px; - padding-left: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group > .btn-mini.dropdown-toggle { - padding-right: 5px; - padding-left: 5px; -} - -.btn-group > .btn-small.dropdown-toggle { - *padding-top: 4px; - *padding-bottom: 4px; -} - -.btn-group > .btn-large.dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.btn-group.open .btn.dropdown-toggle { - background-color: #e6e6e6; -} - -.btn-group.open .btn-primary.dropdown-toggle { - background-color: #0055cc; -} - -.btn-group.open .btn-warning.dropdown-toggle { - background-color: #f89406; -} - -.btn-group.open .btn-danger.dropdown-toggle { - background-color: #bd362f; -} - -.btn-group.open .btn-success.dropdown-toggle { - background-color: #51a351; -} - -.btn-group.open .btn-info.dropdown-toggle { - background-color: #2f96b4; -} - -.btn-group.open .btn-inverse.dropdown-toggle { - background-color: #222222; -} - -.btn .caret { - margin-top: 7px; - margin-left: 0; -} - -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.btn-mini .caret { - margin-top: 5px; -} - -.btn-small .caret { - margin-top: 6px; -} - -.btn-large .caret { - margin-top: 6px; - border-top-width: 5px; - border-right-width: 5px; - border-left-width: 5px; -} - -.dropup .btn-large .caret { - border-top: 0; - border-bottom: 5px solid #000000; -} - -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} - -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - color: #c09853; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.alert-heading { - color: inherit; -} - -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-danger, -.alert-error { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} - -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} - -.alert-block p + p { - margin-top: 5px; -} - -.nav { - margin-bottom: 18px; - margin-left: 0; - list-style: none; -} - -.nav > li > a { - display: block; -} - -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > .pull-right { - float: right; -} - -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} - -.nav li + .nav-header { - margin-top: 9px; -} - -.nav-list { - padding-right: 15px; - padding-left: 15px; - margin-bottom: 0; -} - -.nav-list > li > a, -.nav-list .nav-header { - margin-right: -15px; - margin-left: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} - -.nav-list > li > a { - padding: 3px 15px; -} - -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} - -.nav-list [class^="icon-"] { - margin-right: 2px; -} - -.nav-list .divider { - *width: 100%; - height: 1px; - margin: 8px 1px; - *margin: -5px 0 5px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; -} - -.nav-tabs, -.nav-pills { - *zoom: 1; -} - -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} - -.nav-tabs:after, -.nav-pills:after { - clear: both; -} - -.nav-tabs > li, -.nav-pills > li { - float: left; -} - -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} - -.nav-tabs { - border-bottom: 1px solid #ddd; -} - -.nav-tabs > li { - margin-bottom: -1px; -} - -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 18px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} - -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} - -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li > a { - margin-right: 0; -} - -.nav-tabs.nav-stacked { - border-bottom: 0; -} - -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} - -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.nav-tabs.nav-stacked > li > a:hover { - z-index: 2; - border-color: #ddd; -} - -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} - -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} - -.nav-tabs .dropdown-menu { - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; -} - -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - margin-top: 6px; - border-top-color: #0088cc; - border-bottom-color: #0088cc; -} - -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} - -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} - -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > li.dropdown.open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} - -.nav li.dropdown.open .caret, -.nav li.dropdown.open.active .caret, -.nav li.dropdown.open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} - -.tabs-stacked .open > a:hover { - border-color: #999999; -} - -.tabbable { - *zoom: 1; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} - -.tabbable:after { - clear: both; -} - -.tab-content { - overflow: auto; -} - -.tabs-below > .nav-tabs, -.tabs-right > .nav-tabs, -.tabs-left > .nav-tabs { - border-bottom: 0; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.tabs-below > .nav-tabs { - border-top: 1px solid #ddd; -} - -.tabs-below > .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} - -.tabs-below > .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -.tabs-below > .nav-tabs > li > a:hover { - border-top-color: #ddd; - border-bottom-color: transparent; -} - -.tabs-below > .nav-tabs > .active > a, -.tabs-below > .nav-tabs > .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} - -.tabs-left > .nav-tabs > li, -.tabs-right > .nav-tabs > li { - float: none; -} - -.tabs-left > .nav-tabs > li > a, -.tabs-right > .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} - -.tabs-left > .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} - -.tabs-left > .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} - -.tabs-left > .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} - -.tabs-left > .nav-tabs .active > a, -.tabs-left > .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} - -.tabs-right > .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} - -.tabs-right > .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} - -.tabs-right > .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} - -.tabs-right > .nav-tabs .active > a, -.tabs-right > .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} - -.navbar { - *position: relative; - *z-index: 2; - margin-bottom: 18px; - overflow: visible; -} - -.navbar-inner { - min-height: 40px; - padding-right: 20px; - padding-left: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} - -.navbar .container { - width: auto; -} - -.nav-collapse.collapse { - height: auto; -} - -.navbar { - color: #999999; -} - -.navbar .brand:hover { - text-decoration: none; -} - -.navbar .brand { - display: block; - float: left; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: bold; - line-height: 1; - color: #CACACA; -} - -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; -} - -.navbar .navbar-link { - color: #999999; -} - -.navbar .navbar-link:hover { - color: #ffffff; -} - -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} - -.navbar .btn-group .btn { - margin: 0; -} - -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} - -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} - -.navbar-form:after { - clear: both; -} - -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} - -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-bottom: 0; -} - -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} - -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} - -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} - -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} - -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - background-color: #626262; - border: 1px solid #151515; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} - -.navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} - -.navbar-search .search-query:-ms-input-placeholder { - color: #cccccc; -} - -.navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} - -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - outline: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} - -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-right: 0; - padding-left: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} - -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} - -.navbar-fixed-top { - top: 0; -} - -.navbar-fixed-bottom { - bottom: 0; -} - -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} - -.navbar .nav.pull-right { - float: right; -} - -.navbar .nav > li { - display: block; - float: left; -} - -.navbar .nav > li > a { - float: none; - padding: 9px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar .btn { - display: inline-block; - padding: 4px 10px 4px; - margin: 5px 5px 6px; - line-height: 18px; -} - -.navbar .btn-group { - padding: 5px 5px 6px; - margin: 0; -} - -.navbar .nav > li > a:hover { - color: #ffffff; - text-decoration: none; - background-color: transparent; -} - -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} - -.navbar .divider-vertical { - width: 1px; - height: 40px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} - -.navbar .nav.pull-right { - margin-right: 0; - margin-left: 10px; -} - -.navbar .btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-right: 5px; - margin-left: 5px; - background-color: #2c2c2c; - *background-color: #222222; - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-image: -moz-linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} - -.navbar .btn-navbar:hover, -.navbar .btn-navbar:active, -.navbar .btn-navbar.active, -.navbar .btn-navbar.disabled, -.navbar .btn-navbar[disabled] { - background-color: #222222; - *background-color: #151515; -} - -.navbar .btn-navbar:active, -.navbar .btn-navbar.active { - background-color: #080808 \9; -} - -.navbar .btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} - -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} - -.navbar .dropdown-menu:before { - position: absolute; - top: -7px; - left: 9px; - display: inline-block; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-left: 7px solid transparent; - border-bottom-color: rgba(0, 0, 0, 0.2); - content: ''; -} - -.navbar .dropdown-menu:after { - position: absolute; - top: -6px; - left: 10px; - display: inline-block; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - border-left: 6px solid transparent; - content: ''; -} - -.navbar-fixed-bottom .dropdown-menu:before { - top: auto; - bottom: -7px; - border-top: 7px solid #ccc; - border-bottom: 0; - border-top-color: rgba(0, 0, 0, 0.2); -} - -.navbar-fixed-bottom .dropdown-menu:after { - top: auto; - bottom: -6px; - border-top: 6px solid #ffffff; - border-bottom: 0; -} - -.navbar .nav li.dropdown .dropdown-toggle .caret, -.navbar .nav li.dropdown.open .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar .nav li.dropdown.active .caret { - opacity: 1; - filter: alpha(opacity=100); -} - -.navbar .nav li.dropdown.open > .dropdown-toggle, -.navbar .nav li.dropdown.active > .dropdown-toggle, -.navbar .nav li.dropdown.open.active > .dropdown-toggle { - background-color: transparent; -} - -.navbar .nav li.dropdown.active > .dropdown-toggle:hover { - color: #ffffff; -} - -.navbar .pull-right .dropdown-menu, -.navbar .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar .pull-right .dropdown-menu:before, -.navbar .dropdown-menu.pull-right:before { - right: 12px; - left: auto; -} - -.navbar .pull-right .dropdown-menu:after, -.navbar .dropdown-menu.pull-right:after { - right: 13px; - left: auto; -} - -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - list-style: none; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.breadcrumb li { - display: inline-block; - *display: inline; - text-shadow: 0 1px 0 #ffffff; - *zoom: 1; -} - -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} - -.breadcrumb .active a { - color: #333333; -} - -.pagination { - height: 36px; - margin: 18px 0; -} - -.pagination ul { - display: inline-block; - *display: inline; - margin-bottom: 0; - margin-left: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - *zoom: 1; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.pagination li { - display: inline; -} - -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} - -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} - -.pagination .active a { - color: #999999; - cursor: default; -} - -.pagination .disabled span, -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - cursor: default; - background-color: transparent; -} - -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} - -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} - -.pagination-centered { - text-align: center; -} - -.pagination-right { - text-align: right; -} - -.pager { - margin-bottom: 18px; - margin-left: 0; - text-align: center; - list-style: none; - *zoom: 1; -} - -.pager:before, -.pager:after { - display: table; - content: ""; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} - -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} - -.pager .next a { - float: right; -} - -.pager .previous a { - float: left; -} - -.pager .disabled a, -.pager .disabled a:hover { - color: #999999; - cursor: default; - background-color: #fff; -} - -.modal-open .dropdown-menu { - z-index: 2050; -} - -.modal-open .dropdown.open { - *z-index: 2050; -} - -.modal-open .popover { - z-index: 2060; -} - -.modal-open .tooltip { - z-index: 2070; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; -} - -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - width: 560px; - margin: -250px 0 0 -280px; - overflow: auto; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.modal.fade { - top: -25%; - -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; - -moz-transition: opacity 0.3s linear, top 0.3s ease-out; - -ms-transition: opacity 0.3s linear, top 0.3s ease-out; - -o-transition: opacity 0.3s linear, top 0.3s ease-out; - transition: opacity 0.3s linear, top 0.3s ease-out; -} - -.modal.fade.in { - top: 50%; -} - -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} - -.modal-header .close { - margin-top: 2px; -} - -.modal-body { - max-height: 400px; - padding: 15px; - overflow-y: auto; -} - -.modal-form { - margin-bottom: 0; -} - -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - *zoom: 1; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.tooltip { - position: absolute; - z-index: 1020; - display: block; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} - -.tooltip.top { - margin-top: -2px; -} - -.tooltip.right { - margin-left: 2px; -} - -.tooltip.bottom { - margin-top: 2px; -} - -.tooltip.left { - margin-left: -2px; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} - -.popover.top { - margin-top: -5px; -} - -.popover.right { - margin-left: 5px; -} - -.popover.bottom { - margin-top: 5px; -} - -.popover.left { - margin-left: -5px; -} - -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top: 5px solid #000000; - border-right: 5px solid transparent; - border-left: 5px solid transparent; -} - -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-right: 5px solid #000000; - border-bottom: 5px solid transparent; -} - -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; - border-left: 5px solid transparent; -} - -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} - -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} - -.popover-inner { - width: 280px; - padding: 3px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} - -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} - -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} - -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} - -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} - -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} - -.thumbnails:after { - clear: both; -} - -.row-fluid .thumbnails { - margin-left: 0; -} - -.thumbnails > li { - float: left; - margin-bottom: 18px; - margin-left: 20px; -} - -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} - -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} - -.thumbnail > img { - display: block; - max-width: 100%; - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; -} - -.label, -.badge { - font-size: 10.998px; - font-weight: bold; - line-height: 14px; - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; -} - -.label { - padding: 1px 4px 2px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} - -.badge { - padding: 1px 9px 2px; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} - -a.label:hover, -a.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label-important, -.badge-important { - background-color: #b94a48; -} - -.label-important[href], -.badge-important[href] { - background-color: #953b39; -} - -.label-warning, -.badge-warning { - background-color: #f89406; -} - -.label-warning[href], -.badge-warning[href] { - background-color: #c67605; -} - -.label-success, -.badge-success { - background-color: #468847; -} - -.label-success[href], -.badge-success[href] { - background-color: #356635; -} - -.label-info, -.badge-info { - background-color: #3a87ad; -} - -.label-info[href], -.badge-info[href] { - background-color: #2d6987; -} - -.label-inverse, -.badge-inverse { - background-color: #333333; -} - -.label-inverse[href], -.badge-inverse[href] { - background-color: #1a1a1a; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-ms-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 18px; - margin-bottom: 18px; - overflow: hidden; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress .bar { - width: 0; - height: 18px; - font-size: 12px; - color: #ffffff; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .bar { - background-color: #149bdf; - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} - -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} - -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} - -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} - -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-warning .bar { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); -} - -.progress-warning.progress-striped .bar { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.accordion { - margin-bottom: 18px; -} - -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} - -.accordion-heading { - border-bottom: 0; -} - -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} - -.accordion-toggle { - cursor: pointer; -} - -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} - -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel .item > img { - display: block; - line-height: 1; -} - -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} - -.carousel .active { - left: 0; -} - -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel .next { - left: 100%; -} - -.carousel .prev { - left: -100%; -} - -.carousel .next.left, -.carousel .prev.right { - left: 0; -} - -.carousel .active.left { - left: -100%; -} - -.carousel .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.right { - right: 15px; - left: auto; -} - -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-caption { - position: absolute; - right: 0; - bottom: 0; - left: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} - -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} - -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - letter-spacing: -1px; - color: inherit; -} - -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; - color: inherit; -} - -.pull-right { - float: right; -} - -.pull-left { - float: left; -} - -.hide { - display: none; -} - -.show { - display: block; -} - -.invisible { - visibility: hidden; -} - diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css deleted file mode 100644 index 92a4ec8e67f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/docs.css +++ /dev/null @@ -1,846 +0,0 @@ -/* Add additional stylesheets below --------------------------------------------------- */ -/* - Bootstrap's documentation styles - Special styles for presenting Bootstrap's documentation and examples -*/ - - -/* Body and structure --------------------------------------------------- */ -body { - position: relative; - padding-top: 90px; - background-color: #fff; - background-image: url(../img/grid-18px-masked.png); - background-repeat: repeat-x; - background-position: 0 40px; -} - - -/* Tweak navbar brand link to be super sleek --------------------------------------------------- */ -.navbar-fixed-top .brand { - padding-right: 0; - padding-left: 0; - margin-left: 20px; - float: right; - font-weight: bold; - color: #000; - text-shadow: 0 1px 0 rgba(255,255,255,.1), 0 0 30px rgba(255,255,255,.125); - -webkit-transition: all .2s linear; - -moz-transition: all .2s linear; - transition: all .2s linear; -} -.navbar-fixed-top .brand:hover { - text-decoration: none; -} - - -/* Space out sub-sections more --------------------------------------------------- */ -section { - padding-top: 60px; -} - -/* Faded out hr */ -hr.soften { - height: 1px; - margin: 54px 0; - background-image: -webkit-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -moz-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -ms-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - background-image: -o-linear-gradient(left, rgba(0,0,0,0), rgba(0,0,0,.1), rgba(0,0,0,0)); - border: 0; -} - - -/* Jumbotrons --------------------------------------------------- */ -.jumbotron { - position: relative; -} -.jumbotron h1 { - margin-bottom: 9px; - font-size: 81px; - font-weight: bold; - letter-spacing: -1px; - line-height: 1; -} -.jumbotron p { - margin-bottom: 18px; - font-weight: 300; -} -.jumbotron .btn-large { - font-size: 20px; - font-weight: normal; - padding: 14px 24px; - margin-right: 10px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.jumbotron .btn-large small { - font-size: 14px; -} - -/* Masthead (docs home) */ -.masthead { - padding-top: 36px; - margin-bottom: 72px; -} -.masthead h1, -.masthead p { - text-align: center; -} -.masthead h1 { - margin-bottom: 18px; -} -.masthead p { - margin-left: 5%; - margin-right: 5%; - font-size: 30px; - line-height: 36px; -} - - -/* Specific jumbotrons -------------------------- */ -/* supporting docs pages */ -.subhead { - padding-bottom: 0; - margin-bottom: 9px; -} -.subhead h1 { - font-size: 54px; -} - -/* Subnav */ -.subnav { - width: 100%; - height: 36px; - background-color: #eeeeee; /* Old browsers */ - background-repeat: repeat-x; /* Repeat the gradient */ - background-image: -moz-linear-gradient(top, #f5f5f5 0%, #eeeeee 100%); /* FF3.6+ */ - background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f5f5f5), color-stop(100%,#eeeeee)); /* Chrome,Safari4+ */ - background-image: -webkit-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Chrome 10+,Safari 5.1+ */ - background-image: -ms-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* IE10+ */ - background-image: -o-linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* Opera 11.10+ */ - filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f5f5f5', endColorstr='#eeeeee',GradientType=0 ); /* IE6-9 */ - background-image: linear-gradient(top, #f5f5f5 0%,#eeeeee 100%); /* W3C */ - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.subnav .nav { - margin-bottom: 0; -} -.subnav .nav > li > a { - margin: 0; - padding-top: 11px; - padding-bottom: 11px; - border-left: 1px solid #f5f5f5; - border-right: 1px solid #e5e5e5; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.subnav .nav > .active > a, -.subnav .nav > .active > a:hover { - padding-left: 13px; - color: #777; - background-color: #e9e9e9; - border-right-color: #ddd; - border-left: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); - -moz-box-shadow: inset 0 3px 5px rgba(0,0,0,.05); - box-shadow: inset 0 3px 5px rgba(0,0,0,.05); -} -.subnav .nav > .active > a .caret, -.subnav .nav > .active > a:hover .caret { - border-top-color: #777; -} -.subnav .nav > li:first-child > a, -.subnav .nav > li:first-child > a:hover { - border-left: 0; - padding-left: 12px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.subnav .nav > li:last-child > a { - border-right: 0; -} -.subnav .dropdown-menu { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} - -/* Fixed subnav on scroll, but only for 980px and up (sorry IE!) */ -@media (min-width: 980px) { - .subnav-fixed { - position: fixed; - top: 40px; - left: 0; - right: 0; - z-index: 1020; /* 10 less than .navbar-fixed to prevent any overlap */ - border-color: #d5d5d5; - border-width: 0 0 1px; /* drop the border on the fixed edges */ - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - -webkit-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - -moz-box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - box-shadow: inset 0 1px 0 #fff, 0 1px 5px rgba(0,0,0,.1); - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); /* IE6-9 */ - } - .subnav-fixed .nav { - width: 938px; - margin: 0 auto; - padding: 0 1px; - } - .subnav .nav > li:first-child > a, - .subnav .nav > li:first-child > a:hover { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - } -} - - -/* Quick links --------------------------------------------------- */ -.bs-links { - margin: 36px 0; -} -.quick-links { - min-height: 30px; - margin: 0; - padding: 5px 20px; - list-style: none; - text-align: center; - overflow: hidden; -} -.quick-links:first-child { - min-height: 0; -} -.quick-links li { - display: inline; - margin: 0 8px; - color: #999; -} -.quick-links .github-btn, -.quick-links .tweet-btn, -.quick-links .follow-btn { - position: relative; - top: 5px; -} - - -/* Marketing section of Overview --------------------------------------------------- */ -.marketing .row { - margin-bottom: 9px; -} -.marketing h1 { - margin: 36px 0 27px; - font-size: 40px; - font-weight: 300; - text-align: center; -} -.marketing h2, -.marketing h3 { - font-weight: 300; -} -.marketing h2 { - font-size: 22px; -} -.marketing p { - margin-right: 10px; -} -.marketing .bs-icon { - float: left; - margin: 7px 10px 0 0; - opacity: .8; -} -.marketing .small-bs-icon { - float: left; - margin: 4px 5px 0 0; -} - - - -/* Footer --------------------------------------------------- */ -.footer { - margin-top: 45px; - padding: 35px 0 36px; - border-top: 1px solid #e5e5e5; -} -.footer p { - margin-bottom: 0; - color: #555; -} - - - -/* Special grid styles --------------------------------------------------- */ -.show-grid { - margin-top: 10px; - margin-bottom: 20px; -} -.show-grid [class*="span"] { - background-color: #eee; - text-align: center; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - min-height: 30px; - line-height: 30px; -} -.show-grid:hover [class*="span"] { - background: #ddd; -} -.show-grid .show-grid { - margin-top: 0; - margin-bottom: 0; -} -.show-grid .show-grid [class*="span"] { - background-color: #ccc; -} - - -/* Render mini layout previews --------------------------------------------------- */ -.mini-layout { - border: 1px solid #ddd; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 1px 2px rgba(0,0,0,.075); - -moz-box-shadow: 0 1px 2px rgba(0,0,0,.075); - box-shadow: 0 1px 2px rgba(0,0,0,.075); -} -.mini-layout { - height: 240px; - margin-bottom: 20px; - padding: 9px; -} -.mini-layout div { - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.mini-layout .mini-layout-body { - background-color: #dceaf4; - margin: 0 auto; - width: 70%; - height: 240px; -} -.mini-layout.fluid .mini-layout-sidebar, -.mini-layout.fluid .mini-layout-header, -.mini-layout.fluid .mini-layout-body { - float: left; -} -.mini-layout.fluid .mini-layout-sidebar { - background-color: #bbd8e9; - width: 20%; - height: 240px; -} -.mini-layout.fluid .mini-layout-body { - width: 77.5%; - margin-left: 2.5%; -} - - -/* Popover docs --------------------------------------------------- */ -.popover-well { - min-height: 160px; -} -.popover-well .popover { - display: block; -} -.popover-well .popover-wrapper { - width: 50%; - height: 160px; - float: left; - margin-left: 55px; - position: relative; -} -.popover-well .popover-menu-wrapper { - height: 80px; -} -.large-bird { - margin: 5px 0 0 310px; - opacity: .1; -} - - -/* Download page --------------------------------------------------- */ -.download .page-header { - margin-top: 36px; -} -.page-header .toggle-all { - margin-top: 5px; -} - -/* Space out h3s when following a section */ -.download h3 { - margin-bottom: 5px; -} -.download-builder input + h3, -.download-builder .checkbox + h3 { - margin-top: 9px; -} - -/* Fields for variables */ -.download-builder input[type=text] { - margin-bottom: 9px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #d14; -} -.download-builder input[type=text]:focus { - background-color: #fff; -} - -/* Custom, larger checkbox labels */ -.download .checkbox { - padding: 6px 10px 6px 25px; - color: #555; - background-color: #f9f9f9; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - cursor: pointer; -} -.download .checkbox:hover { - color: #333; - background-color: #f5f5f5; -} -.download .checkbox small { - font-size: 12px; - color: #777; -} - -/* Variables section */ -#variables label { - margin-bottom: 0; -} - -/* Giant download button */ -.download-btn { - margin: 36px 0 108px; -} -#download p, -#download h4 { - max-width: 50%; - margin: 0 auto; - color: #999; - text-align: center; -} -#download h4 { - margin-bottom: 0; -} -#download p { - margin-bottom: 18px; -} -.download-btn .btn { - display: block; - width: auto; - padding: 19px 24px; - margin-bottom: 27px; - font-size: 30px; - line-height: 1; - text-align: center; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} - - - -/* Color swatches on LESS docs page --------------------------------------------------- */ -/* Sets the width of the td */ -.swatch-col { - width: 30px; -} -/* Le swatch */ -.swatch { - display: inline-block; - width: 30px; - height: 20px; - margin: -6px 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -/* For white swatches, give a border */ -.swatch-bordered { - width: 28px; - height: 18px; - border: 1px solid #eee; -} - - -/* Misc --------------------------------------------------- */ - -/* Make tables spaced out a bit more */ -h2 + table, -h3 + table, -h4 + table, -h2 + .row { - margin-top: 5px; -} - -/* Example sites showcase */ -.example-sites img { - max-width: 100%; - margin: 0 auto; -} -.marketing-byline { - margin: -18px 0 27px; - font-size: 18px; - font-weight: 300; - line-height: 24px; - color: #999; - text-align: center; -} - -.scrollspy-example { - height: 200px; - overflow: auto; - position: relative; -} - -/* Remove bottom margin on example forms in wells */ -form.well { - padding: 14px; -} - -/* Tighten up spacing */ -.well hr { - margin: 18px 0; -} - -/* Fake the :focus state to demo it */ -.focused { - border-color: rgba(82,168,236,.8); - -webkit-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - -moz-box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - box-shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6); - outline: 0; -} - -/* For input sizes, make them display block */ -.docs-input-sizes select, -.docs-input-sizes input[type=text] { - display: block; - margin-bottom: 9px; -} - -/* Icons -------------------------- */ -.the-icons { - margin-left: 0; - list-style: none; -} -.the-icons i:hover { - background-color: rgba(255,0,0,.25); -} - -/* Eaxmples page -------------------------- */ -.bootstrap-examples .thumbnail { - margin-bottom: 9px; - background-color: #fff; -} - -/* Responsive table -------------------------- */ -.responsive-utilities th small { - display: block; - font-weight: normal; - color: #999; -} -.responsive-utilities tbody th { - font-weight: normal; -} -.responsive-utilities td { - text-align: center; -} -.responsive-utilities td.is-visible { - color: #468847; - background-color: #dff0d8 !important; -} -.responsive-utilities td.is-hidden { - color: #ccc; - background-color: #f9f9f9 !important; -} - -/* Responsive tests -------------------------- */ -.responsive-utilities-test { - margin-top: 5px; - margin-left: 0; - list-style: none; - overflow: hidden; /* clear floats */ -} -.responsive-utilities-test li { - position: relative; - float: left; - width: 25%; - height: 43px; - font-size: 14px; - font-weight: bold; - line-height: 43px; - color: #999; - text-align: center; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test li + li { - margin-left: 10px; -} -.responsive-utilities-test span { - position: absolute; - top: -1px; - left: -1px; - right: -1px; - bottom: -1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.responsive-utilities-test span { - color: #468847; - background-color: #dff0d8; - border: 1px solid #d6e9c6; -} - - -/* Responsive Docs --------------------------------------------------- */ -@media (max-width: 480px) { - - /* Reduce padding above jumbotron */ - body { - padding-top: 70px; - } - - /* Change up some type stuff */ - h2 { - margin-top: 27px; - } - h2 small { - display: block; - line-height: 18px; - } - h3 { - margin-top: 18px; - } - - /* icons */ - .marketing .bs-icon { - margin: 0; - } - - /* Adjust the jumbotron */ - .jumbotron h1, - .jumbotron p { - text-align: center; - margin-right: 0; - } - .jumbotron h1 { - font-size: 45px; - margin-right: 0; - } - .jumbotron p { - margin-right: 0; - margin-left: 0; - font-size: 18px; - line-height: 24px; - } - .jumbotron .btn { - display: block; - font-size: 18px; - padding: 10px 14px; - margin: 0 auto 10px; - } - /* Masthead (home page jumbotron) */ - .masthead { - padding-top: 0; - } - - /* Don't space out quick links so much */ - .quick-links { - margin: 40px 0 0; - } - /* hide the bullets on mobile since our horizontal space is limited */ - .quick-links .divider { - display: none; - } - - /* center example sites */ - .example-sites { - margin-left: 0; - } - .example-sites > li { - float: none; - display: block; - max-width: 280px; - margin: 0 auto 18px; - text-align: center; - } - .example-sites .thumbnail > img { - max-width: 270px; - } - - table code { - white-space: normal; - word-wrap: break-word; - word-break: break-all; - } - - /* Modal example */ - .modal-example .modal { - position: relative; - top: auto; - right: auto; - bottom: auto; - left: auto; - } - -} - - -@media (max-width: 768px) { - - /* Remove any padding from the body */ - body { - padding-top: 0; - } - - /* Jumbotron buttons */ - .jumbotron .btn { - margin-bottom: 10px; - } - - /* Subnav */ - .subnav { - position: static; - top: auto; - z-index: auto; - width: auto; - height: auto; - background: #fff; /* whole background property since we use a background-image for gradient */ - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - } - .subnav .nav > li { - float: none; - } - .subnav .nav > li > a { - border: 0; - } - .subnav .nav > li + li > a { - border-top: 1px solid #e5e5e5; - } - .subnav .nav > li:first-child > a, - .subnav .nav > li:first-child > a:hover { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; - } - - /* Popovers */ - .large-bird { - display: none; - } - .popover-well .popover-wrapper { - margin-left: 0; - } - - /* Space out the show-grid examples */ - .show-grid [class*="span"] { - margin-bottom: 5px; - } - - /* Unfloat the back to top link in footer */ - .footer .pull-right { - float: none; - } - .footer p { - margin-bottom: 9px; - } - -} - - -@media (min-width: 480px) and (max-width: 768px) { - - /* Scale down the jumbotron content */ - .jumbotron h1 { - font-size: 54px; - } - .jumbotron p { - margin-right: 0; - margin-left: 0; - } - -} - - -@media (min-width: 768px) and (max-width: 980px) { - - /* Remove any padding from the body */ - body { - padding-top: 0; - } - - /* Scale down the jumbotron content */ - .jumbotron h1 { - font-size: 72px; - } - -} - - -@media (max-width: 980px) { - - /* Unfloat brand */ - .navbar-fixed-top .brand { - float: left; - margin-left: 0; - padding-left: 10px; - padding-right: 10px; - } - - /* Inline-block quick links for more spacing */ - .quick-links li { - display: inline-block; - margin: 5px; - } - -} - - -/* LARGE DESKTOP SCREENS */ -@media (min-width: 1210px) { - - /* Update subnav container */ - .subnav-fixed .nav { - width: 1168px; /* 2px less to account for left/right borders being removed when in fixed mode */ - } - -} diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css deleted file mode 100644 index ede4129dde6..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/css/openbis.css +++ /dev/null @@ -1,16 +0,0 @@ -div#login { - position: relative; - top: 60px; -} - -.nav li { - cursor: pointer; -} - -.brand { - cursor: default; -} - -@media print { - @page { size: landscape } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-114-precomposed.png deleted file mode 100644 index f1c93e6fd97d3ff7d5cf07c69719d0ef7903b428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6043 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-144-precomposed.png deleted file mode 100644 index 3c80087b1e55553b08b721de22876c0469dcd0eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8457 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 AI{*Lx diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-57-precomposed.png deleted file mode 100644 index 34b8dd6bdaa38cb0a057c837ff8d36ace98ebed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2260 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/apple-touch-icon-72-precomposed.png deleted file mode 100644 index f77bd6c99cf13360dd9b0955c701274f9aba4fc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3204 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/ico/favicon.ico deleted file mode 100644 index e1c310e416b7b503c4ebd0855b36b58ae6e3a2fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcma)+Ic@?$5Jelw5$muGYhXd*gqVoLk+Ccmfw%yPZ@~z-4-o+*ESWQIKxFwC?S5qy z8ionn=yz5B`u}%JNMlUG{XEaO{n>mz8RHvcUK||dm_ObXW85sdcDvnMtJV5RrBW6o zlgYcPe0WBWXS>~gwA=0Ps75o=>9k~p=iwZ@XyTxrxLG)tK9kABB0LM{px1LYo3#q~ z!C+wH)@HM@y<YF8RSz|n%L(X*!=c!(*Q*VJz%CXGi<fmc9K;{i(|ewG%NUJDqCFmu zHlNSmAf(&Ss-FAkRY$M>%jIIn<FTB12a8Pg<DoAU3gRyoi_+tXTjaU_OEhTpPW+%$ zDhVc&iP*WTTrLZ@TrP#1&*v5|TD^}Rooc7ksc289ldV)Lg4Jpz996Zd*E3q*_w8&p z6K&kaOf%8qrNULKRYAAgwd?iz0r0h2O*DEJUiIs&Ua#9I$cCe;PT$e#bbjEJM@Qdi rG#&sS&cVCi@8A3V{+DLpYc`vAZ{VyPb29Lp&*#@55&a_k|BUw+Y!9}S diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bird.png deleted file mode 100644 index 903e4c78ef5b1f79be7aaa5d3d7feb0abfae3a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3092 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 Xt@P!?g)a1ef1Qb;Ik-muN%VgJi!FB( diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-01.jpg deleted file mode 100644 index 135c9babb0431578c5d0bda44a284e8bdd5e3824..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130647 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� 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�rQw1rkwu-pFt5a>{KX-U&D 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-02.jpg deleted file mode 100644 index 704e5dfe40596bc46f94c336f2d965294879e371..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84505 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[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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/bootstrap-mdo-sfmoma-03.jpg deleted file mode 100644 index 430fde2cfb6957b0e010889e63355c541f23e4cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50755 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/browsers.png deleted file mode 100644 index 73b668d9140ee4371928d95f084ba6fc9b1149be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19776 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/fleetio.png deleted file mode 100644 index 9207b0cb805e3cf9f0edceb912fee623a1f9212d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39837 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 Z|9>`o7|aB%sKx*Q002ovPDHLkV1h4V#G3#B diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/jshint.png deleted file mode 100644 index ac7086de1d41dda2e67698aa300963b332a0f52c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7258 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 a;n@V~du&xQx&2c}0cr@OQjOx9i2n!s6rPy? diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/kippt.png deleted file mode 100644 index 4afa772ccf73199892bd24c0b6ef0067aa69057f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50695 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 O5O})!xvX<aXaWEk5)G^X diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/example-sites/soundready.png deleted file mode 100644 index 2675ff9117779db1ef5ad72091f2aa376270ecc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53979 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-fluid.jpg deleted file mode 100644 index 151b987cb7d16cfef4e12b65cc9f2514889686bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25832 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 ZyeQ8<(*2*Yguh7m$2)&-GMvAr{tFNk6Q%$F diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-hero.jpg deleted file mode 100644 index cd4a321078634534b389799f8ebad03583a86f2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22280 zcmd?QcT|&2yDuDilPX1e4G?-S0hQ1biXjwfqLd&lp?46aBP~EE(hNwIB1C$VUIppW zr6XNHK@|1ldH4Iid+)W*^PPRx`SZ+LcQP~A{H`+hH8YvHCV%GstO0Im1vonb08pq1 zfE@6j>CXXxUenj!H4s1mAil1K0|0;4h{T<Id_2ICl4x%UTL*VLq=daYN;1IKLsD8o zN)n)YH^9Tz-WBP?V~2d~jK0lx-1?4>$JyaF-+g%lDFY7;q?5C5kQdT8$k4<-$kkri zf$#1e9@PMF0LlY}^s(g$K)Ip4!2!4V{=po4o&T#^l8@&fO?+H$^FjWS%42Q-=h1NY zLh{H<NQv7^DM<4u$Vo`cNh!-Ii}A=vNlQse%ScKoic3p@<rTqF(mel6eAm*v92~(2 zP3?cmx-Q-3`=?R<{{9mFvJ&oIk0qs*m6au>WF%!|#IIY3dk3O@Yy-s6-u(aKpo#Rh z_j2~|adt=Z{Ke7M&fVANHs7_T|6u~k<KJxmmwokL8X6e<|2IXU{_22#u=VyqApcX} z|0QE@lRyuoBm(K}?(1cbyl&3_7uW-=;f1vIarZKDcX#_&FT$PNecZjB+&y?SjO8Vy zc?@jrozZ{Q`~zWN0EVKyeQeS8NT}v*zH1&5&dv^CEom)nC3SUqIXOj5X=yEKC3!go zWqCPSd2J1OWhF(We_=J<?R`;5w9mh=4*!W&_*?8>&Vcf`maK{Na`r<yXnVP%c>ZBD z*!k~uk^NhK|HL}{y)JTpi<P`qM)I#$`(Ix5zpAeN=dbL)9rwEMZ`Vhnul?QY+Ohu} z0cif=t^kM5>j6aYXAuwyApCbCy3P?1Uw;x2lMw%vNJvTkkw{6&$jHgaNGT{NDJdv! z{P#paL_|bFOhQ3QN<mFUK}AhVbDd~u|Iz55UpM}v^xtv+F8%2Q(32Ao6NC^E&;tnR z35e(k{`3Oy*Q1<}h~TgEuPK0-gou=kkbs<m^1AL?%YPI8vW19{jF^O+l<qo5L`XzL zPDXld0NFL++8O{o2?HtbO)_adMu<_tgbcqidCC-1I`jQoww|@>2(L*2tl2YJ779Ci z6JS?rAzq_ike=W#BoPHE*}tR^&=c|!k)%u@q#;J045`G7q_%uscxIL_&uY8YWXNv* zSpeL)R*8_Fh#qhk@Y^~d<(COpPFU6kD$2a62zPT%o*nL&@CTqH8?fueYv)BiI25Iz z$yzHzkl@;h|LK_>S|p;kun;;Rhf7U=Akv}+m1C^=VcK?T#IN7m_gIw69I-z7{0Har zAGG3P88%RGe1(M?38)rU9l%Z^ao^G5OO}3zD}P!a(A=W7_Uz<_zQ!4Q3Xkse!Xo+y z<4}@%*BzU~12^W;uWy3dr3Y_Flj=7_boHBOPZdk*Y@P9QlGuDxoo2Y5;^|9C`>NP# z#=TI??~y@PDF+H(_yM_NG#K17h`@yF>d{z8(9b_%VX1MtZ1dAVZwaiOjs^ry5V?2) zmVputnO2B<G?ePyQJty*PXpjiN>x?)E3NUO35&InLlXmWzUfNr7qHac2Wn-D;hTJa z0Qj9DNKkdcH(l}ml)56-b#6Zyb{Bo5_(0Y}@!3VU+f^>=t*><ri}EP}UvM7_?D4_D z-UdC6cFIJcB-la@bvI?sgH)VEYEe!&IS)pQ46eQOL4}eFlBG3wHqJr^d?aqG<u{p5 zcaNBfPI9^S02d>~k{-o+nYy0AUt>Y#X~?s8LS&3&HkxJ3S2XBr8rO_mOv~7V@4FSM zgv>K=8R<D`7vUJxjMj^vbp|?#_b)C1MJ)!fycC{VF1|&{zK73zSJqeQ7rhA9o%r7O zB2NyXK|T*Dv!XaQmG*-Mq%Gm<gwJDzYM!}z9^gt&_<xjf2?YL<qh-8XF{O6G|KYD^ z7Z*_Q%Y>Fe_3QQXJDV(yd*-_OKU=<jwyyIHuBv->{$znHjw{T7s5klc^>er6*?P=B z2;<kp>*x3Dzp&TrQg;5y@}E-vA;IRFGglDV^S>DM(eC|6tC!-R!H;*}Z7ZG%J^9t6 zvR8JebZcN+nG!ZNUiE`9oH0E#Lh%{t>L0)`t~Gh$VRqAt8_{NxIzds~!1S!ROV-3y zV6i(C^#{NZW9o?VI1Y}X{qBLApQ(A`9w`hr|J-mMyL895+3LaSJdIbgE&Y46hH8@T z7BeO_)udusbKD3C);P1ziQ(tQexAL`q_NELvU(Vu5AmISKF#fE&=14zN{AXq?wkJX z9k<x{;d_=C@1-%`Vm!^LEMhyTTB<PhCM?G+rvr0<B!1HZ;D7sDF#P6ik;}GZapM=e zibm|%de!14g{xGibq9)jQ33;#h>dbegl_FYLz)XE$4j*i$G10M4sL=uJ61A<?nyf> z;<I(hb=4W77i@)L2<%frH2@_w#c{^FY(b&XAX@dHgw9YutAtfN#Vocd20@``w<=y& z_GCI@L0D|%bMlyVj0NTo0M>#(JL$^`40vB|NtOwFj+R8r-Qu}wyc!>RuRDYUvrI!7 zileGc=5K-atdc}NiXd{D1tWZ1ai8S$>l!RRe==G?c852l#0(OrE~vxZ=&#C|x!*>S z4RMlO7GzD>J=AWA2d1Je{HZYr_u!SjR=;tb#M5tQ;?(0;hOysBWjh&TEW5^FmBCs) zJ`8^VpYM-K)G1%jKrJa%MZ2gl`%N@KeJ5D8f$`SnSC;K)JCnFj);+Nz$#BdO3lGi> z!b0+nmoS{{zj_9D$sa)0r@_3R7dJk=#y!csV;{!nf4n5y@%q^h_shhqxKHmq#(up1 zPmJPT*?++tUt@B9|L-u@9{5j8;y>m5pJ4u_+y5T(f2Z4Da{lM`l+yl}Zu@)Hdj4|| z{tvs2_S>-<E_r?9%IJE4H~j%H203v_-0kDaCW}u#(Yc--{$HltNNibb+^Q5=u45Hu zq@)!+XZo2)idP{ae5QtjU)TH(GZ19r`SS0HD+7{x!e@}JC*AKnakDy){!du^B~Prj zWAWX>-8fvsbwTyb-2Edtw!s5NN-}qX-uy1eE)+qXk(##6H%%B78O2DK?kAi?8Zk<S zi(*VCPR0I&5k19$s0``_O0Kl}-axkhX#*{eiH?CX?tmx`M~Bdb^CXQ2JKc#C4#%Y; zUOKCJaCba~*F7~!#k_Gyas9nVEBE(C|DAr+qUCy4p$dDViB$$oD>I{@Mmm^DIyo%{ z!T}+xc}}}cJ1F!%3<?gNxDieJy8V7c_)_vwp!cnq>=fWGDSt{~aeWkH^RkF~rR1g@ z>u-}EF|kYB%3<;<-FJ?EYLpK5ZpkVgwBqxWwpaOiSsh^vYm<>cKu%;5BWJbFuWmn> zRa*1OFRnd7t5;u211Li6?731BsAkzEfc12RiJCN`l&8+qKI2ZD?#mMwv}13E3?I6p zSsou6OeDDSQhfH}(6>n0ybDA%m2^><PU?_QCH2fhpr`kz+Z4KcuGWw93yz@l4P#R) zWkLGQ=vJUX!-M=tS<ZTpW_cgBfLzC!2kx8o@Pd4PG=VGF&&Rt=g}eA?K0N-}UJ2}` zOMhz_CX+E^2uu#W-6uB3Kv0YOb;+d}n6mLc`lnZ+o-=JPb~1d?w-mt~RiN<<mI@&b z6qb{y_(mfMZSijjO2%}3STa9+#U$%xUTNV3GkIdi?%C^&jkKs~cWFL{;8t@McQi^` z`3ruj?pIcFJr)h$GhSD?iSCis)+&X^V1L+bgEQKP9u-@f1f;l7r#-ova;r-E1JJOQ zel~Knl>G3$soUVKSGUAVkl)c(lYwJA#48BMR2b66g<AB<)h;Tp^<5*a!4Ll_&W+h$ z18)ic0N5m*`}I;h``#A!g8E3(%gI_Q1cXc{8Fdw?n(it;5Pk0><m<abMk|@tdl0kH zvmC6VA?C;n!~E0-meOtHR;!K|l}W;$DjX96p4jXsj~UMFb8Cak>wW~*`&->meoLR8 zGfmRCb}}xga3y3tKtX-8eDh3BxLD1Fl44qE+`aYYc8rq`_m=loeS063Y)9kl#bTv= z!?_>-RX@xt^%PTTZB;Z6p2ZUSf?x_TgT#nf_l|~<z05JmVY|CG&_|hDHO<5t%ZpT= z4F^KwrCTgn9>tW@gU++Z#b&2;YV~CHmn!b6FJBzzIXG<VrO<LVO>wEvc5GDPOHXC< zQR2KVAYJii2hX}Aen9_zst6xpKWzQ=>U%bo3khMw@UN&R8<5JRE;ZaFIIpK9R9EOJ z`#r@!fc;On-;e$P7JCZvSohr3WvpVtd_EDidF!LgF)xNU&3C|Ahkdbia*T{B<)TJJ z=i^?em?`6o{Wl+up+U~c_Kf?jiYl=SO1J!+>qt+f8JD#Cein=ZYky6%NsKOs3dW7Q zcmC46jN1FXvNU(@u;%?z{Cm^xmg-(n^+ci66=GZ?I~>bl4!5a@UsziZIJ~t;wypAe z#mZ35Z5FJ`!Rsd>>6P^d;Hr(bzMMq#*4`owU!>Uu-FxfG#TW7X@Gz<+C~^E=UI=<L z_S{M+V$V-eUi2m%3wH_w`=vyX6^aEh9a)i6M3u*(H140&cs1dZS@9C|)4uT6Z9DYp zUdeh~qepF!FFQBSQ2%g0D9N4cp;$Z~{z+Uj&svSGlDpRL*h;FMeDJFN>W#bVorl0_ z>JRlE0bjS)vi2j`w9}}ep{~9XbTO>(7DRyMG<Q`aDH&&r2kU5UrrYi3OIerZZD}wT zlDI@r=G`A=PIn_70CtbUUbn+~uFBn&u9j#aEYqyA8qpiQAJlpJ5ow#$!-xku7jXAa z0@8{sW<UM_rY73#nba-~=iOJw7k<v>#^LR?r)llFLjAZe`66&3jo<D&hTy(QZY$b` zbn2(!PcMHB$}Wa^y`#~L_8OnujN(t-5U;Gr%G8LxGbDn5QWC>G%>xqpt+obsGOJ$N z4KD`MzFv%B{5=>Yjvt6cww+)a$0KZu`P7ZdJVd4mz)p7`9c95i!_HeBRY|Sln2vJo zkZsYOFte){DJy|9R?iT#_`;Bqh*KZufnru}40jglV?w%0aaL#=H+AOlfI~+@NYULp zM|2psDw)YWGM8o-ik2uc*q*y(P}uB;ym#1xkA}e3?8Q0Nc%`1!bf(V}J3}VvcQ&LG zA{82mAJs*%dmsjJzaE}Wb^LhT^yA{}VZuD->;N6760M*S^hRV!vs+{CbX!!DL~3sd z!Mvg8lZl`Wia7uE_e&|2n0v$VdGflGc-enjd&4V~)9k5Z2e**wVZ02){@gE^W!OFY zWFpg*)H$u3;S|IvPx$e_uxwcIpLkwbU}{OjWWgZyz5ccyBkbe|s<|v0mh;fJ_n|tr z`c$jwIn{lC=FxuL2;dOiqroL=mVz-o3JrW(8Ic#(+o097%t8UEX&KRbsluk<&I|U@ zw`{z_aPtLgnm(iQ?WXs<qL$+q!c|%zgh6UyfzOw9VczDB7N7l;lA%%i8%4aL&#$7P zm<1DghSZYbNd^O~4)N<<({xWY*O0Hj$)3<4h$vHkI*0VyV*}$S(YrAE6*Ui#+QlUG zuoIu%g^-@1qh_U1kLH-_ndhgWMgr*~@cx<tG-XKr15>1=(NSfj$S@Dw`}XqFIrfp) ztr}rRRR;&U57^S=))azIauQh%`w<&xhfRHuL{ml%0yE-JOyX>rR*^^+`qQ8GJd(p` zP$4(T;3YjFU-)FH)nswF1cm^l9t-6)gDR{#$wwaN=WB=c^NS}Y9BfbTEI2vw-YXV4 zW~jp{6~&Xd++MV>tb%-T&(BvAeWGB@$?27kVpvWZblCSOjo%wj65b{e6W-GWYQh~x z9fQ16V&XHKGGm4{QX8KPnrZVP=^Cu{3?q4GGfJj2nX$rj<VF;SJn)bg@4!#8^jx%U zh|9_nGGFwcHb0w9od^|1rt`xF)!mDN?~ay4Y#yG~@M@q{b8}g2TZfR9-um8)aNqF} zCp}bwF8@P}AHejWDEkK5-7rV5N9lcTKJY!a7{#rNdDsSNKi*e%#285~E(TI#6ezyW zH+}Qvup0-_$%%UfbzB(J2wg#mEGl*{P<K3<kbN?}vMH4=>13L^5`s%kS+Qb4>5c`I z)AKlZCW5Xi=wA_mdW+McEStD=kTdMLdaMYq*+DyTz5B1M1@!OrI93g_k_RGGYy_gK z1k-d75@-vWyuFVs%9jcWOdq_`;;37=bmf&;l8mi2j8FO^+`RUt`S1&FfTe6v#Kdn) zNOeTK1uI_HmR{hXq=o{5p;Qn0Gd_g;0T>YX`!~#{DRL*pWTGA37wAThfGk?fCiAHT zo{BN#e`_kjMiG?3Svve&ZGpkrWP!E-;HcwPMv<Su%|}y%9yuPcdUmRD^{DC4bWA*# ziQB$VA1_*()fw>s0avPkGEY4r@Sk|X_6DLt(%#UpDV@`^m6O6}g;wg-DnNk|!_!e0 zW+}alH_?;%Uye?2{fZq+Co0c*u^aA(CNZ*5&thI`TvJK-<a*^obP@OVy8~RZP+6;p z9Pr-H(3m-L#3ZZUbIVk0u|EZfnG!Y$H+|HaD6kT)eJ}KoLj%>UsKP;}@9}hA^k~?a zx0F#0Plx+KQ%oloawRNiuZUiFKk`MXayoEI89AfvZjL~tLOz!BLskvbEzCAtJ#h)` zhxJp`3D3RCgNV+U05DV|BR#L!Ywf5~!wzACDTloKhB<qTw~VK$F+~mQ{+c9m8*$E( zBxMcE9p<`-ue(|!Wh_R7d%A}TxEJ4hT)&fF-fh_UPH`{mz3%aeFFzvHs1)H-+6Dy> zU&KxIhZj81n}-f6CbAY)ePlB(n3h||P@3EvS<OSbG=X%X)2WOSO5;|)r53fW<Q%;Y zhJ!tHO{`(|B&wXAyxrAjwh$0UF}3EiCoH&l$tP~#)$iQ}_m@>zp&Kyu3=Kz=2%lX= z_&8H2Fmz;Z4MI>|>h{<(M)dp)h0oecZ5mO(Qd5Up!?y&4(}8?@gg?lbc5#>s_&L_C z$W65}wQw|@HBNUMzh|lE1y8RpUj`Dv;qTaKxB0>~6Tj7Mbi49Z_MkhxJO*AHgRJ5- zw$caLx{WKKC_D~F&ev=0iTlxh`IbG<^J6nECgnY_1`nksG%GUabT)_;G3fi*IMW?r z8v*7r6qUv4>X#+&ZK>wOW6KKEq5ud44nj;wUdw{ZRKwx>f1>{YoUV^p7OpoSr|)bZ zHjTUT*T9AO#;(tUNYP+RsuUUe<wOt#P@wLVl9@1u-Y2aW?lO;xX^<gT$BVU%pGdTg z6sqT3d}tVEam`^b0jm_zcYfi?zTx%5z2TIumX6EL*`B;BjzAYv(_vxm2{o#Zn<gLz z7+*yxFjKg@T@hXoFZb~0dNu2M*$t|H;(g0`K9Bq*ys9=i^~6fxgjqz9GB-@`+{d(4 zMBx64jHPe*g=$61#xr+75rJ2uak*yN%Bq+W{83oZq6^|QUpY`{!@<kYVLlS5v}jb^ zGKFf|ungEYi|Ea<xL!Gy&}nYpuLZeq6yIe~FM5@AgfnYQ{m}*0N=;XaOr<ZK2bf#a zy&e2|jNY=zI%t}l&du4n!aC@Bit7d_ZB&)_CQU9ZAyVwb!^ES)eGaRlUo_V)zP5a6 z=*UVDuKdGFggmgo@dE?QL5z+%v5Rk)m_!VniBdwh^GXYff6NY2Nm2p!9DSOqQeZ<+ zj4Lf{E|sM-=xU@-hL)y;NsO834{DDX+SniH2vo|994SQS22w|qr8DLW%(?JQvvZ(Q zBI22eHMK$wHUgg~;qmEAcg0^+Aifd{q~GQwdrH{dX+CZwJBiADzw=m-W2U1-P}|rw zbsdvYiZ{pP_+4NMNrtAb8gK*L#lft|o1WuKsPK#{q42OJId+>8JrbVJFr`SKkQ#^F zxw({M(7mYi=W&UBBk7Gfar8?T84F9EJ*2RF<B9J0*jme%M$PXq=5uhAte+#ZjVWuh z0dz+@Ys{b_a9`g+-&VYUAuxor!wL!!m@D$LPJ^)X;?H~ME$(mQYlS?TM&4Edog}LH zX=K79!^MjmO@p7DL87W(qN0=>d0)tAOl0($z7VxSY5Gp^)b%xyUgoX!o}Vvt66?np z_(h{OB{aOOt$m%W+(t~}7&4`R&d2648O7EXW=Ee4x^7GaJ#OG>=0wRV6~|R>!h2G4 zja~BCy2?fFQ8i(U_(w~haaj`6WTQfCyad<dx$L~m2RQveUh30}uuuY;2LjgN4CIso z0zY}Imw1&YZztfJiJ15GJYfM)T9BoBCT}11OumSOLKLEKPRKw$9#1yyQ{klAt1y`x z89TnH@5D3e*}3Frf{#6X6Gwji<EE$Ld8!El<|MR!JuYhI8IiS>dWq7nmOWGrsw*&1 z!wSZqtu75o%<tGJ-W;^Q6FxFqMs5jtDp)Ov0lxuojf`Iei2O#UE9lXr;q1Ru7mb;K zV8H^}!dey}XB?VW=9P}~jhdKngJ~?V)|K8ncx4l==3lf3(|4AB=nfPV+n!5KarWi} zrEy6)Npmh*9yZ+4dRlwf3{LlW8M`~X)T!?-L{W|!Od1(w;RqT6g)mmZ$YFq^FU<G= z5-a!>Iym<>&d(uAuxktMTG6uQp`+d&#R3k^7-w6J=cjC_?wX%QJx`5r?nAgl$hm zsgj>q-(b|LI1~#sPI~Q4s)vZD0h{IUTk&|3JyWPB?H=n|{C?nIPCui_)qndUAMGlm z?>`XhCU?rXZ_5lD#}>^Ib<(Lvzoyi^Eiez?QA~NZu{a`=v8g$zC~v*3<|Y%9Q!~|9 zw>ypS^=uy!4Buy&s%nkSA#_xJ@m?j--2YZr>Uy@_mW!p8`kSuq_2+NA+!vJK>O(#i zZb(eV;~TG1EJeP2i5wsj;~hxj*U;tp%+VV~sPbu~LdP#$l#^>7u6}g`+O(w<lcO=Q zS>8zZf?OOrzMc9mBn`Rr66}*N$4)$&-sk`>XP65hJ2_mtM1Cu%mjbBMk$kUwdNX)w zJfQ!8x-~X3*G>4IA}d3iF)AHX^rlCG4MC|MT#oF<P=COt28^3&>^hG2S3}|mzV8Lb z@C)e;Ly<J#%$X4oAj%ugL86IyGv6KI-EVJiXIsLESRd!`-LVM_8F=7(!MI<oRLyd| zn|Rf|@`!}^2MI}r;-ddgofA3cX-X2Z^q-W!`Xekj!=FKnbD|V{0JC5i->9PrRKIGn zX5mUK<CC!=^Unoq7$x<a&U3C|8WojS^ZH4gaKR&=;TKXJUdKuT<>eq_H(>O0#uHv@ z@%ofsJHrM&wo9CMMjl@zxa~KWWOWuB2>Q`eV$%3joZOeh3ZNvsy-a>{QRXEVBIMHG zhZyQ@%i(SQ&6)JYv@a5y91Qn)&*W+ljonKi3J2K&UJh8WuG}p$sH6PNp6(@BzYSwu zdDCl5##KnBgSZSp!aTBI^%MPE&NB}&hVx@X+3$fCkGGCW1r;&<BQdP`_OnS21r(?v zY;>}SGE^LcC@9;7sTP>>m$J{~sswxvel8F_AtJlYmy4YlpNdz1l}T4JAXc|sjKQWe zV(27<?`ZBOeP(d1Hnic6*47_NW_%}aFcMy3PIT)y1gquTTcH(=M^G4GaX8)2N04*R zeX||odB^zAgWJm{Z|F8?I(iB+rn!LE#uR=${nYT4IcxbvQ*H2=Tt?<tXD=(6d2Trk z32&TO(~_GviY47grap?W$b$z{-36(toitea>ZbALXe}PoOMYP3-{+^kcp_{o?DbfA zay@>j(|T3R^y=d=+#I^Ay^bl{QYof~Pe0KZw4IOJZY|ZrXB3OWXkZ5c0>wPEe*i-4 z(F2OMj*e^R+tPvkh;2d9T8B2}A##a3i*cb(qXa;`b>SaEh_PiD28nPkuiGm5M=Asf zeOvrp_7suvaY?Pi?me$%U}l>>HG3pQ0?|veXgZSW0JzD!$-vaCQ~^gzN!_ft8+~o* z{mHELyt4&z%v+bJmdNt!LrgMSAhBSON}3m`p@gwdb@1C)e4=`u?o|{})NHXB4pg^? z<!B9Ge)qn5fhInsbK5~@@mM2_t^XcC06%32++fllN+@f8wL-!RHl4S(Q?glAp0-Ij zBDbMYeXvr3gJ8NBoq^L;5F7)S2)MFNfVcoK=ZWw3Dd26mT`NQp3dv*P=YXvYC1vD! zN<>L5(kgYpVg;NL93WyEvU(8?a#K`CJ~~8zvx`l8$I&gf18Dwza%P<w{+W%<V-Jo% zERg01{GN{Vq@*?U*^v9qf?BuvAY;g8^6d`Z2EoMakYr~8BYj%9C{U-w*Yn&h&!9~H z94w#VF_@V8q2HV4i1Wayr*=Jp(x=bbX{?IGnOG+Mr-;Zoge`zLGV{mdy#9^%v1$EY zf!ROLJUKq**qPkV<akT3HL&>BbHo*1%OZ4MCJY?f{e3w2HY%ZQLHcOpe2ky#_aoiZ z%}B%e4=1^}OaQ_G=#1*C+ykvsz?o^|cJDxTPLtn%D3Vt$l27iJDHlm55LC0OdRyLA zC1P)^0q0=UA--@DLV}%TEP7fg-Gs+B8m{y?GU8IBm%hY?iZ`Xp6;+Q`t?m(Qlv8Y6 z4N>Vg^bI1tr61qUqS16VKjYo1*7KU4mI?pr5dA>Ix|!0jevhn8x0abl`6@pF?VJ*F zqkUz1utI$i^Md2snMNY>OA(m5&SgHO2bFmeaAb*ecEHfPYE@AJ_-kN&({W2DG$v!C zfZ|45qiOZfsu?4lc6vBg$aDZe&$)|6+te!hkTCQXweqIxsc#MiW~Ojy4DDD5^5yC} z3FPlVgy06@H1}RLgU$rGd!79m%DMPipJQx{jTSYlgN=N`p(w6#aFgUE3UZqhm@%D^ zfa-6W`yOz@&O#xmM!y9tLA>B!nZq_kH4(gHf(I`yvfnwnt4OB0^UTii-mM>&44l4* z?C@vn*8Up%6f&88YIL+`LSyv#yV|ZjDl~$7#==3e)bdizvM=eUbu<upNg7M~1BBRJ zqbAbbW4KMvoJDSMPOYaRL)|v><d@N=MwrEo;S=hH!%DYEKqoH@eD~4`wB^%!S3Hg; zZ?&vBE{!XNpXWmy=!RHL$p)`TaJZEfj3++${;E5KBtQFDzHe0hN{gL})X#J%#ZJr5 z_<C+bZBH;2D-}B<J3miTqQ%^jM#wA|m4?2%iHVu1+X=Oj5HxHFRKXA`ZiTHki&C+3 zG@tJgK*Fw%JuU1*8^h|tZbDGkg}{e3Z<d_oQ|5#jIdrx~%al7Zzs7hU-)=J3e$2Hg z{3RbV=S%&<E5}xEyqXdO8-2F+WZ}47wq$D$9Q`n6^o^sdrR~toyKiyd?!3w?-MxHq zDR<ZhvbJZ9-3*g@XZ0X(;{BBlS!Sr}2YkV9`y1EOs$jFlpJBzbdGQq|58BH*+Gfjb zX4(e>e!2U8{PiLEXEn==$*=Y)C5ht)Z9gt7*BhH@-&Gy8`~ftdT%3hwQtg$W|I}Y? zZTCCdUw-_2Wt01w_~j4aM@Zni$G<=RH?r$BS?29o&qsv^&L3sJ?~2#eRSoX<Yf^af zEEQoD(g8X&#BA~JKKKm9#o|A|d~W>sO?_-u)vSJq)bH`WfWdfXh%OY<gT^LxTB{im zUD(v!o`7b3&iK*bN`G7G13dMA5^wt3)8wnPv*AXzOXR0yxhTmLQJRe?o;+bgtwfl@ z0nxDQVb}*gA?u;Io%r9-kWUp}rHcCR8~9_kW4`o|Oe>j3vpMRMo<3m<c*$<HMjdq; zuPIJazqjfu5H6;ZiEn3GuX{0;D{(NpV92#_ItywpS5>%wRhWi!mXGcds!V8R66@`< zUmc|M)wY8%;yBf#FjV%sRJ>zk3rxKuUk|K&(H)LbJr!r4d&&pj$?P_yIB0GpKRipe zWR$29WUqdSm&WtIliyA5_7G_3@TzB?S?)-g6Iog&TpCOcva{pk3;eQkKT~mD_DD<6 z(b+JwInT<`ngVlYARIdsofVr=7<Gq{s`y@0&4O=LNGB8@P(bWwSvxY$H*)x{QOUr0 zbTm@SBerBH<NmVm>}Y$Ed1>QIZnvZ87n0ry@uObmNj<MoO^5x_iM)LR#6(35u-RbL zf@|&DE^X7d7B3PU-`-8&?P~3M5IS)*l`0kUBVzyv?cYGuVXLGzqHyta8c<^TpP~a6 zFIR$gz6CK47T3;Dq(|`mU%k-&GqFME!BbYWrhh8@jHXDO3VH}j#X-p4Yw7Fv&eBWY zj4Z!Pad`K<<mS=mclXUMb5~Rv#=bpyC>gB)`F_v&51?M^rN7pXmcV}y&PKMr^bh_Q zz&+WV0l)c`z>tnx^JHtcOMg#yhc2`1?QVMq94)GRkj(61=RItH)4=N4_+s&vpN%sF zrMg5uWNAX(or;^|iI~&U{GKrX+~5M0x9NcFmv(cD+A^v8pM^XBZqE4ou;c$K4EuLy z$N!UV|Iar6EpDrZi(lOcxeLVw2!EoT4E3QUVPE@kulm{QtLw^d<Eo7AF}rtK$ifr9 z{1W=8_Qj}!yXePfE=t9ouP+}Eb!mTplD7Z<Ff>Bct#0(vd8(ozLj3QK{Qr0H^xyYU zZf{0y78f6IEzxW^qMdIgzI?Z}cE0{<TQzu|baFm?W$lCptBMa8FvNn)Ksq-e4Ub!n z&-jz)q)Inx5qOLB-$8~qf!wYR%qy06<eT*3ne_~{Q2lwH121){Yp^XD!>Rj7%4wzt z`ky!h#*Xy&<06_6=PU8=<`ZjAn)K_O40K$moVwcDu*d@0O!+(C2&gF4hhTDy7!8lH zZ(-Yd?vP=}mDq(73)()<S2gD=zON$eshU<d3Jhl()7F>5xPd!4NXx)slxq8Z)1I&H zBMrZo@-!BLD}c?VH*yoWPDfWgn{OtWfd<y>^Y!$rKF1@li;)k_6>8Ut?+nuX{C6}F zG8A-izV<oUtbdM`==$OYx#N@WTh;DKCr_wX?nP||kD*(gCRW<3`Xf%Fb-b^}-Ez-2 z-s>mG95=u96VooWdxXsI->@4TbTCeRu_o}n@awh}`Hqu%EDTeRD^|eG8_gbPy=)9J zCK-LhJESal{(X6FyWwgZXW$Bwuwno<g0|x;nX^$*O_>_JQIc((uxQM<^v{hq%IzbG zOP9BPCW~YIx$)8N6yJj-V+PhvT}C#ShPzOC&YEd-UgM2NMOEz_qt5lD>jUN;b|=z) zJ?!0(f$pUVzbE&^TV5UNqzf@@yE3JvtFUsjkIjG#^dfuoRIQOT<$AgR#+d!2h~pbO zaIpN;gX89Skq<|?#HtylMhlyAHlYMC@y2pXgnOsU-L`Sx*Z+1Z+7H~apid%mw-~=3 zdMz#ugrE%dQqn-E;^YQ?@Aq{*AfG<!Px%BynXk8}xv_Yai|sU9m1)MtBv~(In}V(Q z)~GhKhrG|7>1&kIH+VPJ8TCTxfrG~7h;j05pfhZ|-X_9zDb(u{6W8V+$=QxCabO)- zJ1dJ14<-;zXW>nLMx%NE)u7rRfLu(j=joh8)Ex%8jO_bNq))fM?~m~V+Y}|{*yDpc z+Qv|aZ(k0f4%(EC>Jqq?UBHXIAcJCR@tMIRtc4zIHj#1$5;~3U2<i0sLHZ>goBLkt zVDsogDhGF%$;tXr+U04bw|hS=0kg7;Rc3112m*7n!gRdmcS@gCQeVPG;aJlo<7$0t zA5T7aN5t*_HXM6+XQVkVQs;g38;XmI&dZ7z7*v9tl>AgG->$f@2^_fPHhYaPCaNUC z(pjCYIKGvOV4_VOVJ4G9_sG-{l9lF?Qp;wngY)+{4z9Luo6j)_@u{8@x!)Z!BA}K_ zEf#(~dk5(sh9XvMY38j2%f!vI#?g!nK?gcxyOkro_={IJ_G%`4g>l8anv7+hpn6i( zjNkU+^&h{-mz;Thf1i_DxFuyMwbcLK(PWsR{Dvxq@_}U0XP$XpnBo-V0)6cEM93AK z*Ej|GZf(Zv?8@{sf;F~EDXLn{v!C4^#*nBlt~TdNss1iM-2Rt^rqbL%@u6x9(xK=c zvds!rj8J=8f?3BbcX{mv(3d{bMZD<_C$_<h@6LTcb_;oLuB@EU8HeE&rSfz?<p>1n z-dSUzqG6C1*rTW?i{nJc&fXJEOniH$d^2`XHZg@y#?mtIgVKhxR(N$fU>*@(RSXo! z|3;RZY^hI8Q|jQjoY3$-k_lguXDpKN(5V=o3Kby`AzhFcx_{G!I_j^3)ZKnm*`mF0 z(Y@#I2TrST4O7BFqN#{*F<)h$Vm7o=*-49=2AnfAy0Jj>u^n1b<|f8uRt`TN3IKtq zJlTfS8BG|{xn}lsoYvX7bY6RTrWC^b?Y6gNj$~9XT_droY@X+f7PdT}5yMpFlx8VC zM!$_AmLDy1#s@R;-YE`)S&QVcY&0P0Jad?X5<={D!Ls42?RO|LSLfMJ&W+h-4SBj& zu4l#St0%Zu%N8+T*u#Xf;#p-rg)f*zGn>(`SRzdD3uaXyG9&!;o?v8Z_Wq*YP?+uG zqGpOl&WufFy;x&ZQ*`PE)I(uCVyU+ZhhQxECej1NHO0?JvPR_OxI1sn(b+to%G$Bw z5{Lt&wo?cW8q~W8_7RJo!|&_wEe%fi{Ya@joh*6$s3a(YTtX)){L-nwFfs}R;lEFO zX}oFrnHN1eA2IsqgkJHb-h-vNwj$kTid&bS=7XAvpfOK9L$V1JDjF;AbdHTYuMXc$ zDpY16iw)zRS{k8Nq7qw!Pl<_$`7I`uR6oUG6J;3WXdQ~3f5T{HTIzb`?dNS4hS~-F z1O-iJ;gLoC`U9NmH+e<CIj}$>%h(zqf8uvi4#oSXX~UWW`tz*sbr!_hMc7_CfqH9} zq{V?>X{g0Rx4Y#T7y$}`ogxLkE5y?^XI6^fuR<@e!;XE<4DdIkbDlfwTf+Og9Vuv_ zS`pQ_zIP>Bdssf{1^(@gVuTU>4iQohH6T!oDSRr96G(TNS(&W5jb+w({qASdadhIV zOh1K*Wbu!{g4P#FTAoEt3G+m7GraH3PNA9zNHtBHG@r{!(_wsGrhHLDIXS{goqtaN zBx8~;)=(5#9^_`2C~|NgF!%O>X)p!Y`o4nTYIcvz6^C=JC8}4o+9i7i^{7CgK$FSu zBJ6bp4S&T6UbZG{KF3NtAuSaa4V|eo>t$hxs^lFYgqU_qdgK7K4ufd=ASK7B5n0!b z0{s|@@+4Rmzt|lcJ*RuXj}TyVzUgd9kMq$_7$X~D%XG<{m--L?<~n?dWgsXi3e@;= zT0@U5D&CfoCXlWQB-9S^6?&bh)w?0HzYtiOGc=rjOWhW;nGqrjoEUW$T!S@)zuYqI zPNo{y8t_G0+-i>d6mg1qWml-4GJ<7@$!K<GjzwrqM)Cl*+qFM~t03jND~tBQ$Xd~* zc0PYW>8V>+w`C<09W`U!?~aHl1lD_TLHRzzo>%9uFtXeIXv#QkzG2mRU-(n>U_Bw@ z)5%=g2dj%?V!+#-lZJSS;D$R^aP!A4aiUb&UQ_{OcsOQ}5-CQOP&#=k|3W;;$TfB5 zxtU2#l{KJQ7jCu@)WZUd9&x-&g<QP>t6eh^sAJgwt$bvdp{8&h-dqb#v3I41P><Cs z*rcraIU>JHuXw&v*4>JFO5of}NIt$3^pWQ&L1O^iaOr`CH}xHD8HurxvDAs=f*Hkv zLaxnp0SqIqhO@;8{Y4{JI|Aa&UY@drIv8_S;)sy(I8umO`=pE70&W2*JT;eiK_a{( zKiN!!7a|Ppt49Z|Fe&)Apb`07cgm2jd>@btW#o`CVym=7z`+ggGQvlb>iVriEW(@| zQ)GGesoQ$=&#X|iAYn=12(=R|{rbXHJ)zteId;Z7Mbe4^`U}*DS2>0nSo;dG{UE+3 zLU|^+SACjvXtL9bR$;K|U&~StPg~Y;)-EN6-N;s`rg}hkT_+<VUi*XZOHLMAO0)6! zmoJNpx4od45d+ceMWjI^Qn6UqqbZ#soDe}9@;ZD$Vr?%i<*iHF+d`S9T0Z4yA0^67 z@cN{HOY#REuW=J~<<2}Fm*Wc!i{#dpg^g0S^G@3rd^}d(-x}CGJEJGJX1R@>c#$xo z_A+ySH&cki*xo)R-v<1=(@wKqnfs7}cQza1fXR$?@2ybpYL6}!(w%t%R<lA^?ikO# z<W#xqrZu=;+J&^;eSYIQ_7}0$S@QrNOHe`0L*!xN>#xyIb$9yXnUcB1D7M!vz;^b` z0^2qL_u+MgWy5R~)ax2(X`RhDZU)gRJs6q+VZ0@`&h<ka=4!2N1bIBE7&vL>iOX~q zz!a?^62^Z3QZ4{urpG_3d-e=fN^95?GP6x~823@t#>u)M%LN!W-fb+stTO-G)PTXD z1!Sq+Ak}*~y*4|1$%)*bto(esv1pINlZxWWz$F$#i6*%Y9tra_Hw6usZpJQ(-s10v zS~C9Z5(#;VXV-o~Nd$+{yy|4yt=&o&<8RK{ySm@AW4n&j4Hec)<5$AqK1oIKT7IHb zt$WZLKmU07f?}5N6G`r#Tdv`Q+?54;?tFK~Qjb&yhNdG!J=hT#J9wW&827APp(Ukk zcUB#Dbf>Or{CM@fPk???q-rAM;}Vrdl#4oXU8$Z3EZAVVJvwQD=4Jin5o?x`Ors(A z4nO#ZN%LIOn0L;jbWZUzwECbywGLshu<Fs<CeoGRCrs2&c#Un9@aOrK)`&^U^w;Y{ zP@$UN8}pE{m8Cq(WGRTN!&?af$2{a!cb>D>M=OuWK@{!`j43&&Vum1+QgBq`k5gXm z4cB;cxj)v3&o(sgk71=PRFhJd$Q(2t6=0GW>UdjnF<IeB?SuZ^V1N$RKVX)gENIG; zxDHVmBQ3)xUhC==;pQ6Bspt<+YN%7W_V%2I>=p+P0R2Mm&X*dvPy>MR`i2tvvE~Cc zI1i=}A#Y_${GcampI<pQ|E~LCu1}?IfGFz=t2p&buqBvrVHuxPSOc9}?DP-rlA+n$ zv)W&h7@9Ls*LS<GLgt@soGMt@le+b?A+@kDpT9*3V?siztNgoUsOyDsgO8JP`f$?Z zN%r_2JJLyYCW?YbWrc#JMJ|eqYTTE^By?cL>8OTvw^ymjL9C9a;itMfBAQ`+i9j;C zTd!DG?NEU%>N`oLc;EESi8ps9J}W9k+n~g@Z%1L(gsHLIP~<~=xhS5|7m%|@5Twg% zIlH>Aw~%|q5@%bpXQ_d1Kc+Mtru5mxsKKb>*MiFwJxj9))rk{!EH>mpO~F)*OGCnl zr94h21l4QD&mIK`xJh7!Q+NQu=(J8NZh_Rl>;vi`{`10n?WOVUfiF!vjA>l@S}jjc z5vxzSpai{pLN&lq&O?BF@sVL;fh1IWpkG%Vv-ilp=UJm!!-p2D5gBYo#08Nq)z*o? z8+=54x6FH`k^q!!ys#|8AaBi4N+sWBj?H;9Zq~mjZ;_UjOZ!9gm<G=@t{k&Mp*pzh z+>Hn?wFG1mk{r(mQ=JfeNNWn30+!JxX3|g<?hQhWM?oO4u|tgVo+$D1eVDPkU2mcZ zbJq2(9aG@<uUmdTAx|nr@wIyzqYN@2bvd2;?Qjaq=T*TA%j?2I%K3XL!D#!z1!)I# z(<whGj_lHtBk2-qnYvw{S^`0sNcJzp5V=sRaCfu}r39(Z@3xt!*{QScwC%m{^|Nvg zQCO_d#;p_sMFmI}AEc_(vE+n#`JxVHRk&Zy8=3cJvbzGak-a>B0D~5uz4Gf1@EYaJ z>rl%2YHAXyoZ~8rL9KrNlA1RA>wlIc)748&KU!1sML@`Bf`u|j235xZPPjQiv|+Kj z*&OmPW6T!u2!G`1If;$lE)u^NJzNA5o+t(r#?4fOcQNzE+-wdS5dW&2I){<QyudCX zWgLJ*G&)ADQH3u^2y|HpuNVX3DXDG`r0-#GwEh9aC~S(&a-C#y_o_xSIRkiSN3o`U zjFVV{N{ylVOBY7A1%DQ6#w($jx443+#a<1Pj%6Als0G#pQ%Y!9;m;6I5c*VzdSvFK z094%V)**$&z+;YsnEA;bThNK&-9qg`!Z=}~=TA@J21AZPbt|$AO~H<ocs$}%rmMc7 zKg-;gH#JiHD+6OV+BffZ%e}Xdhw019@LsfZlB;9Fn2aN|i&O)^#1TY2i?3OSFO0`C z#?ZD2=}w_}@ds`n;CPwGIxDTVx%^@S$T_ch-}?Q)z9wszLEn)`A+_r<Gw$>J`nE4I z=Jb^=eXbsY%Jl}g)~DDH4CQ*{q;%5hTcUa$3R(I7K0!Nodlc<T-B6n58;mQlvjBmn zkd~`^x7QvKqG?HH0xWJ#dIyhir^Frv67h3LF<^&0+oeZ9dct6MO+H&+-?3K!vHaoD zTXE=?dqN02cCVp<E#<YEdZ4Xe^al?~BMW8`C`=6kLG%zmD4%6E0zUjkC~H{t(I#Or zvCtBY-^0Y1G*vNRQ|I0~ySFeZF;J70{dBMV{8Ps2=Nb3y@5w9<U3$XFtml``FnBSa z$SfLm6jt-hCnqZZF7@=_d(~OjFbzLHZ6z0Fw5kuOgSRE(Bgd`P*P}52s+r!R#b>zU zxVj(RnIn^mSEf9=CcV*55gc&)j74C5KbT##C4&%4-T!pnV46K&hx45f`UXeYd_dM{ zE9)!}>6uu4+=Pn)&i#1rOQPsY@(=;#o7LTbl=d!gIwZbN3QFUITiv_VdM#==Bm#zR zHy!wXihKCzcaAv~JjmbWTfrYd-HV4t1&XZw87tCmJ<g3?3NVwsD{xdd?Aklpi=F~_ zqKa;?n1zHuS#NI<G)XN#XCagouY@As{(jU}-v<lNW3GV^s0NH{521e7g1)uJep33a zcRJD*C%r)7a;L6byupY`a~TK)$Ne^bLb|q2bF=EkP~VHzceH$>UY`3y{8+*zWKLXS z;RHhBG$6u5y_Hgjl4cZQoNF&6$|7=yn<v*sYnj3>C^h}Gziyvb6gE{>xcWfAW}2hG zoU2*ttb;wswnTb$c0?qj6LzIOu^b2~%eZhg0_%_n00sN^cwNazW`q+R=hEAFKb#ol z7&3iphy*V^{gH7RNB`Wost`ew9+^WIPc6XH+SoGO=+KmROhC;rmrO5KC(lzAvfpBx zx)2}4khIrr!uYmKn3tED-MI3kHV&0v*nRVbYex8$kLtux;lAbUfK+9k<3-KUg)W<} zqs`*Jo`i@V`#z_P9wyH|jW<%BwQ)&g^3)0~5;w8L!{mv7reNA>DM>x;cXB4Z`{~3q z)2c&IpwT>uIhtW{m%5zddbw?~5CQv|OANCx(s@`temysY+1hLjW_9{v^4SKY*8=3- zsTZ|+p1_<(UgP#aOMtx!YKDz^e?SZ0+46QV+i_%Ox^mQJrq7DWICCH78A#pQ$o~m& zHpmF8h*KcYVR7}1B`JJtR2V(J^(wYzjx7DX;%w=wCRlR_85h}buoM4p=6%<Rne~>q zWQHl;QZ{|vMErz0b8(f3NYeU&u3G)CJhe0rHJgo^Wn<08Qe<NYja7%RVw`RC3@2s- zO+M>sl;f+_NJ$}Z0{F54fhwZDH3P*r{Lhv9ecH^vHXRf%!=~Ap(X0k(4(toRKcS`` zb#$$_lyiGP!c>|)z5RZoM@{DR8y_#BrvCskVPPYMOT~*xZyYbC1IB&XsC5DcmhlDl z^Yc>{17jwuk6~fjk^MK?d!y>k-vp1eAPC@1R9fEvJ2L0*td{iS=r68_4G0W66D(2E z7-lRJc&i{?+`6}{SSXyX3Y<|;1+mXt$U~%OzZ9bAFpr4J-S;Au-vsG7>!Ko07d?eZ z#M2du&AGQtk1JXj@_T%JHl$EG%X38zYr|RF$P4}`K`Y7!>k8yZUJ_7?8RFRjqh!f2 z`3=+<zG|LJD8zn!0HgO*8%ZOc&eVd79+}Vu;V~3<r#b~A?%Z|vbyiL=zRcUAG-DGe zS<Yj-zF4{flMg4?H}WY55^2{WNhB>Osd@NH(Z00<>NcOg&+-FlscNa~RZXmY^~=gV zzj~0=xIOEnU+{%%|0JqTIvZcP=!fWeE$d0Pvu4g7cra#IQ)oH>N&CR5z7HO(!c`&_ zmbO2wq@J3;@8I?j<j*RDIoR3wexMfrrt6j|;I&B6Y%5}L`52bo>CsMFBgN_dMN+Ej zES8mtBp}c>(wW5)R<F3Gbb-dwX(w;fxEw`RjXv8ang<y-^zRQ0*ow);dTa_1Gep*v zN_>nqr?edJIPthJ0ZbI_kxMIFSft6w?f6HlHm{{}_k(c_-OngN9(-&Fd<EkfUB=h* zU9VZ*T6<4UeKQuX4e!?Qo6V{@_i~vXDX3rHe2$_(v4zM$2!djbD0yfU-vK__A0{<O zUBy)&=UNZlli8;pFovO3Y>`?tq&*@~V~22wd>$u}#-NDTsMz`MSxWScn%iE1{pwTT z5YJ+oiy7P;Z*3@>yTh~K@rT#{YNHpbYg`>gmNHBwORcl}`cI~V1W4Ee32;|G5}(Co zPy4>#Cyq<#d!E6rXKYFRsvA_!+jXovJ?|#=`eS{yPdr_7n4Rt0niHjz=@$(23}W9? zZzYOTo#=-44w{1`s=KheMD-AbW2-toq+iEurs839yGdZB3jCG&PYFRad3F;yg}f)b zhng5D{~rMN^_|cVuFlT4+_I|QM1k38A0rwYnEuaZ&dhw<%_1dcWv!6*+fOlXig*Th zHw6nvdrB+j$@PawF4#<pilJ^Yd2B4Bu%`t0dH@Q|3=3BO<d6DQ+O%Qkr5t)mBDPwq zd@EI`eA{g^u()LUQaF%6MEwQDJ352!M01QX3ZzswGi>fE&WQCO9_wg)|85AicASGT zz%$iTYo6-5J!RDTdVVvAO0{}4BKyV5L6sT*lTim?(+~E6F=|0skdyGd)+tfqt62E; zmHNa<G$YX>r*hxM+)}_`o^~dKL=e05nz}wtmB9vEI_LRnY`R#iT$eciyTbLZB$*xW z_XnWlm^tH?Zz?hb{tA`YA``gHsb@9H1MF?6QaFApMo30r4|(p_--&+5sX{%&dXkpv zdzDb%pEruq_YRCKp!9}Wy5;dg*-)KJ@PKZgbGD^8QG%Jax-}pJja;0%F-+asDNmSc z9Fa&Mq|5RS)kHVk5u@*0TyRvhQv^0S&C1xTR~iZ}mgz8}A^>+kPq+1|V8lMN<D6vl z?Tum(O=S@ueBUsYx^%vbU|=wNvru6@j&LU@0yUg^7@9m9|6#R*#CAO7t!s%AxAoVB zPEyC+uH*0=jflmbHG}f3gY1u#mNJ&D8!m;7b_Vc>%s$MHR0ATNYA$|Hk-(cDxr#T= z9#NToysg=<(|6~<Ur=FRv9GL{!REefj64(^J4yK_IGZvzX=)Mn5<Bu?Z}aPorJ3PA zMHW7GO|AA(bxohTHPT_-`YDt_5@#JV9PAyQ`0NQ=O9a@;LirH9jWmvtpQktX#e9^_ zQV&Nny&5#?wR%c!a8Ty)F<B$eHY>W}Yr|$$OtC`Bd%dBf7PI3(VgUuhZ=NE8d#Z$H z+w+U}Js;oCPVcbS&dGFTNk)o+KS>QCk^NN6K_7ioJo1F15)UEl)OF|Qv>xTT$;PMN zZv*1Wu}xFRs*G_?E6IRR5p!n<WWwi!M`cbTo4oSt4wHm{HopCSrhHUcz~_@wl9Gqp z!gx#Q38h(P?&@muY+bx_EtJa4PeAxqX03!T%w8lh+fette#wHDa@;M2O_T677=j*& z!KvR1zLycvf71n(*VKFCAivBodlAkeUKx4tvc-%2;1vEDwhR&vZ-<(;zv>(}HP{_n z@e*2~{`OFah$?PMNYGSOTv+0Pu4i9cz1I-bFi(AX8Y8*DtTdL@VwJ+qG!wEE!xhh- zdwjQ7SWe@aDAaPM^x^5^Q=*!cudKE{me$HjyJ6p`<gOCDYcm9t3QIX$RJvBXr>*ZC zw=e*HTkXv}Ay_VxdxEpg9$TG@JUR$-ESAj*RCXFG&V)^bQUhHPTEmrUXGz^kaA)b0 zTl#O=y;)-SY|XR@9}CjkX*Y5QHd=Z1F~=`F&%PcKW%+wpv799m<DU$qH%4fE!-NR$ z&!=)<hpwEAi(`lV`-VYQ?VXbkr+ffdx>U3pF8^q;D?x&c<Jbf{*QbLW7Q8J_VYPPA z9P#iSEa|B-Y#R1lUhw}b=ggzo(7rvMtA<JmLMbtps6;}wifg(_P?D%2)RfQ~uf$X; zYAi))Yivr;(uNAE)shlpwPwYwP;Og8wT5dbiVnu|^49ykyWU&tx7Kg{{(bMiefC;s z@3YSNW3P4gXMY#%N6{Y7lj@YqPDg<%XYn)&1y||^JPI9std~&yS{fF55pXxOT33;@ zn5kuhmash^28MRnM~Tbl=P3r(=I*xN3u;e1Uredrt7Vyt^08%PMVk}*r%y^uF5yW( zo776QTpylG{H%$O9uH^jR;ck$EIqG^9~0O4d8Q3rB>HD`?rnNL8*-PP879#4S7TOC zDOS5mYsu~shrT7ee`}Jj(==E#BQa-}Z9f{DBCz+kv+vS_<Jr#BO1OM8ERloylbJ(S zB)V{;_Y_jQaY>CE?#_&QS^5Xh#oz&qw~<6HM;F>k#<+Y$8(T)+?(XDI=k&L0D>uq& zmE)4z?)YJoek6Dk!=x{m;hYUzwN#q|1xulF;fql8d6}|Z-y2bf^eZL(dVM*wz8JPJ zd3fAcREUKH(ZDz$w&C0$TU4m+4dT$&HmHB8o2WcQf74r}sRnd&2>26hsRIMTh1EYo zicP&QO`SCP^|EAs*8PHJ_I6=fNYmHic}D(cd=;aEl)z3%{xC!PGRIuxQKo!JA}Mb4 zj`b;<G9SIN59e0GABz`<?urVj^o6IDy$9iI#&_X?_)7j>`Ut(h7*9|TeP{vXbt2HP z-`W#xlvwWi?M5lLgwwF?W+aWLm0r6G)N)szjt4>oPq^Sd8lt^?E@>h&_ggzAF)zdS zP-7K`)imbZPqo#rfVRbf5EaoCr%sfa=-KFNUKhV>u-spxSag&yLBM@du&!|T>y+#n zd>0I0b|{s)pIJw=4DfwjuF?!r5BR*wnSybaNv11@e^D`E@NF_*9{?<NuBcd80y)75 z@Ic-;fME>J;d27OFEU>3(_>rwwVx3W1qaIzuOKEGaY2j%*r_R;^QTFN^$9mZwG@YB z?<N%^rlib#D`p-YNJ`$|6%DPkCP%EXu<Wf+II;iM!06L)Py>q=G4<mTv-*$lJkM2G zazR0d>=)?up~v-;T;g>pMmt@aFEdw)9{KK$7{Ty7dv3<lt8`}Ss+!Qf?3a$^-}4ly z^&^hV=E~RXu{T%SlMeu$;?WLlop!6VbgJno%^E0$zO#KJPEOu+<k=MLQ-z&X`?ojb zmAy3CKp(R8U^=b1JQw*rL6P9NNyWo9D>1mO&^p1NDCU!X@0x9Yv9`Y2Jf@*t{kYpr zLKGf<qmlm-&`MW6MrX*hz?aHM%dcx0q{W4*!~1TQ3V!f~h2n8$RT*%Y%tof#9nnnf zb30U!-`UIJ<M@KJkSv`Cur6I9`OgnH!h2U-%!=BYQs;!q)6$<>#A_WH{`~7^u>1|X zT*mM#7aR!y9s}Rr1u*-*;CINX5J~Yp>3i4s0@IVvIwL#!qwSutPFw&)iVJzl$VYOI zf6FQtn7<Gr@7FTz4$fKbxu*q3yA_7^H&9^~6n&FCy*mD~XtNrx!2qbF+@5Q?(I1}O ztX?bhd}I+!Zdr10le5o*s}qAm%3>@-t@Dhu!RGaUAsT9?@8iVlEX^$)$H3J&c`m3R z9}w*4Ux}^1SsKQOsekZLJkmDnCc<hIY2Cn?AyZHa`(1k3G%<~pneL>K)$Bk7gK(DO zp~4&W!-s|Ds2S65fEJ+LFI{j}4rDv!h?^pfpxevocXTRpGh@@u)tTOXP}9T|S8}&R zr`8;)oP@TYCOkkdw&pA|F3#!<czbxMo7Z|^)LMa2IJZ=!g-_X1sL#9g5q~6SwR8Ng zljFlkt1n#<UJwe3lvjif%4YU^Y9Ue3>JqS!?}9#1K=4K5$zuvV0Q7{;EjZAr4hlkW z_zHcyg@IUXYpSD=60%25)KtjEFg}e6)>+W;Wi!33B}opC`5WAY$#}QgazYMI6Xtqm z-w~y@7|j)H4yhFGM={R7-N$OMbIGTgj@dc0exX1utrTXWfst{Vi-7{h4e$KP#MRV7 z`#79oQsKzDrZM<Q-{GMq^zijtg*PDL9Z17z1w&t>3hD332~YeU0j5(!@_qo1v|O<M zfiU%6tC`rGJQZs`_li1S=*XD}+NhUeW8K`(9{}P(ZD{xGg>oCV4eRY%T96g~2F{hf z>%ZCbT@&M6?%d)GxsbIiEiCda)z>1YajgWKW>69)n+-Mo=szpxpp8T}u#V5cO&+dH z2m7nm4+Y;>!4Yc06bbnfj-&$R-5f@r{Yo0txHdWSrIC?80vcZK^M|!me|NL$^44IN zFOI$jH_uB?#U~?<<{IJ}wrznT^c^CbE&Iyo=2hh7F!mkaJddbN$0D8W*k<KNR;oGo z+UCFB5ixi|50po^R)@aRtr0s8kyMp&Cy+#1Zivz-_9rmh!#hSAnneruZ52G<Rd)4S z|IR3v_dKn}e^hD_J1k$v6&{XFzP$qBQZ;IZBvNKL<<jGrUacw{_}k|<bFg~L)BdNq zJSmLBZz9bY@f)NAz>2Q?3+nvlqa)o{#nPm`wb=7nL34VUg!jXrBM7|>u>xmaDyY$- zG~m@nZz@lfTLu_C(}~;yS;Wn=p6L^^cQD%sDY|VGR>qFs6}A0RlnR-tDw!kxcC75K z+vJF2!siMoHzf(<kwabu<CAZ7PlT6h>$R>grKdj*4~}~Z6oeCP4ZdcyjOEFW=+fUr z(-)hZ=6cw+N+;EmN@v2@^AA9$>|JSew?0;v=kRXOQ^wqIDo)%HIXA4K*Yr0n0^GZM zt%4H%L+>+Ob<^-B=v-61K0#$p$z!w&GvGDm2|h;Ng!nWp(aYW*qgT1NXRk61mJaiJ z<AqnhE(O$l#q|Zr2kMtt_(q0xK8e2(6@Uu&*HX@OJEH(6P$6m>5nM{|lzSM(DA<Ut zLs0O|;dmF%2E<LvLc26OS;(yI#8;zUsAb;om(%3rb8P6Z5zoeh`8=|YYI~B_g~{5j z<xWS$491Gyu%4f=3)x)PV=h+z9{IkCg0q`G{<tCMZUXLZgJAndC1i!R|KE%poE;`9 zd&%ATBGqg$C|v$BvZ<*?3})cD<}%T$10Gf6n>9|s%rw+C6##|pFEpDK((lRJl_Str zD!D6jqxuoE^Fy`kYgfcFbUvDyEzs}tM&Xl_uH3Pe(N#`-@+B(T5x}o8IprSoLiAR; zBGmIR`Qc&bRFoDA@9-#=;#`fI8+*BZ-Y4aAy}rjzy!_MpAA8cLtY_sej-kjPG_tfA zYKY%-bFva%O`5HqL37uK9pL8klJ9=Sev>;A{rB7O4D=ipH(aVA07cQ%eu&3d2q=9j z)TbLIL?wN3xw`sOXt2W|KH<ww>Wd!K-sx1{h<@{a@t1XO9B;7&IsjC}?1h7me_XG= zZ+(4P!#DvWT~Bg<f(Vo@G1B<YdGmjyI@y~!P)5p9k?(ewcGI%hdtTCM=ddr^u_qKi zVzO^2c0c9P)XtUvvR|ZJIsp7K^<6AJ^V-($VrvQq0K3ht1@-pMmp!n6>#r~qa!z%~ z06qD@GZo|eQqsErokU7P9i3*v94On)pb4n=5v){c?R2z4?NMIze-=^cpSuyo-qYUW z#85dTtBc|aC%n?D2bb9T^7sAEYeW5<tUVTY04RFF+*vT)JpdTRqrY=a{^3wO0KA^! z^4P}s`H%%3%=qGK{Wm4|LsQ%1J7Q0+ec4<2DfAY#xgW8g^qCp+|9r2>iGm(itl~MI zK*tPvmDjB9+$~N~jKjJO_ep)i2(rX)#i&JLH-I1unMd5eF1{bozb>(7{z+6gPp8bg zWIa#wLob`2s;fsJ9^dJ;WqgwueVb9p@OicNE6qGPyYVu=-}X5g^vGG(<z}l;8Kpj( z+(m*TSk~dKN&aj-^BDwo+}w%#t@fD$NHDuju<vH}B2d^>*f1o9c7kA2DGW(^)X)MC zwdv{6R)J_|oV8C)Pw{5VG_e_lR1l;XL~MF6#w*pe1Q{1a=INqARlamH?i2!_y+!?j ze_W=UYl#lcftf=m)k>#cBVWEVRQO+<*uPdkLZ{ab*(8qP&QOL?947Tph{+b$J6g?E z#6;TM?|y~~9KSw+aip=Xj7ZTD=ob)fY?!>|ov2iA-I-GmMC))i(CNJ#&Jo#3q*a(4 z9!kKNN3;`BLA49gI3X`f5P--|I)Qv1``Rrkfedn?)NFVpP5zrl{F|lxKV=9Vy#Ei1 C+R2Xq diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/examples/bootstrap-example-starter.jpg deleted file mode 100644 index 09c8a066d8f295e5331527967a8c0b01e6f975fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7182 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 X_*MUBHvZ|xuO0YR|2`W$8}I%HgV7`9 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/github-16px.png deleted file mode 100644 index c99ab237a7e77fd149fba63e15e3463b387c0689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 398 zcmV;90df9`P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm000XU z000XU0RWnu7ytkPKuJVFR5%fhlQByJK@dibR;dKRDj);|!PZK!^#|CAAOx&Z+1mOi zY^{VqK(MtH1VIP{(%C5K1QAk*qUd|aj@;_4_`%EV&U~|bvzu$pm9;`@Ii(+YK9sF_ zW{>FzKH)jx*qFJZ+GK_>gF{$@&?*CC=Je?OrE?-zumcwSlr3$89=(}-wJ9vZDfr47 zZ(*FC#*RVHJ!I{S2poVq1I<mCQ+lnb)ZzCP?8{Ssho<6)ttYQFoq2w`;1#_XfCczV zOC<GL({+Km?wGvQ0}W#fGu2x#u@9v-PEw`qRxPA?b<#a18eG6dk0AOUFy4YtkAb)I zEw99@@ro|t0&XA{xMmz`yhf82dH3$V3I17Pf!NKQ9=(<7hqz1R2_~=s9}u$VKA7{v s(p!{g;Eu6-JdK&l)XHZ0<X@lj7XtENzMcd$=>Px#07*qoM6N<$g5G<stN;K2 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484a29d8da269f9bc874b25493a45fae3bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8777 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 B7G?kd diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons-halflings.png deleted file mode 100644 index 79bc568c21395d5a5ceab62fadb04457094b2ac7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13826 zcma)jby!<pvo57jT3VnjRw(W+rMSBlC%6<sa0rq>@B+o%-915yyF0YFyB4?Ne(CRg z-#O<#&wb84`D17H-t*49Gi$BAvS#fBDJx22pcA4aAt7PN%1EdpAw8RXk~3bSJRMO{ zLOPzl2q2PL5H+wV#M#IJgd}PLHU^Q&+8CLER6#~2F82K(0VJg7mlo<;5G{o-d_b@b zi_u>l7MP9Q6B-FgKp19c1hfJ{$c#Z|7Pf*EM~$r%WELiZ6q=k0YzlVbAae^DR|k-q ztD-v4)e6XKLLn?fCII7mGGGIO7?HtjtZg0nV1g9?*yVeY|6XRLAp1uJVkJoNAEdMt zl*z=w4j?j47B*%e8y7nn*Jl>?&uqM(d6~#Qv9YtUvVUS_<7Q@O<KyJ!V`C@#*N5WC zn}dldpQ?n^zkEHN2~wCtAa;DLtj^BPEY2J(U<Wf+c3xgyR<=*9pFS}^X)rsw*g}k8 z%(jk{|F$3jas)b9*g-77wq$=T8X1G35J8G3rvDLwjh%wRe;T%R{8yr$QpO51vSVdu zVPmzi`5V_i+Kv!a(0|eRe`-6byV!wPRY8tmr~~k+JxnS84Sveq|Lo}BiYCDS)U$&+ zSpO5J36K?J4YC2*LL8q+vH!#9i8-H=gT+$=8d*z#fzZEqWhDeDpim1FJ}yp4E)HHc zE*>s%DRy=VF;OnbPZB&l+~Sg=;$olKxc@r)Yv8{FpRTZ&JYl7zK5_7had2=;im|h^ zOS1E@^NNabNpOiuiHY)jW|#UmR@T-LVq^;h{dM{mYw=&$PyZv9Puu}y1OYp!gTdDS z?kdXWU<laJ9BfA>uEt5GU<9<V{d@km9sk7?<Y3_hGLdos+mQX!5PTN@FaP4)Pw{d; zMfm9{cy@Lk9&s+Q&rkfto}%Cs7p3?Y*5tn>?B8*-aqzJHUs!SW&!V4sCD=ZRit}=F za#FB9kud@CK`bEFpnvsHQESM*Bx{Smy@b!&$kyyB9n2;mQzNJ~ghI&7+QrV?0tmKs zG<38vvbHufF><gHVEx+}tu3Cg|49E~hV{Q0|L5|5>%IThd>Rse#s3_OPbdF5nnAWt zL)hVIta5&^8bd;2&ytl8Rfo+Tcz~_-Bx?#ZE2<3oUBe})+zpAGX&=O$_aCJBN!CBt zv~LUxtg{dH^uI`jCU#YZa*6x&AyIg@k@bxImc$%rVne48BslqY$+TLFj(v37h7yfx z$^jmG#g_Rs?ETA?`?LMJ^OpUDIY(RQdGlgR?XG$OKf8PyqRZyid2g!3%@a^C1igpD z2NKzV@<YXZRzt=Y>|1wiF}EtKQRH|$CJJ9)q3e}#g7m#Zl(d`W;iCBregW~kz}j^J z#1PLChA^$d<LD)~70v_u8SpMwUpU|RTUhXDv)4)u3eW>al^V@@cK(w}dv%n<F-yr_ zJ0+WOh5^r5g-3kpjp$U*8q>2!w4^wV*y35J)-xE{$fXwc@pa}RzJm5M)#tr)iJZA7 zBA<^jjwJWvLx1>RPDIS^k*z$pgpiQZ-O2S}m#&N|<ZTk;+zEBQ`}T`YP;Agku1%ac zdF3IxhLoFKg}Z?o_sxo?wnxo1QJ#tQ0j@Fy_%e6=p|~NjSVmognN?94Ct|3$I9mgZ zO?D9u#IiS6GUF<?b8ar}gj+Suy$D2^=xrE7H;g&{Mz}?<Fm}V()*|ag#&;#ta`-Oa z^=C0_f4W-_@0F5?Z9A66x_f+MlrOGf5o`cAI76nho6V|j`w^uW^1&VLU0_(nk66Wq zhn$cATio3d4$7C)9KKLSR)7%_ZzZw-IWo?79xFuyLQ;hgtOvv{<$R>A4@|nID3F1~ z+{<)-J1C8b8ezW2FI#g<tpPT)n7ulrvbvVga9EcuE6q8{<>otv2}C#wQERQ(Bd4_} zR$QREVi8_9nE3}6@Vks1@*cVLJrSLt#`lb0$M?!xg%%C;C!jFg2$sX)U0bprNA043 zt1cd;7o<embPqXu;3>NIanP3?<(O0mgAc`)87;35OB;`nL3-yw7Fq`<#Hqz;v+Mj? z%y|w07f93V#m`17f@xa3g&Kss@<20hE22A#Ba2fDjWQe?u<#pkgd4DKg$db>BIa`q zqEeb}1&O#H`nWg^GT=P^c&c$+@UcRMn~k-y&+aN^ic}0j)s9vGd$m}}SL4iw!tr4e z74SRhmFujYvTL$e!;=bil=GRdGp3UA1~R?@@XL?>oK21E-g3xj0Gu;SC|l|8wmd~d zG@8i53Tu3s9ldBp@%(!A6E=rZOl&LAvv1Nkj=ysQ(9(~g-8X6}A>#Y#1a(KQ1TAh( z`*b|k%zN|vOG$C7_4PTiy8Lhr&r<ZAXnKecw+cwDu!BCqvZ4FFw_Yjl(R>Z~I!*iV zG+W%bI&HR#n{T~n|CLrV#?k5#Et)n4f;XdM7~@Er-K9uS8vPNM>uZUibWxth=wqXp zt{0wO*|bZs%9J3Y;Tj4)?d>OBZ>YUb@tFh)1KiKdOeB10_CBOTMml4P#hsP|NnH`$ zn8C$aG#8|gqT#i}vYTeH^aF(r1JFKcz$K3~!6}2FX0@^RHCL+33v-FhYXz#e!VN4~ z3pAY$kL`HvPAaz%ZKvX4N680T6G=`cF|!UT=iU?gUR}#z>rLnIjH4UiW&X!Z2Ih$B z#MDHe_%!Yd4!bTFMGeNcO(+vEfWe=Y&#$#Dh_vk`s>hf<^Bj2jofdTiH?Cvh55o&b zE2N(49<70oDa2DrZnfjbhn{Jl;CT6QCOL517j<Kfllf||_!IT}3nidZhU{i>sNXxh ztk>S%Nl!1kKE!_Y1E%82zuk(#fmi4VMZZ|C9XG#t=_a%pE(?AS@K%j{n=lj?kEKY< zW|3b0>CWE2bkN^RapDK@3*dIhwI~%Mb87ZxnF|-bX;tNwFf}3s_Ti{S8}(TUA=c4( zY2Z!UZS&H=Pk;r%irg?jcz?{s!|V*#QA4{2Fzp37$r+}Z-K{*#DE7B^Inz!%Q9nU} zU%!E(b~61SJ_R5KSY88G!*+2Crm?Vp1DUFviD)lB1c&Atk+dP7K7{oK1?N#HTx(Jx zis^|e#sUW_TPZE3IGu1R+xV`&BV&1NNkrD4j;(NEKdkpSdz8YLZ}ya474taW7yY@8 zsA-+N{3&saE60RSnI802s?NYn0KiULv+`y9hNB!6%B_qCFHMhVOa;O!ge!LzPKbk( zbOnDN{s12ui~i)C55qt9+S4F%_rqna@M}~Kvh3z-^-K67%2T=8H8g<_=LYj#`6IF< z&#}t=5w#4@^{y}B4J8rm?|c7nu!l2bJZ`U-W4@aT)V{Bm!c%#8HewtNPwZ4>dYBdQ z$`?MJMLJt7`j`p7Y7C@WWmQu(B(vQ&FMa>ZZpX>;(|`+m?2Yl|fhX43DejM5BMl`? zr(v=9l4R8Y3}+Abj6x1X^T?$#`1;s>I24lFFFn~&HRgQK%%Ey(mn=20z;U>um1z~Q zJG*-wAw;tG!?{U#JnA5M5rX*u%NF+}y;0xPbTQppWv;^8{aGUxG$gD!0YAlLo;KuE zkFzemm@vHoQYYv<_b|t(esPHC%z-nLF5Q9^?&hl?0?g0d9hVSdDc=X~B?dQzaRfp; z+2*{_ss{}_cv+!%k7WX20;r5{GER*rd{={D1l}-^Se~*W+_M}?z+w9HX;SR@AB6by zI0}UM&nJY!1O!_&a8xRuf`=D<FjP6|{7s(tH$M}t2T`75E8=F2xS|LWlK5A6gIXAX zTp>rhp4bwFD4GN;7|wXEpdq}@{E+u#{VT}-UEwtWPkxKl^Wa8Qi?#AQLxY4w+?_Y4 zd1glMwHFc0bg<G&^bpHR;@Ouu+r_01?D0$dqx{~6nvaQNR1kf^#hdN5oK_ZtI10m1 z14|EOja-ZqM<Xd_(i29l*wJ)W8&DWvdbgt*j%%OPd_}^)mUt{Ac|ZKw+k`3DaqhCQ z%VcB|KHi^tR-@&;?!Fa(-+^H~sn|Y1Y!*i6SA5tj-M$Wge0UQaSuqimc27_}WVx-z z<S{rC&+b;eRj`={xAlOW)V*13W<iEvwv_65*m36HwS=6&ofwLn2dcjtyp6?bX#5;R zI1-f(Mpfm`mg*s3#MYP)MjpIT0(ZNnF7ZW&M?zeUqF_=Xc3kN+7l%E%-f^n*V<xsH zRetif3(IjLlO5d)mVa<d6V+E$%y6j~){5~EF9-YAwnHmYDv|X@e9IOkM6u+as}}8+ zVg)KO?5%ewX<?(dli9u&;h*BbHhW+|QM|rNQ}j4)jGxAavk&{#?oPmZ>lfOS-7V_h zjsOP>)fG0TPo!`fIkeDn-b_WlxJH)NqQqX{Cjt1+PPI$%JFTSWT#$Mj_6O?PY#fK3 zMy<B*OqFdohsbY4|0K5#Qr9nT$fU?ff$xHr3oBh=A%!S&tIQ5*ll&JaV^{~P&5-ED z@-laI=ybsP=J`7qg8MuALo<WGREzRA6jZsnboFU8<mC^|LcGb})e*9bFgHMv!+DV% z?WGPNh-p4mH<s+uLJ=S&*o0~LJTB0OGq>2&j?Y~|h<k&am-M7~G%k8*DNGs=Gv!R@ zsN}tTp|kDGDnPauoEHD?do|A3Ga>c!Xla$G$#xZ0%<v(2VY-|dCnPN4L1foERl;mL zIs5ukyc(tC%z7zSSyYn{5f*>AyTx!yYt=5!)nk&0@J-$=t?&(X;8%~rQYD<{9lr1z zs@8X~WZq3R1+cmT>`KWeE&^_UF>|q&Ay^}*sN63yo7B9nz}D!eQt$6m26sKn>O<zt zm$-|ltznPdJjZ_x&Bv}On~iy;ZMGv1*azWrSG(s<$nw@fHDX+J1|b?HiID={Uw>$P zmvsnQ7b9nJQ46`zs$s*Wtto!ux2}?)U%;Z5%hb7!$w!&8C`>TRG+*DdD0JLss5Xff zBThm&kGp*Qxmrsc3GjV@6TVB6)l|r!wyRJP)U%eM@Of-k4FDYmUY)1+7EUyRGbs_` zleaIf78kfz<{vx`Ls^b4Ogd8_rSR#I2AH%NK)|Vfh#}z~2k0bJcEvc$3He?p;bGVK zyam;#Nl5X&J8j^k<~QS18sq4NPR$kE>m%=`^Ki#+ieK<Qw=A%osf*UK7?G&Gh21cC zp7JDoZ<uJt%XQEDUQg<1#>pZYF?TTM<e!zSLCW}zk|DhK;hCLL$uyC!mqq~GD%^(8 zteXuv7WL;s!lKK{Mwl|d<Yqttpq~c#neitbZ?7}X)kytDN61;L{VHFIF_yf(5DP&p z>#Jv80{<7eYn$&q2aN=p)lq6fG9}Dv2}g_RSVx*Iv-0C}kEWsUw>e$24l?hUH3zqG z2Sa%=_ql^t*`t3yW7`PZ(-yol6mNfiUV1c7e)%BgzOh%HQQd^uq9gC3O*vPSi&V!$ zuJ-gy-6_@)r?@+~#wK<ALw@|WgiC-xvIy&qvuO1p;x!mtoY}#Dgr9citM0K#-<q5) zjwsU|j7v6zeG4x;D}-}6lE}KLKqXG%eNdJ5y9Ap0J|apfjtjU3p+_MnYFGkM=7z8{ z{Hg>_V|QHgllM9B^dZanl<c344}r_4_d+IKQp$P>nPLZqhL-@Wql1PDLO_j>7Nz?o z+_&sbFV42Gr7019rPl3IUH2}h2Wl+<I2~)RB+PUc+yr5Gl?`yTf0C3t(arML0{C?f zD`dgLhb(V>=p46k?>x70Pnt9Gn_CduyDht`=S4b}9&F^387k|mAZg2^t9(aD+I+W{ z#<roC*)acB<WWuL({HqioU79@Hs0pNGBYOr-#G{1mAfEvQ+@|vGrtp!Ma#v`QM2r% zHk3Z|g-Zr}Ol(qZbh0Eu$Ut-Y^2P4BAN&AiaV|0pJUv=JIYO=IlBxFRPj&xFgAlZA znp%8AZ1Fe9E;24LZ9D((dhUOky8f?Ot+-9kD>iMaSJ%Slg$*$}d;|(Q|7`BKm3z9) zh-*c!-WX<4{kD>(FE8TvP+#HUL}QrAKt*0vVL7!~ovM)?Ur`?N{))Ew;yk>PkfjG- z*)^I$qo~mV?U!~Gwi(1*M)0+vT9Jy~`kGC^1<}kh2R4PgR^?53j%>|Ns{2kn=ewGn zvPvguwaHo(xrDKI-<Zt$iNoHLjvS=oy#mS~RbTx?$4KiwSIRy!DHImhe8$p+=qChS zSjtM_A|?tL<Ra@N7MylCUzWcLi2ku)^$Uu;V;!WRC0c%m43RzX$`{HV(v101Bs%hj znmgw!ePH8R(0N2*n=YOCE*G)2{oZ(^+hV1b!VYm5x}hEy$cPr|qR-CI4=E~OShmtv zi&n$sM5Q2PXzPaIYBwjBG^yLTjfKU(N^oHRg2;r((+33M-7L24q$i=|Sa*@_h8j<u zpfUiky^f>r{x~q$onf~4u$MK|{q*`g)sDyNO(})q!R?7xZH;c=m6iWiHEU8Q0KT-e zKaAgECVApd!3(FjK2!e|a^g^-5f7L7jB^GFCrwQ_*B`o?=jeoDN_*x+cXrv8gf$<x z)wBYjD7J8&@}8K?SMKq00Bb;8psxMk4pSA4T(Z@nRt|CI3%Qr(j3h|31e{|GQgLE{ z*t59FuBF)DIxNFL`O_KA)l<a=^dH;?Qd0w}lT&H;`D9vG{_m9!h%<;%i5B?Ne-5$^ z?uUEOLC@viez2kZ>36NQ*!QC!Kwg5~wLak^RyUvu(CifB7CA>(1lu6}+<NHN`5t?- zAuE(ME~MwCd*L1h>@1^DvB!>VYXX?9Ys*9wd&0abG}7TGJ`Ws<urompG(L@rxP6fT z<+mE&Tc^32f#*HblnvLC!Hw$=42g7>H;FX_s&}n4v(1m|Q)++R8J>#?XO`$8g+3q` zwN~X&6{@){!8Q1(2!in4P8(_gYuOhhFGZ;=C-6kTb%~vBQQ*b-=z*J+>E;6ujm;wX zvb?kY(oC=+ca4)i4a#h@{dTzWSLS3ag^66Gpkn{ke!AC9A{1jMRP%OcQ)<<@nxJH} zZIr?|jBinPoiR)snBOcecjcb@Wuh3my1iVRzl-u;gB}~Rjhub`?Cfu)nPL3L+b$kL zO32z2XK-0_shy`%ZT9<2V<1qI5Rel|E7W{`Hg#M|m&O0`Ua-&p;v}tapS>wTE*On` z756q!EO*AN?oxlV&@ybUeVWd1q~Tg`kpqG}F@V;VsN#&)R^`V00X5}(4*PmNqShEg zQ<r?Laox*hYFR-DSEc#*L4r99UZdz4HnSo|Y>ih?Ga1nmgvx@-!Wngeg;A+L{F-(i zf_X7=?WU?j|23>ePpP8OODXHU69Lw_MmSudzHtic8)MWn1BPdI_Ae4ykPB0u9il*G zJ?$Q@);~I`)dd=AQuaxcTe2HSse|E|ii5U_*5>3~bz~#PL%91W(Nyd|=|ZA6*w`c7 z$R1sRD@XhF^&4gJ#exDQRqq3%$Y|oPc!wXV-=n37^UJ=Olj%RP#gEAol|$!AAbjxW zXq&hxEZQyPL4JOa6I*343W#)9&u%!GDhw_3B>yJ7)O`Ae76GRZenb(|eWOMZU_spF zuD{--T)B0<*4E?|ri0F<=p!twyj!hH;HlUN0Htt?hj8zO#!~F83W<H$n$)>|K9Lvq z3{RaoPbjaDFu@z{^qW3cjj7kS$GR|;9I%R~LZ@6(ENvrteZFbkkow-9p%qZBx>J+M zq8}TEyApxpU@n((iw0bRrJvc6Cd$y8wbf4?-w4%S5$Slysc^DTKW~+Y`!?zI;_DZL zV9KO0`~P=A@%O2`KlPzF{xwsO>z5=mqo0Z23o-D!NekrdbEa^%TfV56v|FDM?4cKX z@rrk@JJ?1_5irzO66hc^C*{*Ke&o=Ijw!R*ZAgtQC0ezeL17SocQu_m!6VUsNTcVG zpwRaCZCIJ=OR~@li`X(c8LO9k&wjr&0Gd_GRou<{3Hu`Css}PU72iy4PZtFd(l9VK zR)fk*&dPTy&yMX{o8@~bPnX0_Q@UX-RN+o|sC$;fpA|xTEugMj7@)yJ{4@bO3x^+O zH0OTqp<RAP_eoKoS*kD@HNIqveerrB(WqveX5J|YlEjj-`IXx?Xh~5rz}&sLr&rS8 zJwKJPn{*PhgL5^sKck|@Ul*<IMz?uHOqzQ5lVrKwvIK(ogIPBb7yhQf{E=?FTXkrx zv)73CU6=fZMWj}vHoPrlpXdzluwsZdiMi*L+P<oiPOCt$GncS_K4Zbf_fh6B0sn=L zh{)7yj|!hD_ph&=*RgG+D@w0Lr1t1~r}(T+ve6xMn@f02WC&2Wy-@#T?kuQgg?rBv zvT*4M)Z)d*0T_?zr;v<zUw*C5)SaRq49N4W!wHYEyQg;%&xr&mW>82(iEah+>0QWS z$@9x&MNFG_ayE3OJxi@l$%9i2{OAD1go<gf3V@m!i1%!V>7t5}Sv8p*L*?_XV-Inr zpe~mOfBekpsM*iZA4B0U-_aDDuQGQ>$du+c-pHfXyBaLv@T`?*-je(+>E!q1bXa1q z14-*PWvM+oFg<Lt2k=(J>(z{YlRS2em5Pw1U1&De`{t$Pg={frAk6|^cDRB$0e*ut zvJ=N0<2rG{&|2ECVoU=~V0R9rfUWk0Z${R3(A&#kkMCPoz`s?k7N+_8!1v32J*zyO z<vKi}dMCpcI-XcsUIYMCp<^+WAMWB2?K_TExH&TtFVD3KItG5**3HDL?JNCmt)WLY z)qS>R9Lv<X`IX+Ro;bt_cZ*k&9Y+x%T``~<*T@t`XaIxP5n$}uD#?YN1u>8#NK_E; zsf^8eBN5l`rT5}^m`=Z(Oaw_(G`KLa6xX%V@W0keWi;An4+N4QThS_k{n&Vyk{0<f zS1qfF9)I4aMdDat>!?N_d)(8r)?>J|F`-ZusfRTzNO)+h%L=-)$92e&Ck?1oAE(~~ z$-n~o0g*n;RB*mqiaAn=Wlm0w2D6Yu&4fY#;MU1bvU(~NK6m1FUoPk+w;|b?nzGkO z_PUIl=pfDRhrLvm<;sb9>BFB~S<kKbw}|$#0<KC|f^!EQ<?3GNuT1Sh3~C%}%~@{z zv{3NCe7Yh4O`dmeLFX@t7X`vCM^kE(9#{|Tk=#$W(79O4)`j>c4oJ;hS&xb#O~;<s zdj!PUYcC`_V-z{W$MSke`EQthau4GPXOEhJR-v~USY?i}s4-M<C(<SUp*>Q7(2b8< zQ9Hg8isf_ddK#6OY$>r#Kxz@D+gtkY>hy|#o8Z-=^bH`o)WbuhhdK98@PHbw2Zt=7 zV$-oYeC$U<;|<RNsVN_;RY&*bM_6iWdKNbB!Qyw=M&u%f9C2-nSr2AB@UTUm22k^0 z9b0l^vyAE;f3)EvifqbYqzV{@t0WMKV{i&(pdd?%5t2}iBu{QSR;(Eq)Yn_;5MRu! zgE=M7>pnaU4187;%~hxdnq*JOnEGam?8hex6Iy=ZlWGzZv<Ng6Bh#xQm|za2a1T7f zy3@YQ?ZREouiH|}E?|<k;3#@k$#(mv|EW)Rns$`%#jBo-E{tr6<(iHqCd=iRT1>-4 zoJ{KX4x(J5=P>qor+5;Qvhp3GFBpXJ9fO3crB!vqua&Y$iFJdsGsQL15;##Wtx)a! zYY)JHGBW`d%x6ZI`{f6_r^+OdBbZk{<-B0y4iS|--^SLDWVMu&VT?M2Z|8*E=pfeq z);Kt;$?dDKuIJvdZG|d_=QWvbk?X!+UMjWng_S4uk_M}7f`V03>h!f-=Qxpm9ReU7 za!V9@Dytw&Y;Dn_tG@+O7`;DiSse1^ilx|o^~@+CRqBxKgXtuFTdkV9s}V3?Sy6{S z*XctI(Eyb3h^4g}R#0C=Al$1x3GX$~3fA}}eX>>DF+LFj4zJ()a-xd1d6P?W{`m*D z*x%43iLpP6D8xOj1Z<^h)%1C*{<mv_xLF9)wG|AzC92rp7%TSb_Mk)J4Bn~A@3s{y z8Eeq2FrMmC&9hJ};2tvPYhLDV;t3fH9G&M#I_TS-C{Vph0eQ=l8My@M;P3j>`|uBM zAKe~zJa>J<dAp4Cr`E;kV=OOI(9RIrRhyS<gvu4veiksC@PE|IzcVqIC|=lfwEvCE z<<y<3Q@cDWXj+8Lf6Ebj6C1qDuQ(2<A$5_O2YoIyQjmyikmi<~q(e`)JV^Q0m1Foy z>T4Tqn|wxn>-+P9_i;yHBP@*ap6jMJgu7>d2GIq{>J`g;o%tKlmpM-RrSw{_pAKK; zSq)!`7M=VE#*z4?xSu<n;nZp#Mmvumi6eW_H%R8hFwHi!LjtaQ-8yfFA3}M(asH04 z|Dr<-qY2llUa?3RJ%W2kx|%pd5yOfu7GEL9Z=<2q_FTtJxzzzTC!oLwM(c#BsCI1h zRzySqy>gikUTPD}y7GXhB{U`6@}s8z0d@C`F9EQ3#s|A3?{zk{KOin$?&5UgsTdnL zO1i!hQhbL?LiIIX*RA*iV$<q?e)IJ+<v5md0KRFXq47Ca^G6bw`pt&otolRtGk>~) zB>zWXKyBeJC4}W_3SGU)PQseJzO;g~99>U&xx8@V2Qp$StzgO_?GxT!9UmQV2vt-^ zkab;==s?$tI#Akh4J+G|pAPYZQ5vA(8|@a9T2-p=)uPN<Lnig%WBf;pJE$vh6VJre zcSa^lfh4lnh(Egb1XNdA!m7G{0rq}=rBHCiZg!}umpz)LzA=u4>{@6f@tmW11S)1s z<dACJAv=ONwMWqE>!h%|zyG6Dc);F%IdWaK*t#r*khD51^8Ay)ixzUtt=#AX2VmjE zOFg-|2AdD>SmMSf?bo9uRB)zYaT{m9I%7Vs)$dLGX>bj<#I2?S8OUQRh(mJrJhADZ zT_^gL-3m0*JIokIbOUyiA8<V#BAI>3%98nW2{Wp2BW5akVi?klylc_3UwSpIlPTwb zEIG-t+<qR#EIUhUXpna4y6Mcw;r)6g`~DbH#cK1a2cg0|%feb5OsHo&K8fl?XWHgh z%Cfu*=WZ$#66ENu8Ly}-P7+g(q8`E!BIitlN{pOU<u;Xleazlc%I-&b+~jM<Tv}}H zJ4w@)u0LPUA)*FsqV0b%PA`-bAbATf|DkF&)83fUO*(ud^znyThey0%MfPsYmkHlJ z5?yv86?>EJ;a3(OZ-sGt+R_j^Z;x|qvj<LkYxslf@>Br|7-{wn4kOG&^GRt$u`kMx zzV;Zy-UA7<<lmI2>xMJg(rd2`sKuS9&FoYuUoug>t*^~eJTjg>pWcBUABu-7%@{xM zICt)A_$aq9KQ1!{${`~7GXd+8ZDmu`rjx$oiC@GP<}zwn_dR8&M)WQdC&iw3E)YGG z>3e7ZNZUGzmYhW2?kKOPphuHB2q3zn7e!n3V8t*?@hpE5fc7snCI0l&iE)SiOs<Kf zL!Z&na0_)e@@<g4eE)m=8Vr>(W%=b1^y8b;aHjB&KaO|McF*t%v`zlW*&h5@1@_C^ zu@=`+#rV2TS56Ee<a+Mhi{hYf9E$Qnk$Y2>Ch=>uP<-lPc^}fc208qOOb9~TKo;7L zA~1!rYZOt)&{UFvJI5a$VIW+Rn=eIQsZ^sU)8hNGK};PpknpE84hIhht07)(ER+4_ zxLhMx$;116i@tQodN*XTcFS{<u5=vYD&H9rs*yKPMwHIa@82$a(JxiKmYw5f{fo2W zWsy(=jDJ+J%h88)ISY?WAIBQIP$l`a!j$B=(v<qsc8lY#JdW!pS#EiE>`!fPjk0n} z1udu3=k`@uaQK?j)YF!Z2n<rYCwJ&&vfLK(02y+tX(C$F7Uteyiy=1?-OFP4_+9AM zX8+ofOnluRbzHt|UYpJ2?8d3_o%@H??oi)Q{owPmDQ5y^NQTDitY8T0cN==`1>=fc zY`~>$*#BZX<DZ(47QvhNUkB_ZUw>+mGk=DFM0Z|L3%DK(H(w+__!4UF`kf9Jf(YzE zR+p>6%a^g;g${|zdmK6-Gj(({7pl{TV*3&Z!Tg4cKvV0j;*Hb(Z#qmw#wdm`wZ8ts zjI<!fi62>UMJ<g_X2DY-{x%R2rvh0bvjRCk8Z^_8A3Ma}!w^zvY<}uKk8aT8gU8E5 zM3t~ytrX?R)4Lt=jBVXqlb@^6)j6Z7cLsgtx?(TYd=C>`h#Vh4=S1zDw~a^H)q+6{ z#Hz!oYPE7ZFi~~AG7n#q$;s}pANs@VyV5vhU2&d`=@Es*pQh}pgHHCW`KB+GEa9ck zW`9DlW`Wvi6+8Jp#bM-ebD50CjykM&Y5Nb{=n_#L!>gatGhc`j`D$a>B*m5@1=_tY z1!7V55YfU?hSlU@@flw?^BFXCnLzGQ5nOAvVvjQP>otW|mQj7Pc1evAEdaVt_O7si zLf)Opv3>@Ky-^Y?)9yR;H}8pcbX&{bu?-8JE^rhUOvU2ko_d9PU&9pXO^>cRZ#zZo zCkq39jb4}nCKp>1oQXcr)#BC}eH;uS!al|lo`b0S;{)B1C!B9NGJ7sRRf8<l^_hN? z8|uYrqM{IBNxPv(oEL2Cdlwsw%%i5EF8VF^>u~;@IH-gDB{~GwmgyVn+go-vI%&pi z&YpjGP!eesJV1P}>w0bDVqj#o(Td$rcY=Dy(vmsW4Lu7vblFZ1AkwFt&8yEeH+$MF z-`f?Kpo$}2=fdkh7scLN3X|LFczR*OC>3vQN$>T`HJ{7Et7(nPTo6piDNA7Mqp<sW zK+Ob=g&|&xy}#?;o8jZwe*M>=3RT0d>DNW?+-b;wgbWc@xKrOgn@*hcG0Bl300~zM z1cqJaF;{x*c%r%A4-dBquj5*G&bu!gKwoO_nS;LQT^1W`?RvhSP_8$3==>+aY-PTt z>bq-vSj!54>+X4cy9uFc7n4e89$<D@TYO6Nosj>B@NcVD5A-ZJOxHgc`}0Xekmrnv zFXt>J(de%xG=HqM%#sdc`1MGQF^WDoQiWxMaI(4dHmX&4!LlBo`(Of>F#wiHG2!fZ zvB{2Q#2#f}GF24rrVMQV1q+OtDek8cd8z74b#rGk91~90<Nof;8ws)6dr)wA!~=2# z%NOqFB6$o)>FBtkjwVnD<aq=diRRv#2Eb?~1Wgs-9v>n53id&|26Z`rO1<>1bMNki zIionO>*HS1J4(aUYgwsF#kSB3LoKM6=_L4awnOEIti-PdFWHKvSHkYopzzkmO{#f! zBCp*D{8xF0vlect8R3v&sfl^TuDXSf&P%wC74{#9?N5X!pC24<NDwbK+k|<bffHE2 zj_1I|)ypkjr4^qDsNAc%>A7h4?)2V-9N|c{C;w5wl|z8<2X0es$`*M5j(oF{0r&32 z`U~-Q8qfbA;nM54%Pd-|nK@0LdSA=5KyqV*g)A>?W!gQiNj|kKfej`z+TWeH!`Hpg z4x)z(>^8nLqTC<9RW5iJvCjWHv7}1afGXDDjvlcDu^s2txL;E`C?VN3k?3wy4?Rg4 znmrvze0;v4z1-miFC~klv>fjZbDDi1Sb3^nk~4(v>AQ0kEgcS!BT@@JF<B7r4i%JP z1@}jL(wq;Qor!ZFFL|Z8kW`8Wwl@6Um(?fAYD(9_EpgY;RMp+%4cxVt{b&-Zyv&|f z9Z>n156+M2%+9d~_aj?sf*d7G$H=KZ+;~_5OXv~HkLZB`D1C0=ySHh6%$1n_d9W{Z z&m>oGu#UW7!b=#@N;S*cUt1_&zh6G6Pp&1MS&qW^nP8>f9Vydi7A|Q=nJs1UqHe~% zo8!0@d07eTQ)zRgq2lRbPX=U9X)}<}K~;F^6$@(xJg{M=ogF(BJK$Va())Mp;3$9P zb1zLrct_$*_$9%}3(n0%gfU}7>#&k71PXy}!LO#cR3p!xc`NR8zFQw{A$DKq6Oeuw z;ZC#iv;VMss-vmXR&ElJ5dxInx1l|}uEaG5i80LcV~4TkD%!RUD@5+~l+kiSOpS0( zJ-iwpm}JCR@Sy?BW$_tvO%K-fQUFm-UCi;NK$-MsQoWnQXO+(qUd!{zFS!JepUfxD zmmoFLB>{OkHam{gP2#GXZaq&=xio1Kop4j#`<I9IR437^u2WBDoOT##CDGJo@`aXn zcGq@Qs#lGtH^+5F(=h+UCnD5ei)1W(>v}Qz6U1D0dc!ks4ikn<VWy}wXIzP|Vcj2* z&Z#B(9CwK~tO?2Nf(5I}agU=3IXyyO)y7@hzG*G3qWqp8;V}sAT>{Y6ti#ZeqYgF+ z0jQIIQUvnReW)_53Z+>u>)Lw((~vxa6AFrr%d}nI!o7{spwl@ir`qH9j7o=6JXYD| zsp>X-yI}#VHc1S{c}{E<G~;94lR1{tAiL<~RNW{EBJE$jm(S|=>|acAh>zF%*}R`4 zM+xtI9F&>Xs(IJooneFYo;l{cU*-2DT~2TUm;QwTC9RXwFSwqHS82mcZmDj8xVn(+ zhjg5e>~E9?3K-*RvJ)uCq0UIdRl~D85$B^#Nph2%)6FN1>6!u6+%oE;F=J5B=`W{` zL<6;Qu8Pq|0+tS%yP10nmIgUV^r%Hyjyo|#W0hIVR`qiw@r)O7`K*l4Ma$$u=XQc$ z^#q3KLI6#VtuIxX4b;#_lx#bieZGmNS8?8jxHeTsE52O+t4ih5iw}=p7@DZs*!jev z{i#&SO#GsN^zjC{G<~Nu|2>~?q2Z@<H(id)lLc>)UnNDB&2?wHQCn?p9v7YpNRPW1 zWM9#550th&<~(gv_Sok5g3e8tnTzkV2|gxe#kE{nUT{aP8n5=}qg4mCp!JuEcz=Ht z&y3I7&uxdKU%P7D+5NV%Ok}hj@mimhKlv+R1bd8?zb|20JJD?Q?=vElsc#c2!VJmq z&W&vW+CaWx`FG1VfMsEf)`p}0TTes}|I{%_X{<jeTvT>vj;}wDxh!zb$|D=4e756H z7dp8?Ul~60@eSwbY!+Crzr*mLMSqj6ofW&@mJB8fIGm%=B28`wnbx8F8YnigN|~sB z)ie@y57LaLin3|;u`JzFDsS0JCrG!Z4g+Nd*=-JadG7AesG5y*rMun?dHJhkCMW_% zCa<Rq$dn3y^?_5xcYY-E4d<=7nSTFlb3KUGo~pc`vt34MsD@(n-78ySWJI^_=V->l ztKYWr0+ECjETkqk!9jw#hv?D8BB>sVztP<9s&fY3kg7O(65kdl!pnzWhNl>mkKBOP z9wGNuspXb&`T7gZLu#Y670KyIg|D$foZ^6CxK^NurqGjTAORgOb-D`MnNNRW8Xw=g z8)`pHz^^@&DlTfcLBTlT7>c#c{d1Rs^_EM?6rpWz{8ZrZ3&E3&F=tOC;z<I4jZPAe z*z~4-@QBOr*D0sNU)95$A<pzq1>Gnc>6#NjY1JQMZ!+8#j*!95<*U{5CE&b@6WIV= z`L8w`z0>!&Y?@c9IUIXc)WVTOpF}^_=xxWoJZGv|AT41`N;g@MZhWeGa@pxlgGji8 zR3?G5Rb3_fNj8zy!w)Nl>leQXO0(UI&kdY+N-i0G7Z%q|`!Oo^N%yZLWCBLMop?7) z`#d}b79JtI-AG(Fx@TIi!6u-D3-^!Dlae;43Yp1%MZ9XATQ^#ln*F21RntEEXZFkB z`SV+qf>QWy^~x~X!#q&<(a*gW8Npq#5?J;o^<vsa44ZG5i&xC8mp5t3o$P7xZY1l~ z$E)V2RI$jK1!+4>D1<$rOl;PQ2b4cBvE-R>e$@3lbK}qIv=-<eG(bH&HC#EWd{A#l zeduJ7rYYdKHNuC&#l~!XR`Azj3I(5q&XvpAE|yI00U`}orn<h1ffuN)^Rq42c6>-S zEeI|aC9>S#V3jN>JO#=lUV`ja4_n@N34a(b9DsX~5L~fhJpe=AgZbr~VX+0ZQY{x^ z(k)K(A0~m<ch=gs)^5ya{8UlRxs4Zp4wN8$x{l`wN`eQ)$fo4icd2^<Aq2RHUgj@k zwmOlkZl)sjMN3JvMaMO7gPN<7Cr{r=`?2Q3g@sNOqVHD(9vAK?Bn$Yavo<$c>NkFt zA8e)|)*K0!nFmOg^$p@)RlWA0%f_jul)Ga}wOT-A_SHF)3v!5Ywj5XdkuSTR2s1b> z60lzNZMkjx`b~_wapzIo-Eku>H`<lrjoG88{867$w1lOu7YIYgOVlGTtF~!G99+_d zc8@P|AID=T3Bdc}4#aqc`|RTA2S;pP&CPP}iQuJvb+z2m1@UYL;;DW!UrWi@`LyY0 zr)l)M@1$n;-8%bA{8wtL<mUV9z?WE+_a|w~H1@h>NV#XFRgb*F@gDM&yDMiwX=D%B zmzw)_!+<muKwP@Xpg(Q--KuPyNaT7q43!X&Hj)s~o}F;p7XtTmYs@+eU;&i)h9K+6 z+Tu8W(<O?$J;G6wq5j}FwODQTt2K-`ZgrY?FR8tRb$^<lEUsGa6E{7RaBL{?;oX#H z>aX+zV8mY9at~%ev^rb^(0rwKSp(3};ZpMvxEwD2OjDaVA6Ry$0&8rtZV3pHxzf$? zzAjYXA~;b|XCc95MUR%dTT@Z>0}uY<vX>+8y=;wW1vky{pKP;cOV}6&6tV$I;>`FK z906wPfP<p%qof9_i{H^{B@Qy&O!tOL_|uLyf<C{y`NO8gqq)GL5iw}X(vP`Mnhrq* z5CBR>rz9t=;&M?(W<zjs?gLlZcPE`~n%65Q@QX#0Ee$<PbgkRxDnV~*Ph*A^7B+P! z`&YZrmews+XOgeTc&!0yMFa6A!i^M1GzYJHov(n-tyRG%Nj9g?vmQNrZxQ58F>wdm z0?&;KzLQk84srC-9#ap*I_9GregSZjm<$6oiZ>h3ACEnS7A^faq{fPmD!rT69qQG% zRVF#+RDZ(-Ue?g!$?;NT#p=8F8SV%EZ5ry{-5J)UN6Jj~-klPlw7o4w&aUp0pn@@) z<bP?_6W%h(V6ls&F+pyre)EZ%bR@eE0yPJ2#L@9rD9nyjM>M(jp3}a6rP@=sC1ZvM zV)jL-HO|elZ@x|hHXkrmGu9<XL|VeL$%?T3@3*i&d2_n85LFbpLVs0<l>uS2%=Jqa zgIqpCmA+s{=XewW1!<j?lWP5ARk55ql#eiE`Y|Eq&b@clRrT<7g3qz>LqE)3%%mIO z(8jQbk;xApH`iS0;h7M96j^_3N=#|-xP-=*>3=obmL(W)Au>jdy3E<<nzLBzdkYP` zgv^ldx9G10&!D|1uT^k=m_8;)(G^jV_)^e8Jj;LajvMfXWO=mZ8^^?Cu!2C>UjD;R zOI^Va(lW(qH`MjF&}RqCOifgKKA39SANA9=Qv4z+3Qey|4BJBzex_v%9=l5D-x<Vl zX>JaG`?IF#?EKul!io4R+`>v>t_65&VXqROwiMr@*>SD)gNHL4^Ml5(vgCqod<Tos zRoOR4{<H^}-cB0QEU;IqB<~PQ7do$v6e*-u-7|4$SJ(Z<=3JXuQNwlwjTcY(hChrJ zLgNx>Jjd$~XNSPzt@GziL=mgy;Y+qBZh&1qKxwm{>$kMCyH2rN?F2%^-bX#z9QBC| zNx?aIaFXEMqAKsMWDfWB@Pt3@$5LZ%DVDT70icB1BXM`F_#4rYqTkpk%w<fYkBm>f tVgFekgZM{XhA!KlmFcR^%iaf4$rSfz)nO-hfB%&wE2$_^D)!aq{{YOB6}SKZ diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_009_magic.png deleted file mode 100644 index f1cfb3785f3b1a76a3bdb87d9a34345d27705950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wtpJ}8*Z=?j1DV8tXThFbKy|z& zL4Lsu{O9G@&(Dwd@2}tgJ~Y315l~`_r;B4qMVxD&E!QCjf!6d+`-@qeN@kitk*wQ< zbcz`i#RYWsG#oK=|G?2CzVR!=O_c=0@{dnh&DTqm{hX0MPhqLSY$oMTHM92|jQPUS z$u~dJn(3@V(AF6n&BD&aZr$6t(eyxM`xH;HX7}(3Tv~f}I*T&ohV*WqZrk|r5F5+! za~p3nTw8Uwq~`b1CWjt=h0;&Im@8vc8tzux=W4__mY%Tpb6P#iTAhK#?1`sB@u{%Z amOl)_8=TB`9G_bS3II=6KbLh*2~7ZAGiXKt diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_042_group.png deleted file mode 100644 index be5c6f94b560661d614e9f1f30b89bdca347bb40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^%0Mi}!VDyLI9QYbDXjpX5ZC|z{{xxCfM>y;T|jlb zB|(0{4EOEp`QOK%pP#S4UtXzq`X`{oN>3NZkczmur);?nIf%4ge9o`T)pW#9qGRgX zro4npH?*5v5A@!+xr@bdd%}C67D?CS;_r`C{dqJ)J~T(4nW?^>?L?AhC~JXcaPt(= z3!4(}vrT5M@)BLJI7M*Ek1t+#!ma-A$zsyxE5BJNb%1f+_kY4y-5t!A&vKREp3PvP zwq&(6<MxFf^MzD3Z=6}%D8QYXsPk!BTl~B)1tPk$w9am?*zW1MMxge;w}0S;-QPCs RcpU-qwWq6}%Q~loCIGmYXmJ1l diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_079_podium.png deleted file mode 100644 index 20b7c99b9d44a8c1e61ad0e26e263ff61dd4c1e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^GC(ZK!VDyr>rBoEaRPioT>t<74`iYN+qO4_Kq0o0 zAirP+--f~fgI8yr&H_a;JzX3_D&j)V9u#a);BmPqlcVt1fiZ${ngi>W3Eh9EKTz`u z`~K}&x<gWQ_S*?}7<M-Y{-3zV;Od?~MGavGMFS7o+DUh--*_yU?&9mFQp+`Km-x(A t&egM7l{dMin65pk#9=c}A^gd4O>>_Pr%5Y0&gX($=IQF^vd$@?2>{H6My&t< diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_082_roundabout.png deleted file mode 100644 index e3a6487a01f6a41b1edf9687b2db5e0c960add4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345 zcmeAS@N?(olHy`uVBq!ia0vp^(jd&i3?z4Pv7`ej;{cx!*Z=?j1DPa&j}1ONKn(&V zL4Lsu_wDEFzu(`V@6Ug}UVeRicYcF5Q0}Owi(^PdT<L|Ec}Em@S}(qC)%C8v|38y^ z#YQ2c;(sm|+jW>3T(A4w=rp~P+RWAbVsGG&fOokQ7R3sd>E8PD_u&3nWv&lOVm`J^ ze|vM&<06Br89xIa>}=R#>9o;9W|PyWohr{$_$KwWpGstQi*A!@Rk7Rl>Q~;wEGID? zF3lG?HR4WEyWBSI6VJWA@W}ze{1=*Trsp(%i)mhK?u|Gp8R)L%a3s-9ysWK3C{USI w)Nk1m4KeGJU%0ooO+O>DJ>sHY&F7VW80%Phop;D~2!KMz)78&qol`;+0A00u82|tP diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_155_show_thumbnails.png deleted file mode 100644 index 751e3b7184e58edcd7c05beee1d0f227104f10bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@O3?%<m{i^^{YymzYuK)l42QotsU9JOCj3q&S z!3+-1ZlnP@vYsxEAr*0RPcGzTVBk5t;cxxsgC2>2%B(*F{8!s6?>E)7Fp?1kDrE3< L^>bP0l+XkK;3Oe& diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_163_iphone.png deleted file mode 100644 index 926df7e5506172b27b22895137b5a1058005ffc4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^d_XM0!VDxWUS3QAaRPioT!Azi`2YVuP-NMpve`h2 zy(Gvl*!R8tdH#Hc;xpTx0EKKkT^vIy;*K8Q$jhL}bM%6}^Q<dAh1_@eavbCppL`8; zI>@o3a+B1|lcxoiuinJo<ZShSeazzKJ$6?V4w$V|Q!kbd-1`w^r>Co*%Q~loCIB&* BG}r(D diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_214_resize_small.png deleted file mode 100644 index 707d9e03e3148636d89aa67a346dd9963be91766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaN3?zjj6;1;wg8-ip*Z=?j1DV7F{ksdQfvWjS zg8YIR=JV^nmp^acU+=$v{r&hYB7FToskxpmjv*Csu^0AoG6f2-Jg7aTsPwOab<V`5 ziHAxHSnrf7+&Iw58_~datSv3AZCXMG=d=e0KTGyWpSdTj{#!z<ZR(7}Eg4fEZBVn? zxrF1$0sY2VFPw~(WRev3&UgCN)tb2C1h00hey8lAw<+AuqBov7x9!!Y^&b=`F&&sa z!RMpV7E%7@;27SQ_v2)e4fW=^v_@^>HN4uq<mc(wSv8D@Z+RH3l77np^0B9@pUXO@ GgeCwxyk)}x diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/glyphicons/glyphicons_266_book_open.png deleted file mode 100644 index ab04b4a1b3f47fc15d890af14d510fbd6f876395..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmeAS@N?(olHy`uVBq!ia0vp^5<o1@!3-qT{@2R`DdPa25ZC|z{{xvMfsYM7JU|Ts zB|(0{3=R9==lk39>#vW$FF(Kk{Dqnc|A2B6JY5_^D&p4m-{v}GAi{FJxM=T|yZ`@3 z`Ok_n<p?d1J2b&S=b#_g$&_o8Zr+UP$-8YT&aiUU$_)FjS7t4kBE)z^sV0!Mv)R-0 z4x7L0_18?ne@?UQyM18G$My9w_FFDAczUY8>8K9=V9Zkb(T?T)b+2osKNh)^&2-N{ uQLwuuVq!yD>nc%Rk1&p+Bh5j6y+8R*nee(jv{(@d@~Ee)pUXO@geCx`LSohc diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/grid-18px-masked.png deleted file mode 100644 index 1bc82b03ab97f8173d664744abf93e831fe92a07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>Ml8%gR!7*aO+ZRFz$e5NNaF|p|Nn<8;5jP$ z6v*K(3GxeOVCQ9IW@TdIX5nGr;^b(LY)J%Kz~SlQ7*Y}U_J)1lAp?nHiSmkf8osei ztYYL}Q9SM4G%dsG2Mj&3whAiS`a+k>H1<wa-cZDSX8zmB4~jVi)c2QHwYyK79zHGS zo*SoOa<S(^joND&Cbu(JTzv6;$_6%*S>^1#Y1ZdKVvdV%@=2YIXOud-d-8TSFsJN7 z#<s^x|Ai_{{kAr9y+-rZ7yoDMm-khwdExtv`RY^+|7%kh@wlv?{N<UpVrROytjozz z_La`Rt8ORex}FS;Ub)uoefV-6wd=)UY150!+Dkr4y*0V@HK4k+ENJ(hFF8V=E%(k{ zoc&&H>6NK2T)lcr^-Qhqth{*IqWe9+uab|=?QKi5d)G;4n(WG3#vf$gY2)X%O9&Kp Mp00i_>zopr02z0cQvd(} diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-css3.png deleted file mode 100644 index 58e107235a8e805f20c87f28d58d9d0614c0b79f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3-p~d(N!@Qq=)IA+AaT2l`4Lu>+l<Q4-`A z%rGaj>&&hX=eK-LJ~_dF|KTfLm4u&cu^Y`i+Cxg8Gas(DnRdHTo##pRmrM(wo;pt# z$B>G+sb{bA9aa!vy?As7%k~>D_fG%$U!TWula7M^&VKh>kw15`<j+-o8l0y2HB;Qh z=mz_hgF35b2Zz`n|7zvon;>^Vq-vt*8urY@jUpEpu<vqub<QyBbL-kujysDR9tFrV zdgx3Qeca{!n(M4?c|pC+@%!sHRlRomcZ=Qpk@&}Y{gr({moRv``njxgN@xNAE<tpx diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-github.png deleted file mode 100644 index 1a5fb781e46f35a545f636f6e1039cca61690a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3-p~d(N!@Qf2`@A+A9B|Ns9$k|gl-bJBL8 z2EmdbzhDN2_YDaS1?L6sE3Dr?-yooWqQR*-K*<H3E{-7;ajEA|_Axthuv|0|xpJ-h z@&Ed3^BikGS+`B`c=6S_-mR=*p0n%r#M`yf*H)S6eAVY&f9d^-+TGT^Qfa4WJ};DM z)8DM9{#4|iSIpfdCzDU^y1^y4#O#o^=yc_C88#M=UCxx3$(8$Dk$i2X6>)ii_Qwrd z)h?)5t~A_vr*GF<Zt0+e@T#S!JF0}@8J1uFp{>>`S+ynCpnUa*UmqC*gSfW~{=eV} O^0}w0pUXO@geCx--fSEI diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-html5.png deleted file mode 100644 index 1e8788313acfded4f571e27bfdf1a09973323af9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3-p~d(N!@QgZ@)LR^&wF<9rn${FZR<B}l1 zV1}8-(=rdwueRZT+nB%3sjhw3$$Q`S`i1-qS3G0crLHT=d7$^$mfK4Mwf;PeGD|a1 zdCsHzZJ#nw`w~wV$B>G+*mFnoSPU5s1Z<bQCmXfQ$oR+q|7+VlCR)9JwEE=S6Pa@} zIQ>}Cc3F6f-J1N8_2k^NoUIC#m(sOlSNhr%u5^!>Srh!4KW46b@4W-(WKXWve&E|( zF`;m6|AD~t`P)~q>R0jGWE@{$bs>{mWY_b6zU0b;^^6iFen(=`4WHGrhR$Ct`C;8E zU*X-XR{vKr*qz!s@%5+fjw<14r#Jj$eZa4MUG3`{$pwKx_cD08`njxgN@xNAiqVg) diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/icon-twitter.png deleted file mode 100644 index a4716545fa6ff394c3b56e52236870268cfb5bc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^LO?9S!3-p~d(N!@Qf2`@A+G=b{|7Qj1@8Kb*8%ki zmIV0)GcfFbFOaa_;JkuE!~FXJ{RNxvG-v=N3p`yMLn`9dp7Z2mR^)NHxaFXOaoOGf zn?4FeM!Nr$K5~0UoPD|L&nfHH2keiPy7WV!IU>VhmY+Cd_H&k8i<`?2MwM!ZZq(Q) zxNo-EqU{aK#J36^adHnYYzi-NiFM)9yIJ;B^0*x1{Zf0Cxw;8oj^Fzk$^N;i+UOq0 NGoG$~F6*2UngAZ3Q2GD> diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-logo-large.png deleted file mode 100644 index cb56637cbf644ede9beee81798343b7116a3480c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13078 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 diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/less-small.png deleted file mode 100644 index 93ea597cb707b6c3f0d9c331459388fa8bdd0848..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1181 zcmX9+3pCqj6#ol0a}sY7Z|Nw<YoZ=yB2!7dQw!P1@m#Hk)gy$3CDnL^YR?hvtT^-9 z%xR4g@0bnkPB}uAm4h`4vW5{9#g^vO?vC%A|NY<Z_uc!u_xs)NRwOkDqiv>*AP6QT zm`sDe1AI6wb+Dt1D+dUI(u)j_rktLhqS0tNogN$<3{FZ)%G%nRQmF*IsHn)x%L_p8 zmzS62ayj^LG&D2>$jQkGSRRiD_H1o!ZGi)LNl6J<p->3+@bEAxDG6{RBctx_Zk0*} zBxku$NFWgC>gw+8?LqDt|MBs$R4Rokkhrq40>QJhvo$p};OOY+OifKea7#-I27|G- zwvLI3F)%OyPB;n+3&Y`X5C*ki3n0V*`N6?~v9U2^VX;_qb8|gCJs?*o6ecDnkgKn+ z&*5;O7PKc8i><7z3=Iu|M<$a&lk@ZQ1OlPHzFs1cSXx>_^}xVDXtl4e&&S6H8m3Sv z0|Nv0_V(f7;R_23PEJl^V`H_owd3RCBO@cRv9WwUAG!q@MIw=%on2vJA&bQ#5{Wb# z&EMbO+1WWDARsC#s<E+gV`GC#rJ9<Wl1L;_J1Z*-E)H`^PELlad3$?zc6OSXnWd$r zxx2fAlKJ`h>FMdIsi~lIL_`FG!I+tu@$>U@bab?}wS~F3y1Lrf*mQJs;PLp3j0}*= z!@~n+>gnl8CX=~bE=-)wW@lz*g1p(;*%cKP@$vE7>zpHaBA0V%)F_0bu3?}l`9`Rr zjuQ8->oz%HGkg7+9bM(qC+c$VKV@$V4DwD4vBoccxh&-D6KbUQ?@9Ed2Q@Xy4xf6v zU1P6sSkWeer3do}qIMiY4v5ZA=zm7fvLG1o*V5)Qe*d}-*5AEEw0PR+n*9IW>1V|H z&aZkobsO@@11GWXBMrt{PK2!e`i~a<3#z|zMD1_w4;Nh$BBKsn{^|L4_0`=USPhwC zbfo$NoLP)0w0ovp{{)rT$9~Cumhi@nHEc;Ov%QJpKOWEV*qJv@Z`dhqQ)%O(`+J@< z-){^5@)BiNQ`y-~M+egsZEcb-=-leW#mM+Y?Ecj0BcDnBuc+D23x4CR2YN`q=Y?)! zu!`zeagRG9M*iTM3{pN2u&-<T<~iNkEpNu`p5OLm26kO3@a^Wd*f=xzybcmF{5pH} zhCJs&kF@BCT9^fLcc<N|CnxuanvB_G#BY4s^lz_@ECLx@nuv5lF39HIz2Ts>?VVnF z|Mk8=h2)S7U0g<qyCgy-VbI^8S)ihX4rXjLy(p@<s1s+G-CW{!z7kKmn&(!`y@Pt_ zrC4!ca+){UXq@n8$w#f7B4*e42+0v&M_|2oFR@KH*cTLKU-eycL*v9dh_Y2TE`SrN zRvV~@O{;p7R9QMnG{KX19G}q7wJC2Ooips`?w3sl4;$?UJ)hM|zEeIeN7Ky0oma;K zKJ+73e`5NOCz7JdtCrU0u1?G)_@o!-uD7mU%u`OcRz7VQWqw?%byH2pO;K5S@RA2_ O3JIZ5$v<66D*g`$g+KrR diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/img/responsive-illustrations.png deleted file mode 100644 index 6ca0f07888b8d7ee1a1691d2daa9030d5dae63c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1077 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!Cvq?YNxz2D2q5)5z$e7@|Ns9p2RC@|;K9$I zKNl@p1a#`DQ>X6TySHoCuD5UBZr{HB;lqb7Uc8t;fBv>@+jj2U`Rv)VjT<-4o;`cV zjvbF4J$mxw$)7)eo<DyM^q)cJo+&^to0SCl1v4<bm0rE>`I8k|AO6^Xwy99}{u!9C z@yy`^mqg|2@^8mZGuVEW`QDs|CspPz<v-TKX8dZGpW+tJsjcM<3{1y8T^vIy;@({7 z<YZ9bVLo8zwOYX<;@kY=hE4~hAD-FFZMEw1-H1E~Z=JYn4YN+3z7<eh5qUv*%Gb?u z)+G+W&_BfBk-WG0@8=nhrCk(cyEdhqoTTbKO(zl;<J#tIb#(@&Kmpd+LdJt7XA;=d z{#W=MJS_e(Sk^)Q)t|batNS<XiP)%kZ&TmQjf<T3BzpIV$~`*Ux$%(m9%aL8!Oc<g zvkqo0HHpxzd7pf+iIqF-grQEvhJ=GnU*7@=R&Fr}k4(nvwB>O@5-d#$4QYQ`KTcl5 zH1CMN&>0sK?#F-63kNuDx+Ix7A#YXK-b}80i*hzvv}%iOXxJ)oF(NiNuvAWeWzHJy z+_#ZN*LruDS#lnG^}l}J?Co!+#~57emeQWq9oly#LU}_2t4_jN_J{*aVjIpdN0`lw z_s-VIxwiX9($P0-HvKizPH7i?*S^#?Eo@%d!K||hQJWgW>jVrJbuq<TCYWBXRG0eU zzq9PpEd!pGL<_Im6SmyU+U=Q}et-8n?nVij8jdCR|Npl=YT0g-%&X+|-qZYGvw)M2 zr{@*Mt=UUu*|jZogf(@_UU|gYt`Rb}y7q6wo%teR$91ONRo7-Qy{~hvuONNqF{y@I z7j(onmCQ}M)gKhN#%RS?)eSxSH@j?H=dkv<O&Cj&a-fcrdb=sx&d$#fb|-x29?xo= zV_q!#TIS2Gb;)NP^$TRQ*%r4dTwB^2QEL#zl@uG%v6X50E}5{kIkMMeBkrC~d@4VE zTB2>kRPpY_zw_05uU<Hw)f5@Z+^u|b>akr{k5%y;)HP^++I@b?t0Y%{)-v9ngq7(p zGgEcfOuv3ly6elokC_bKSNCfPteSNG;D5&T;!Fiv=2uPuGX;aEtDnm{r-UW|29*qX diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md deleted file mode 100644 index b58fa1d4074..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/README.md +++ /dev/null @@ -1,106 +0,0 @@ -## 2.0 BOOTSTRAP JS PHILOSOPHY -These are the high-level design rules which guide the development of Bootstrap's plugin apis. - ---- - -### DATA-ATTRIBUTE API - -We believe you should be able to use all plugins provided by Bootstrap purely through the markup API without writing a single line of javascript. - -We acknowledge that this isn't always the most performant and sometimes it may be desirable to turn this functionality off altogether. Therefore, as of 2.0 we provide the ability to disable the data attribute API by unbinding all events on the body namespaced with `'data-api'`. This looks like this: - - $('body').off('.data-api') - -To target a specific plugin, just include the plugins name as a namespace along with the data-api namespace like this: - - $('body').off('.alert.data-api') - ---- - -### PROGRAMATIC API - -We also believe you should be able to use all plugins provided by Bootstrap purely through the JS API. - -All public APIs should be single, chainable methods, and return the collection acted upon. - - $(".btn.danger").button("toggle").addClass("fat") - -All methods should accept an optional options object, a string which targets a particular method, or null which initiates the default behavior: - - $("#myModal").modal() // initialized with defaults - $("#myModal").modal({ keyboard: false }) // initialized with now keyboard - $("#myModal").modal('show') // initializes and invokes show immediately afterqwe2 - ---- - -### OPTIONS - -Options should be sparse and add universal value. We should pick the right defaults. - -All plugins should have a default object which can be modified to effect all instance's default options. The defaults object should be available via `$.fn.plugin.defaults`. - - $.fn.modal.defaults = { … } - -An options definition should take the following form: - - *noun*: *adjective* - describes or modifies a quality of an instance - -examples: - - backdrop: true - keyboard: false - placement: 'top' - ---- - -### EVENTS - -All events should have an infinitive and past participle form. The infinitive is fired just before an action takes place, the past participle on completion of the action. - - show | shown - hide | hidden - ---- - -### CONSTRUCTORS - -Each plugin should expose it's raw constructor on a `Constructor` property -- accessed in the following way: - - - $.fn.popover.Constructor - ---- - -### DATA ACCESSOR - -Each plugin stores a copy of the invoked class on an object. This class instance can be accessed directly through jQuery's data API like this: - - $('[rel=popover]').data('popover') instanceof $.fn.popover.Constructor - ---- - -### DATA ATTRIBUTES - -Data attributes should take the following form: - -- data-{{verb}}={{plugin}} - defines main interaction -- data-target || href^=# - defined on "control" element (if element controls an element other than self) -- data-{{noun}} - defines class instance options - -examples: - - // control other targets - data-toggle="modal" data-target="#foo" - data-toggle="collapse" data-target="#foo" data-parent="#bar" - - // defined on element they control - data-spy="scroll" - - data-dismiss="modal" - data-dismiss="alert" - - data-toggle="dropdown" - - data-toggle="button" - data-toggle="buttons-checkbox" - data-toggle="buttons-radio" \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js deleted file mode 100644 index 6463b902fb1..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/application.js +++ /dev/null @@ -1,184 +0,0 @@ -// NOTICE!! DO NOT USE ANY OF THIS JAVASCRIPT -// IT'S ALL JUST JUNK FOR OUR DOCS! -// ++++++++++++++++++++++++++++++++++++++++++ - -!function ($) { - - $(function(){ - - // Disable certain links in docs - $('section [href^=#]').click(function (e) { - e.preventDefault() - }) - - // make code pretty - window.prettyPrint && prettyPrint() - - // add-ons - $('.add-on :checkbox').on('click', function () { - var $this = $(this) - , method = $this.attr('checked') ? 'addClass' : 'removeClass' - $(this).parents('.add-on')[method]('active') - }) - - // position static twipsies for components page - if ($(".twipsies a").length) { - $(window).on('load resize', function () { - $(".twipsies a").each(function () { - $(this) - .tooltip({ - placement: $(this).attr('title') - , trigger: 'manual' - }) - .tooltip('show') - }) - }) - } - - // add tipsies to grid for scaffolding - if ($('#grid-system').length) { - $('#grid-system').tooltip({ - selector: '.show-grid > div' - , title: function () { return $(this).width() + 'px' } - }) - } - - // fix sub nav on scroll - var $win = $(window) - , $nav = $('.subnav') - , navTop = $('.subnav').length && $('.subnav').offset().top - 40 - , isFixed = 0 - - processScroll() - - // hack sad times - holdover until rewrite for 2.1 - $nav.on('click', function () { - if (!isFixed) setTimeout(function () { $win.scrollTop($win.scrollTop() - 47) }, 10) - }) - - $win.on('scroll', processScroll) - - function processScroll() { - var i, scrollTop = $win.scrollTop() - if (scrollTop >= navTop && !isFixed) { - isFixed = 1 - $nav.addClass('subnav-fixed') - } else if (scrollTop <= navTop && isFixed) { - isFixed = 0 - $nav.removeClass('subnav-fixed') - } - } - - // tooltip demo - $('.tooltip-demo.well').tooltip({ - selector: "a[rel=tooltip]" - }) - - $('.tooltip-test').tooltip() - $('.popover-test').popover() - - // popover demo - $("a[rel=popover]") - .popover() - .click(function(e) { - e.preventDefault() - }) - - // button state demo - $('#fat-btn') - .click(function () { - var btn = $(this) - btn.button('loading') - setTimeout(function () { - btn.button('reset') - }, 3000) - }) - - // carousel demo - $('#myCarousel').carousel() - - // javascript build logic - var inputsComponent = $("#components.download input") - , inputsPlugin = $("#plugins.download input") - , inputsVariables = $("#variables.download input") - - // toggle all plugin checkboxes - $('#components.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsComponent.attr('checked', !inputsComponent.is(':checked')) - }) - - $('#plugins.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsPlugin.attr('checked', !inputsPlugin.is(':checked')) - }) - - $('#variables.download .toggle-all').on('click', function (e) { - e.preventDefault() - inputsVariables.val('') - }) - - // request built javascript - $('.download-btn').on('click', function () { - - var css = $("#components.download input:checked") - .map(function () { return this.value }) - .toArray() - , js = $("#plugins.download input:checked") - .map(function () { return this.value }) - .toArray() - , vars = {} - , img = ['glyphicons-halflings.png', 'glyphicons-halflings-white.png'] - - $("#variables.download input") - .each(function () { - $(this).val() && (vars[ $(this).prev().text() ] = $(this).val()) - }) - - $.ajax({ - type: 'POST' - , url: /\?dev/.test(window.location) ? 'http://localhost:3000' : 'http://bootstrap.herokuapp.com' - , dataType: 'jsonpi' - , params: { - js: js - , css: css - , vars: vars - , img: img - } - }) - }) - }) - -// Modified from the original jsonpi https://github.com/benvinegar/jquery-jsonpi -$.ajaxTransport('jsonpi', function(opts, originalOptions, jqXHR) { - var url = opts.url; - - return { - send: function(_, completeCallback) { - var name = 'jQuery_iframe_' + jQuery.now() - , iframe, form - - iframe = $('<iframe>') - .attr('name', name) - .appendTo('head') - - form = $('<form>') - .attr('method', opts.type) // GET or POST - .attr('action', url) - .attr('target', name) - - $.each(opts.params, function(k, v) { - - $('<input>') - .attr('type', 'hidden') - .attr('name', k) - .attr('value', typeof v == 'string' ? v : JSON.stringify(v)) - .appendTo(form) - }) - - form.appendTo('body').submit() - } - } -}) - -}(window.jQuery) \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js deleted file mode 100644 index 57890a9a281..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-alert.js +++ /dev/null @@ -1,90 +0,0 @@ -/* ========================================================== - * bootstrap-alert.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js deleted file mode 100644 index 7f187be6206..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-button.js +++ /dev/null @@ -1,96 +0,0 @@ -/* ============================================================ - * bootstrap-button.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js deleted file mode 100644 index 551de589112..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-carousel.js +++ /dev/null @@ -1,169 +0,0 @@ -/* ========================================================== - * bootstrap-carousel.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = options - this.options.slide && this.slide(this.options.slide) - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e = $.Event('slide') - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js deleted file mode 100644 index fbc915b9f96..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-collapse.js +++ /dev/null @@ -1,157 +0,0 @@ -/* ============================================================= - * bootstrap-collapse.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js deleted file mode 100644 index 454a9684b52..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-dropdown.js +++ /dev/null @@ -1,100 +0,0 @@ -/* ============================================================ - * bootstrap-dropdown.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , selector - , isActive - - if ($this.is('.disabled, :disabled')) return - - selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body') - .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js deleted file mode 100644 index 38fd0c8468c..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-modal.js +++ /dev/null @@ -1,218 +0,0 @@ -/* ========================================================= - * bootstrap-modal.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (content, options) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - $('body').addClass('modal-open') - - this.isShown = true - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal(that) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop(callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - if (this.options.backdrop != 'static') { - this.$backdrop.click($.proxy(this.hide, this)) - } - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) : - removeBackdrop.call(this) - - } else if (callback) { - callback() - } - } - - function removeBackdrop() { - this.$backdrop.remove() - this.$backdrop = null - } - - function escape() { - var that = this - if (this.isShown && this.options.keyboard) { - $(document).on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - $(document).off('keyup.dismiss.modal') - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL DATA-API - * ============== */ - - $(function () { - $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data()) - - e.preventDefault() - $target.modal(option) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js deleted file mode 100644 index 39fbe358eb3..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-popover.js +++ /dev/null @@ -1,98 +0,0 @@ -/* =========================================================== - * bootstrap-popover.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#popovers - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function ( element, options ) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = $e.attr('data-content') - || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>' - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js deleted file mode 100644 index dce37181267..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-scrollspy.js +++ /dev/null @@ -1,151 +0,0 @@ -/* ============================================================= - * bootstrap-scrollspy.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#scrollspy - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy( element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && href.length - && [[ $href.position().top, href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu')) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - $.fn.scrollspy = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js deleted file mode 100644 index d87f35099ae..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tab.js +++ /dev/null @@ -1,135 +0,0 @@ -/* ======================================================== - * bootstrap-tab.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tabs - * ======================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function ( element ) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active a').last()[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB DATA-API - * ============ */ - - $(function () { - $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js deleted file mode 100644 index b476f1c4e6d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-tooltip.js +++ /dev/null @@ -1,275 +0,0 @@ -/* =========================================================== - * bootstrap-tooltip.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - if (this.options.trigger != 'manual') { - eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , inside - , pos - , actualWidth - , actualHeight - , placement - , tp - - if (this.hasContent() && this.enabled) { - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - inside = /in/.test(placement) - - $tip - .remove() - .css({ top: 0, left: 0, display: 'block' }) - .appendTo(inside ? this.$element : document.body) - - pos = this.getPosition(inside) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (inside ? placement.split(' ')[1] : placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - $tip - .css(tp) - .addClass(placement) - .addClass('in') - } - } - - , isHTML: function(text) { - // html string detection logic adapted from jQuery - return typeof text != 'string' - || ( text.charAt(0) === "<" - && text.charAt( text.length - 1 ) === ">" - && text.length >= 3 - ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text) - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).remove() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.remove() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.remove() - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function (inside) { - return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { - width: this.$element[0].offsetWidth - , height: this.$element[0].offsetHeight - }) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function () { - this[this.tip().hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover' - , title: '' - , delay: 0 - } - -}(window.jQuery); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js deleted file mode 100644 index 534182622d0..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-transition.js +++ /dev/null @@ -1,61 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - $(function () { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd' - , 'msTransition' : 'MSTransitionEnd' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js deleted file mode 100644 index ad44b90852d..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap-typeahead.js +++ /dev/null @@ -1,285 +0,0 @@ -/* ============================================================= - * bootstrap-typeahead.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#typeahead - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.$menu = $(this.options.menu).appendTo('body') - this.source = this.options.source - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.offset(), { - height: this.$element[0].offsetHeight - }) - - this.$menu.css({ - top: pos.top + pos.height - , left: pos.left - }) - - this.$menu.show() - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var that = this - , items - , q - - this.query = this.$element.val() - - if (!this.query) { - return this.shown ? this.hide() : this - } - - items = $.grep(this.source, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if ($.browser.webkit || $.browser.msie) { - this.$element.on('keydown', $.proxy(this.keypress, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , keypress: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - if (e.type != 'keydown') break - e.preventDefault() - this.prev() - break - - case 40: // down arrow - if (e.type != 'keydown') break - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , blur: function (e) { - var that = this - setTimeout(function () { that.hide() }, 150) - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - } - - , mouseenter: function (e) { - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(function () { - $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - e.preventDefault() - $this.typeahead($this.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js deleted file mode 100644 index 5d6e65b8249..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.js +++ /dev/null @@ -1,1825 +0,0 @@ -/* =================================================== - * bootstrap-transition.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#transitions - * =================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - $(function () { - - "use strict"; // jshint ;_; - - - /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) - * ======================================================= */ - - $.support.transition = (function () { - - var transitionEnd = (function () { - - var el = document.createElement('bootstrap') - , transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd' - , 'msTransition' : 'MSTransitionEnd' - , 'transition' : 'transitionend' - } - , name - - for (name in transEndEventNames){ - if (el.style[name] !== undefined) { - return transEndEventNames[name] - } - } - - }()) - - return transitionEnd && { - end: transitionEnd - } - - })() - - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-alert.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#alerts - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* ALERT CLASS DEFINITION - * ====================== */ - - var dismiss = '[data-dismiss="alert"]' - , Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - , selector = $this.attr('data-target') - , $parent - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - - e && e.preventDefault() - - $parent.length || ($parent = $this.hasClass('alert') ? $this : $this.parent()) - - $parent.trigger(e = $.Event('close')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent - .trigger('closed') - .remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent.on($.support.transition.end, removeElement) : - removeElement() - } - - - /* ALERT PLUGIN DEFINITION - * ======================= */ - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('alert') - if (!data) $this.data('alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - /* ALERT DATA-API - * ============== */ - - $(function () { - $('body').on('click.alert.data-api', dismiss, Alert.prototype.close) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-button.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#buttons - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* BUTTON PUBLIC CLASS DEFINITION - * ============================== */ - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.button.defaults, options) - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - , $el = this.$element - , data = $el.data() - , val = $el.is('input') ? 'val' : 'html' - - state = state + 'Text' - data.resetText || $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d) - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.parent('[data-toggle="buttons-radio"]') - - $parent && $parent - .find('.active') - .removeClass('active') - - this.$element.toggleClass('active') - } - - - /* BUTTON PLUGIN DEFINITION - * ======================== */ - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('button') - , options = typeof option == 'object' && option - if (!data) $this.data('button', (data = new Button(this, options))) - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.defaults = { - loadingText: 'loading...' - } - - $.fn.button.Constructor = Button - - - /* BUTTON DATA-API - * =============== */ - - $(function () { - $('body').on('click.button.data-api', '[data-toggle^=button]', function ( e ) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - }) - }) - -}(window.jQuery);/* ========================================================== - * bootstrap-carousel.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#carousel - * ========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* CAROUSEL CLASS DEFINITION - * ========================= */ - - var Carousel = function (element, options) { - this.$element = $(element) - this.options = options - this.options.slide && this.slide(this.options.slide) - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.prototype = { - - cycle: function (e) { - if (!e) this.paused = false - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - return this - } - - , to: function (pos) { - var $active = this.$element.find('.active') - , children = $active.parent().children() - , activePos = children.index($active) - , that = this - - if (pos > (children.length - 1) || pos < 0) return - - if (this.sliding) { - return this.$element.one('slid', function () { - that.to(pos) - }) - } - - if (activePos == pos) { - return this.pause().cycle() - } - - return this.slide(pos > activePos ? 'next' : 'prev', $(children[pos])) - } - - , pause: function (e) { - if (!e) this.paused = true - clearInterval(this.interval) - this.interval = null - return this - } - - , next: function () { - if (this.sliding) return - return this.slide('next') - } - - , prev: function () { - if (this.sliding) return - return this.slide('prev') - } - - , slide: function (type, next) { - var $active = this.$element.find('.active') - , $next = next || $active[type]() - , isCycling = this.interval - , direction = type == 'next' ? 'left' : 'right' - , fallback = type == 'next' ? 'first' : 'last' - , that = this - , e = $.Event('slide') - - this.sliding = true - - isCycling && this.pause() - - $next = $next.length ? $next : this.$element.find('.item')[fallback]() - - if ($next.hasClass('active')) return - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - this.$element.one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - } - - - /* CAROUSEL PLUGIN DEFINITION - * ========================== */ - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('carousel') - , options = $.extend({}, $.fn.carousel.defaults, typeof option == 'object' && option) - if (!data) $this.data('carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (typeof option == 'string' || (option = options.slide)) data[option]() - else if (options.interval) data.cycle() - }) - } - - $.fn.carousel.defaults = { - interval: 5000 - , pause: 'hover' - } - - $.fn.carousel.Constructor = Carousel - - - /* CAROUSEL DATA-API - * ================= */ - - $(function () { - $('body').on('click.carousel.data-api', '[data-slide]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , options = !$target.data('modal') && $.extend({}, $target.data(), $this.data()) - $target.carousel(options) - e.preventDefault() - }) - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-collapse.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#collapse - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* COLLAPSE PUBLIC CLASS DEFINITION - * ================================ */ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.collapse.defaults, options) - - if (this.options.parent) { - this.$parent = $(this.options.parent) - } - - this.options.toggle && this.toggle() - } - - Collapse.prototype = { - - constructor: Collapse - - , dimension: function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - , show: function () { - var dimension - , scroll - , actives - , hasData - - if (this.transitioning) return - - dimension = this.dimension() - scroll = $.camelCase(['scroll', dimension].join('-')) - actives = this.$parent && this.$parent.find('> .accordion-group > .in') - - if (actives && actives.length) { - hasData = actives.data('collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('collapse', null) - } - - this.$element[dimension](0) - this.transition('addClass', $.Event('show'), 'shown') - this.$element[dimension](this.$element[0][scroll]) - } - - , hide: function () { - var dimension - if (this.transitioning) return - dimension = this.dimension() - this.reset(this.$element[dimension]()) - this.transition('removeClass', $.Event('hide'), 'hidden') - this.$element[dimension](0) - } - - , reset: function (size) { - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - [dimension](size || 'auto') - [0].offsetWidth - - this.$element[size !== null ? 'addClass' : 'removeClass']('collapse') - - return this - } - - , transition: function (method, startEvent, completeEvent) { - var that = this - , complete = function () { - if (startEvent.type == 'show') that.reset() - that.transitioning = 0 - that.$element.trigger(completeEvent) - } - - this.$element.trigger(startEvent) - - if (startEvent.isDefaultPrevented()) return - - this.transitioning = 1 - - this.$element[method]('in') - - $.support.transition && this.$element.hasClass('collapse') ? - this.$element.one($.support.transition.end, complete) : - complete() - } - - , toggle: function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* COLLAPSIBLE PLUGIN DEFINITION - * ============================== */ - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('collapse') - , options = typeof option == 'object' && option - if (!data) $this.data('collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.defaults = { - toggle: true - } - - $.fn.collapse.Constructor = Collapse - - - /* COLLAPSIBLE DATA-API - * ==================== */ - - $(function () { - $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) { - var $this = $(this), href - , target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - , option = $(target).data('collapse') ? 'toggle' : $this.data() - $(target).collapse(option) - }) - }) - -}(window.jQuery);/* ============================================================ - * bootstrap-dropdown.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#dropdowns - * ============================================================ - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* DROPDOWN CLASS DEFINITION - * ========================= */ - - var toggle = '[data-toggle="dropdown"]' - , Dropdown = function (element) { - var $el = $(element).on('click.dropdown.data-api', this.toggle) - $('html').on('click.dropdown.data-api', function () { - $el.parent().removeClass('open') - }) - } - - Dropdown.prototype = { - - constructor: Dropdown - - , toggle: function (e) { - var $this = $(this) - , $parent - , selector - , isActive - - if ($this.is('.disabled, :disabled')) return - - selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - $parent = $(selector) - $parent.length || ($parent = $this.parent()) - - isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) $parent.toggleClass('open') - - return false - } - - } - - function clearMenus() { - $(toggle).parent().removeClass('open') - } - - - /* DROPDOWN PLUGIN DEFINITION - * ========================== */ - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('dropdown') - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - /* APPLY TO STANDARD DROPDOWN ELEMENTS - * =================================== */ - - $(function () { - $('html').on('click.dropdown.data-api', clearMenus) - $('body') - .on('click.dropdown', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) - }) - -}(window.jQuery);/* ========================================================= - * bootstrap-modal.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#modals - * ========================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================= */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* MODAL CLASS DEFINITION - * ====================== */ - - var Modal = function (content, options) { - this.options = options - this.$element = $(content) - .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) - } - - Modal.prototype = { - - constructor: Modal - - , toggle: function () { - return this[!this.isShown ? 'show' : 'hide']() - } - - , show: function () { - var that = this - , e = $.Event('show') - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - $('body').addClass('modal-open') - - this.isShown = true - - escape.call(this) - backdrop.call(this, function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) //don't move modals dom position - } - - that.$element - .show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element.addClass('in') - - transition ? - that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : - that.$element.trigger('shown') - - }) - } - - , hide: function (e) { - e && e.preventDefault() - - var that = this - - e = $.Event('hide') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - $('body').removeClass('modal-open') - - escape.call(this) - - this.$element.removeClass('in') - - $.support.transition && this.$element.hasClass('fade') ? - hideWithTransition.call(this) : - hideModal.call(this) - } - - } - - - /* MODAL PRIVATE METHODS - * ===================== */ - - function hideWithTransition() { - var that = this - , timeout = setTimeout(function () { - that.$element.off($.support.transition.end) - hideModal.call(that) - }, 500) - - this.$element.one($.support.transition.end, function () { - clearTimeout(timeout) - hideModal.call(that) - }) - } - - function hideModal(that) { - this.$element - .hide() - .trigger('hidden') - - backdrop.call(this) - } - - function backdrop(callback) { - var that = this - , animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - if (this.options.backdrop != 'static') { - this.$backdrop.click($.proxy(this.hide, this)) - } - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - doAnimate ? - this.$backdrop.one($.support.transition.end, callback) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) : - removeBackdrop.call(this) - - } else if (callback) { - callback() - } - } - - function removeBackdrop() { - this.$backdrop.remove() - this.$backdrop = null - } - - function escape() { - var that = this - if (this.isShown && this.options.keyboard) { - $(document).on('keyup.dismiss.modal', function ( e ) { - e.which == 27 && that.hide() - }) - } else if (!this.isShown) { - $(document).off('keyup.dismiss.modal') - } - } - - - /* MODAL PLUGIN DEFINITION - * ======================= */ - - $.fn.modal = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('modal') - , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option) - if (!data) $this.data('modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option]() - else if (options.show) data.show() - }) - } - - $.fn.modal.defaults = { - backdrop: true - , keyboard: true - , show: true - } - - $.fn.modal.Constructor = Modal - - - /* MODAL DATA-API - * ============== */ - - $(function () { - $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) { - var $this = $(this), href - , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data()) - - e.preventDefault() - $target.modal(option) - }) - }) - -}(window.jQuery);/* =========================================================== - * bootstrap-tooltip.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tooltips - * Inspired by the original jQuery.tipsy by Jason Frame - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TOOLTIP PUBLIC CLASS DEFINITION - * =============================== */ - - var Tooltip = function (element, options) { - this.init('tooltip', element, options) - } - - Tooltip.prototype = { - - constructor: Tooltip - - , init: function (type, element, options) { - var eventIn - , eventOut - - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.enabled = true - - if (this.options.trigger != 'manual') { - eventIn = this.options.trigger == 'hover' ? 'mouseenter' : 'focus' - eventOut = this.options.trigger == 'hover' ? 'mouseleave' : 'blur' - this.$element.on(eventIn, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut, this.options.selector, $.proxy(this.leave, this)) - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - , getOptions: function (options) { - options = $.extend({}, $.fn[this.type].defaults, options, this.$element.data()) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - , enter: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (!self.options.delay || !self.options.delay.show) return self.show() - - clearTimeout(this.timeout) - self.hoverState = 'in' - this.timeout = setTimeout(function() { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - , leave: function (e) { - var self = $(e.currentTarget)[this.type](this._options).data(this.type) - - if (this.timeout) clearTimeout(this.timeout) - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.hoverState = 'out' - this.timeout = setTimeout(function() { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - , show: function () { - var $tip - , inside - , pos - , actualWidth - , actualHeight - , placement - , tp - - if (this.hasContent() && this.enabled) { - $tip = this.tip() - this.setContent() - - if (this.options.animation) { - $tip.addClass('fade') - } - - placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - inside = /in/.test(placement) - - $tip - .remove() - .css({ top: 0, left: 0, display: 'block' }) - .appendTo(inside ? this.$element : document.body) - - pos = this.getPosition(inside) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - - switch (inside ? placement.split(' ')[1] : placement) { - case 'bottom': - tp = {top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'top': - tp = {top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2} - break - case 'left': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth} - break - case 'right': - tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width} - break - } - - $tip - .css(tp) - .addClass(placement) - .addClass('in') - } - } - - , isHTML: function(text) { - // html string detection logic adapted from jQuery - return typeof text != 'string' - || ( text.charAt(0) === "<" - && text.charAt( text.length - 1 ) === ">" - && text.length >= 3 - ) || /^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(text) - } - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - - $tip.find('.tooltip-inner')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - , hide: function () { - var that = this - , $tip = this.tip() - - $tip.removeClass('in') - - function removeWithAnimation() { - var timeout = setTimeout(function () { - $tip.off($.support.transition.end).remove() - }, 500) - - $tip.one($.support.transition.end, function () { - clearTimeout(timeout) - $tip.remove() - }) - } - - $.support.transition && this.$tip.hasClass('fade') ? - removeWithAnimation() : - $tip.remove() - } - - , fixTitle: function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title') - } - } - - , hasContent: function () { - return this.getTitle() - } - - , getPosition: function (inside) { - return $.extend({}, (inside ? {top: 0, left: 0} : this.$element.offset()), { - width: this.$element[0].offsetWidth - , height: this.$element[0].offsetHeight - }) - } - - , getTitle: function () { - var title - , $e = this.$element - , o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - , tip: function () { - return this.$tip = this.$tip || $(this.options.template) - } - - , validate: function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - , enable: function () { - this.enabled = true - } - - , disable: function () { - this.enabled = false - } - - , toggleEnabled: function () { - this.enabled = !this.enabled - } - - , toggle: function () { - this[this.tip().hasClass('in') ? 'hide' : 'show']() - } - - } - - - /* TOOLTIP PLUGIN DEFINITION - * ========================= */ - - $.fn.tooltip = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tooltip') - , options = typeof option == 'object' && option - if (!data) $this.data('tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - $.fn.tooltip.defaults = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover' - , title: '' - , delay: 0 - } - -}(window.jQuery); -/* =========================================================== - * bootstrap-popover.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#popovers - * =========================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * =========================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* POPOVER PUBLIC CLASS DEFINITION - * =============================== */ - - var Popover = function ( element, options ) { - this.init('popover', element, options) - } - - - /* NOTE: POPOVER EXTENDS BOOTSTRAP-TOOLTIP.js - ========================================== */ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype, { - - constructor: Popover - - , setContent: function () { - var $tip = this.tip() - , title = this.getTitle() - , content = this.getContent() - - $tip.find('.popover-title')[this.isHTML(title) ? 'html' : 'text'](title) - $tip.find('.popover-content > *')[this.isHTML(content) ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - } - - , hasContent: function () { - return this.getTitle() || this.getContent() - } - - , getContent: function () { - var content - , $e = this.$element - , o = this.options - - content = $e.attr('data-content') - || (typeof o.content == 'function' ? o.content.call($e[0]) : o.content) - - return content - } - - , tip: function () { - if (!this.$tip) { - this.$tip = $(this.options.template) - } - return this.$tip - } - - }) - - - /* POPOVER PLUGIN DEFINITION - * ======================= */ - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('popover') - , options = typeof option == 'object' && option - if (!data) $this.data('popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - $.fn.popover.defaults = $.extend({} , $.fn.tooltip.defaults, { - placement: 'right' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>' - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-scrollspy.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#scrollspy - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* SCROLLSPY CLASS DEFINITION - * ========================== */ - - function ScrollSpy( element, options) { - var process = $.proxy(this.process, this) - , $element = $(element).is('body') ? $(window) : $(element) - , href - this.options = $.extend({}, $.fn.scrollspy.defaults, options) - this.$scrollElement = $element.on('scroll.scroll.data-api', process) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.$body = $('body') - this.refresh() - this.process() - } - - ScrollSpy.prototype = { - - constructor: ScrollSpy - - , refresh: function () { - var self = this - , $targets - - this.offsets = $([]) - this.targets = $([]) - - $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - , href = $el.data('target') || $el.attr('href') - , $href = /^#\w/.test(href) && $(href) - return ( $href - && href.length - && [[ $href.position().top, href ]] ) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - , process: function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - , maxScroll = scrollHeight - this.$scrollElement.height() - , offsets = this.offsets - , targets = this.targets - , activeTarget = this.activeTarget - , i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) - && this.activate ( i ) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - , activate: function (target) { - var active - , selector - - this.activeTarget = target - - $(this.selector) - .parent('.active') - .removeClass('active') - - selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - active = $(selector) - .parent('li') - .addClass('active') - - if (active.parent('.dropdown-menu')) { - active = active.closest('li.dropdown').addClass('active') - } - - active.trigger('activate') - } - - } - - - /* SCROLLSPY PLUGIN DEFINITION - * =========================== */ - - $.fn.scrollspy = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('scrollspy') - , options = typeof option == 'object' && option - if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - $.fn.scrollspy.defaults = { - offset: 10 - } - - - /* SCROLLSPY DATA-API - * ================== */ - - $(function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery);/* ======================================================== - * bootstrap-tab.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#tabs - * ======================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================== */ - - -!function ($) { - - "use strict"; // jshint ;_; - - - /* TAB CLASS DEFINITION - * ==================== */ - - var Tab = function ( element ) { - this.element = $(element) - } - - Tab.prototype = { - - constructor: Tab - - , show: function () { - var $this = this.element - , $ul = $this.closest('ul:not(.dropdown-menu)') - , selector = $this.attr('data-target') - , previous - , $target - , e - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ( $this.parent('li').hasClass('active') ) return - - previous = $ul.find('.active a').last()[0] - - e = $.Event('show', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown' - , relatedTarget: previous - }) - }) - } - - , activate: function ( element, container, callback) { - var $active = container.find('> .active') - , transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if ( element.parent('.dropdown-menu') ) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active.one($.support.transition.end, next) : - next() - - $active.removeClass('in') - } - } - - - /* TAB PLUGIN DEFINITION - * ===================== */ - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - , data = $this.data('tab') - if (!data) $this.data('tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - /* TAB DATA-API - * ============ */ - - $(function () { - $('body').on('click.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - }) - -}(window.jQuery);/* ============================================================= - * bootstrap-typeahead.js v2.0.4 - * http://twitter.github.com/bootstrap/javascript.html#typeahead - * ============================================================= - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ============================================================ */ - - -!function($){ - - "use strict"; // jshint ;_; - - - /* TYPEAHEAD PUBLIC CLASS DEFINITION - * ================================= */ - - var Typeahead = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, $.fn.typeahead.defaults, options) - this.matcher = this.options.matcher || this.matcher - this.sorter = this.options.sorter || this.sorter - this.highlighter = this.options.highlighter || this.highlighter - this.updater = this.options.updater || this.updater - this.$menu = $(this.options.menu).appendTo('body') - this.source = this.options.source - this.shown = false - this.listen() - } - - Typeahead.prototype = { - - constructor: Typeahead - - , select: function () { - var val = this.$menu.find('.active').attr('data-value') - this.$element - .val(this.updater(val)) - .change() - return this.hide() - } - - , updater: function (item) { - return item - } - - , show: function () { - var pos = $.extend({}, this.$element.offset(), { - height: this.$element[0].offsetHeight - }) - - this.$menu.css({ - top: pos.top + pos.height - , left: pos.left - }) - - this.$menu.show() - this.shown = true - return this - } - - , hide: function () { - this.$menu.hide() - this.shown = false - return this - } - - , lookup: function (event) { - var that = this - , items - , q - - this.query = this.$element.val() - - if (!this.query) { - return this.shown ? this.hide() : this - } - - items = $.grep(this.source, function (item) { - return that.matcher(item) - }) - - items = this.sorter(items) - - if (!items.length) { - return this.shown ? this.hide() : this - } - - return this.render(items.slice(0, this.options.items)).show() - } - - , matcher: function (item) { - return ~item.toLowerCase().indexOf(this.query.toLowerCase()) - } - - , sorter: function (items) { - var beginswith = [] - , caseSensitive = [] - , caseInsensitive = [] - , item - - while (item = items.shift()) { - if (!item.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item) - else if (~item.indexOf(this.query)) caseSensitive.push(item) - else caseInsensitive.push(item) - } - - return beginswith.concat(caseSensitive, caseInsensitive) - } - - , highlighter: function (item) { - var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&') - return item.replace(new RegExp('(' + query + ')', 'ig'), function ($1, match) { - return '<strong>' + match + '</strong>' - }) - } - - , render: function (items) { - var that = this - - items = $(items).map(function (i, item) { - i = $(that.options.item).attr('data-value', item) - i.find('a').html(that.highlighter(item)) - return i[0] - }) - - items.first().addClass('active') - this.$menu.html(items) - return this - } - - , next: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , next = active.next() - - if (!next.length) { - next = $(this.$menu.find('li')[0]) - } - - next.addClass('active') - } - - , prev: function (event) { - var active = this.$menu.find('.active').removeClass('active') - , prev = active.prev() - - if (!prev.length) { - prev = this.$menu.find('li').last() - } - - prev.addClass('active') - } - - , listen: function () { - this.$element - .on('blur', $.proxy(this.blur, this)) - .on('keypress', $.proxy(this.keypress, this)) - .on('keyup', $.proxy(this.keyup, this)) - - if ($.browser.webkit || $.browser.msie) { - this.$element.on('keydown', $.proxy(this.keypress, this)) - } - - this.$menu - .on('click', $.proxy(this.click, this)) - .on('mouseenter', 'li', $.proxy(this.mouseenter, this)) - } - - , keyup: function (e) { - switch(e.keyCode) { - case 40: // down arrow - case 38: // up arrow - break - - case 9: // tab - case 13: // enter - if (!this.shown) return - this.select() - break - - case 27: // escape - if (!this.shown) return - this.hide() - break - - default: - this.lookup() - } - - e.stopPropagation() - e.preventDefault() - } - - , keypress: function (e) { - if (!this.shown) return - - switch(e.keyCode) { - case 9: // tab - case 13: // enter - case 27: // escape - e.preventDefault() - break - - case 38: // up arrow - if (e.type != 'keydown') break - e.preventDefault() - this.prev() - break - - case 40: // down arrow - if (e.type != 'keydown') break - e.preventDefault() - this.next() - break - } - - e.stopPropagation() - } - - , blur: function (e) { - var that = this - setTimeout(function () { that.hide() }, 150) - } - - , click: function (e) { - e.stopPropagation() - e.preventDefault() - this.select() - } - - , mouseenter: function (e) { - this.$menu.find('.active').removeClass('active') - $(e.currentTarget).addClass('active') - } - - } - - - /* TYPEAHEAD PLUGIN DEFINITION - * =========================== */ - - $.fn.typeahead = function (option) { - return this.each(function () { - var $this = $(this) - , data = $this.data('typeahead') - , options = typeof option == 'object' && option - if (!data) $this.data('typeahead', (data = new Typeahead(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.typeahead.defaults = { - source: [] - , items: 8 - , menu: '<ul class="typeahead dropdown-menu"></ul>' - , item: '<li><a href="#"></a></li>' - } - - $.fn.typeahead.Constructor = Typeahead - - - /* TYPEAHEAD DATA-API - * ================== */ - - $(function () { - $('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function (e) { - var $this = $(this) - if ($this.data('typeahead')) return - e.preventDefault() - $this.typeahead($this.data()) - }) - }) - -}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js deleted file mode 100644 index d5ccdee2fe6..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* Bootstrap.js by @fat & @mdo -* Copyright 2012 Twitter, Inc. -* http://www.apache.org/licenses/LICENSE-2.0.txt -*/ -!function(a){a(function(){"use strict",a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",msTransition:"MSTransitionEnd",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function f(){e.trigger("closed").remove()}var c=a(this),d=c.attr("data-target"),e;d||(d=c.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),e=a(d),b&&b.preventDefault(),e.length||(e=c.hasClass("alert")?c:c.parent()),e.trigger(b=a.Event("close"));if(b.isDefaultPrevented())return;e.removeClass("in"),a.support.transition&&e.hasClass("fade")?e.on(a.support.transition.end,f):f()},a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("alert");e||d.data("alert",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.alert.Constructor=c,a(function(){a("body").on("click.alert.data-api",b,c.prototype.close)})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.data(),e=c.is("input")?"val":"html";a+="Text",d.resetText||c.data("resetText",c[e]()),c[e](d[a]||this.options[a]),setTimeout(function(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").on("click.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=c,this.options.slide&&this.slide(this.options.slide),this.options.pause=="hover"&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.prototype={cycle:function(b){return b||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},to:function(b){var c=this.$element.find(".active"),d=c.parent().children(),e=d.index(c),f=this;if(b>d.length-1||b<0)return;return this.sliding?this.$element.one("slid",function(){f.to(b)}):e==b?this.pause().cycle():this.slide(b>e?"next":"prev",a(d[b]))},pause:function(a){return a||(this.paused=!0),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(b,c){var d=this.$element.find(".active"),e=c||d[b](),f=this.interval,g=b=="next"?"left":"right",h=b=="next"?"first":"last",i=this,j=a.Event("slide");this.sliding=!0,f&&this.pause(),e=e.length?e:this.$element.find(".item")[h]();if(e.hasClass("active"))return;if(a.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(j);if(j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),this.$element.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)})}else{this.$element.trigger(j);if(j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}},a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("carousel"),f=a.extend({},a.fn.carousel.defaults,typeof c=="object"&&c);e||d.data("carousel",e=new b(this,f)),typeof c=="number"?e.to(c):typeof c=="string"||(c=f.slide)?e[c]():f.interval&&e.cycle()})},a.fn.carousel.defaults={interval:5e3,pause:"hover"},a.fn.carousel.Constructor=b,a(function(){a("body").on("click.carousel.data-api","[data-slide]",function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=!e.data("modal")&&a.extend({},e.data(),c.data());e.carousel(f),b.preventDefault()})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.collapse.defaults,c),this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.prototype={constructor:b,dimension:function(){var a=this.$element.hasClass("width");return a?"width":"height"},show:function(){var b,c,d,e;if(this.transitioning)return;b=this.dimension(),c=a.camelCase(["scroll",b].join("-")),d=this.$parent&&this.$parent.find("> .accordion-group > .in");if(d&&d.length){e=d.data("collapse");if(e&&e.transitioning)return;d.collapse("hide"),e||d.data("collapse",null)}this.$element[b](0),this.transition("addClass",a.Event("show"),"shown"),this.$element[b](this.$element[0][c])},hide:function(){var b;if(this.transitioning)return;b=this.dimension(),this.reset(this.$element[b]()),this.transition("removeClass",a.Event("hide"),"hidden"),this.$element[b](0)},reset:function(a){var b=this.dimension();return this.$element.removeClass("collapse")[b](a||"auto")[0].offsetWidth,this.$element[a!==null?"addClass":"removeClass"]("collapse"),this},transition:function(b,c,d){var e=this,f=function(){c.type=="show"&&e.reset(),e.transitioning=0,e.$element.trigger(d)};this.$element.trigger(c);if(c.isDefaultPrevented())return;this.transitioning=1,this.$element[b]("in"),a.support.transition&&this.$element.hasClass("collapse")?this.$element.one(a.support.transition.end,f):f()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}},a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("collapse"),f=typeof c=="object"&&c;e||d.data("collapse",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.collapse.defaults={toggle:!0},a.fn.collapse.Constructor=b,a(function(){a("body").on("click.collapse.data-api","[data-toggle=collapse]",function(b){var c=a(this),d,e=c.attr("data-target")||b.preventDefault()||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),f=a(e).data("collapse")?"toggle":c.data();a(e).collapse(f)})})}(window.jQuery),!function(a){function d(){a(b).parent().removeClass("open")}"use strict";var b='[data-toggle="dropdown"]',c=function(b){var c=a(b).on("click.dropdown.data-api",this.toggle);a("html").on("click.dropdown.data-api",function(){c.parent().removeClass("open")})};c.prototype={constructor:c,toggle:function(b){var c=a(this),e,f,g;if(c.is(".disabled, :disabled"))return;return f=c.attr("data-target"),f||(f=c.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,"")),e=a(f),e.length||(e=c.parent()),g=e.hasClass("open"),d(),g||e.toggleClass("open"),!1}},a.fn.dropdown=function(b){return this.each(function(){var d=a(this),e=d.data("dropdown");e||d.data("dropdown",e=new c(this)),typeof b=="string"&&e[b].call(d)})},a.fn.dropdown.Constructor=c,a(function(){a("html").on("click.dropdown.data-api",d),a("body").on("click.dropdown",".dropdown form",function(a){a.stopPropagation()}).on("click.dropdown.data-api",b,c.prototype.toggle)})}(window.jQuery),!function(a){function c(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),d.call(b)},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),d.call(b)})}function d(a){this.$element.hide().trigger("hidden"),e.call(this)}function e(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(document.body),this.options.backdrop!="static"&&this.$backdrop.click(a.proxy(this.hide,this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),e?this.$backdrop.one(a.support.transition.end,b):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,a.proxy(f,this)):f.call(this)):b&&b()}function f(){this.$backdrop.remove(),this.$backdrop=null}function g(){var b=this;this.isShown&&this.options.keyboard?a(document).on("keyup.dismiss.modal",function(a){a.which==27&&b.hide()}):this.isShown||a(document).off("keyup.dismiss.modal")}"use strict";var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this))};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;a("body").addClass("modal-open"),this.isShown=!0,g.call(this),e.call(this,function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in"),c?b.$element.one(a.support.transition.end,function(){b.$element.trigger("shown")}):b.$element.trigger("shown")})},hide:function(b){b&&b.preventDefault();var e=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,a("body").removeClass("modal-open"),g.call(this),this.$element.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?c.call(this):d.call(this)}},a.fn.modal=function(c){return this.each(function(){var d=a(this),e=d.data("modal"),f=a.extend({},a.fn.modal.defaults,d.data(),typeof c=="object"&&c);e||d.data("modal",e=new b(this,f)),typeof c=="string"?e[c]():f.show&&e.show()})},a.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},a.fn.modal.Constructor=b,a(function(){a("body").on("click.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d,e=a(c.attr("data-target")||(d=c.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({},e.data(),c.data());b.preventDefault(),e.modal(f)})})}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.remove().css({top:0,left:0,display:"block"}).appendTo(b?this.$element:document.body),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.css(g).addClass(f).addClass("in")}},isHTML:function(a){return typeof a!="string"||a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3||/^(?:[^<]*<[\w\W]+>[^>]*$)/.exec(a)},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.isHTML(b)?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).remove()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.remove()})}var b=this,c=this.tip();c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.remove()},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(){this[this.tip().hasClass("in")?"hide":"show"]()}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0}}(window.jQuery),!function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.isHTML(b)?"html":"text"](b),a.find(".popover-content > *")[this.isHTML(c)?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"><p></p></div></div></div>'})}(window.jQuery),!function(a){function b(b,c){var d=a.proxy(this.process,this),e=a(b).is("body")?a(window):a(b),f;this.options=a.extend({},a.fn.scrollspy.defaults,c),this.$scrollElement=e.on("scroll.scroll.data-api",d),this.selector=(this.options.target||(f=a(b).attr("href"))&&f.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=a("body"),this.refresh(),this.process()}"use strict",b.prototype={constructor:b,refresh:function(){var b=this,c;this.offsets=a([]),this.targets=a([]),c=this.$body.find(this.selector).map(function(){var b=a(this),c=b.data("target")||b.attr("href"),d=/^#\w/.test(c)&&a(c);return d&&c.length&&[[d.position().top,c]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},process:function(){var a=this.$scrollElement.scrollTop()+this.options.offset,b=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,c=b-this.$scrollElement.height(),d=this.offsets,e=this.targets,f=this.activeTarget,g;if(a>=c)return f!=(g=e.last()[0])&&this.activate(g);for(g=d.length;g--;)f!=e[g]&&a>=d[g]&&(!d[g+1]||a<=d[g+1])&&this.activate(e[g])},activate:function(b){var c,d;this.activeTarget=b,a(this.selector).parent(".active").removeClass("active"),d=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',c=a(d).parent("li").addClass("active"),c.parent(".dropdown-menu")&&(c=c.closest("li.dropdown").addClass("active")),c.trigger("activate")}},a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("scrollspy"),f=typeof c=="object"&&c;e||d.data("scrollspy",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.defaults={offset:10},a(function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),!function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype={constructor:b,show:function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target"),e,f,g;d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,""));if(b.parent("li").hasClass("active"))return;e=c.find(".active a").last()[0],g=a.Event("show",{relatedTarget:e}),b.trigger(g);if(g.isDefaultPrevented())return;f=a(d),this.activate(b.parent("li"),c),this.activate(f,f.parent(),function(){b.trigger({type:"shown",relatedTarget:e})})},activate:function(b,c,d){function g(){e.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),f?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var e=c.find("> .active"),f=d&&a.support.transition&&e.hasClass("fade");f?e.one(a.support.transition.end,g):g(),e.removeClass("in")}},a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("tab");e||d.data("tab",e=new b(this)),typeof c=="string"&&e[c]()})},a.fn.tab.Constructor=b,a(function(){a("body").on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})})}(window.jQuery),!function(a){"use strict";var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.typeahead.defaults,c),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.$menu=a(this.options.menu).appendTo("body"),this.source=this.options.source,this.shown=!1,this.listen()};b.prototype={constructor:b,select:function(){var a=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(a)).change(),this.hide()},updater:function(a){return a},show:function(){var b=a.extend({},this.$element.offset(),{height:this.$element[0].offsetHeight});return this.$menu.css({top:b.top+b.height,left:b.left}),this.$menu.show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){var c=this,d,e;return this.query=this.$element.val(),this.query?(d=a.grep(this.source,function(a){return c.matcher(a)}),d=this.sorter(d),d.length?this.render(d.slice(0,this.options.items)).show():this.shown?this.hide():this):this.shown?this.hide():this},matcher:function(a){return~a.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){var b=[],c=[],d=[],e;while(e=a.shift())e.toLowerCase().indexOf(this.query.toLowerCase())?~e.indexOf(this.query)?c.push(e):d.push(e):b.push(e);return b.concat(c,d)},highlighter:function(a){var b=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return a.replace(new RegExp("("+b+")","ig"),function(a,b){return"<strong>"+b+"</strong>"})},render:function(b){var c=this;return b=a(b).map(function(b,d){return b=a(c.options.item).attr("data-value",d),b.find("a").html(c.highlighter(d)),b[0]}),b.first().addClass("active"),this.$menu.html(b),this},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active")},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active")},listen:function(){this.$element.on("blur",a.proxy(this.blur,this)).on("keypress",a.proxy(this.keypress,this)).on("keyup",a.proxy(this.keyup,this)),(a.browser.webkit||a.browser.msie)&&this.$element.on("keydown",a.proxy(this.keypress,this)),this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this))},keyup:function(a){switch(a.keyCode){case 40:case 38:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}a.stopPropagation(),a.preventDefault()},keypress:function(a){if(!this.shown)return;switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:if(a.type!="keydown")break;a.preventDefault(),this.prev();break;case 40:if(a.type!="keydown")break;a.preventDefault(),this.next()}a.stopPropagation()},blur:function(a){var b=this;setTimeout(function(){b.hide()},150)},click:function(a){a.stopPropagation(),a.preventDefault(),this.select()},mouseenter:function(b){this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")}},a.fn.typeahead=function(c){return this.each(function(){var d=a(this),e=d.data("typeahead"),f=typeof c=="object"&&c;e||d.data("typeahead",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>'},a.fn.typeahead.Constructor=b,a(function(){a("body").on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);if(c.data("typeahead"))return;b.preventDefault(),c.typeahead(c.data())})})}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js deleted file mode 100644 index d24c2e4c83a..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.js +++ /dev/null @@ -1,4150 +0,0 @@ -(function(){if (!Date.now) Date.now = function() { - return +new Date; -}; -try { - document.createElement("div").style.setProperty("opacity", 0, ""); -} catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, - d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; -} -d3 = {version: "2.4.6"}; // semver -var d3_array = d3_arraySlice; // conversion for NodeLists - -function d3_arrayCopy(pseudoarray) { - var i = -1, n = pseudoarray.length, array = []; - while (++i < n) array.push(pseudoarray[i]); - return array; -} - -function d3_arraySlice(pseudoarray) { - return Array.prototype.slice.call(pseudoarray); -} - -try { - d3_array(document.documentElement.childNodes)[0].nodeType; -} catch(e) { - d3_array = d3_arrayCopy; -} - -var d3_arraySubclass = [].__proto__? - -// Until ECMAScript supports array subclassing, prototype injection works well. -function(array, prototype) { - array.__proto__ = prototype; -}: - -// And if your browser doesn't support __proto__, we'll use direct extension. -function(array, prototype) { - for (var property in prototype) array[property] = prototype[property]; -}; -function d3_this() { - return this; -} -d3.functor = function(v) { - return typeof v === "function" ? v : function() { return v; }; -}; -// A getter-setter method that preserves the appropriate `this` context. -d3.rebind = function(object, method) { - return function() { - var x = method.apply(object, arguments); - return arguments.length ? object : x; - }; -}; -d3.ascending = function(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -}; -d3.descending = function(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -}; -d3.mean = function(array, f) { - var n = array.length, - a, - m = 0, - i = -1, - j = 0; - if (arguments.length === 1) { - while (++i < n) if (d3_number(a = array[i])) m += (a - m) / ++j; - } else { - while (++i < n) if (d3_number(a = f.call(array, array[i], i))) m += (a - m) / ++j; - } - return j ? m : undefined; -}; -d3.median = function(array, f) { - if (arguments.length > 1) array = array.map(f); - array = array.filter(d3_number); - return array.length ? d3.quantile(array.sort(d3.ascending), .5) : undefined; -}; -d3.min = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && a > b) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b; - } - return a; -}; -d3.max = function(array, f) { - var i = -1, - n = array.length, - a, - b; - if (arguments.length === 1) { - while (++i < n && ((a = array[i]) == null || a != a)) a = undefined; - while (++i < n) if ((b = array[i]) != null && b > a) a = b; - } else { - while (++i < n && ((a = f.call(array, array[i], i)) == null || a != a)) a = undefined; - while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b; - } - return a; -}; -function d3_number(x) { - return x != null && !isNaN(x); -} -d3.sum = function(array, f) { - var s = 0, - n = array.length, - a, - i = -1; - - if (arguments.length === 1) { - while (++i < n) if (!isNaN(a = +array[i])) s += a; - } else { - while (++i < n) if (!isNaN(a = +f.call(array, array[i], i))) s += a; - } - - return s; -}; -// R-7 per <http://en.wikipedia.org/wiki/Quantile> -d3.quantile = function(values, p) { - var H = (values.length - 1) * p + 1, - h = Math.floor(H), - v = values[h - 1], - e = H - h; - return e ? v + e * (values[h] - v) : v; -}; -d3.zip = function() { - if (!(n = arguments.length)) return []; - for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m;) { - for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n;) { - zip[j] = arguments[j][i]; - } - } - return zips; -}; - -function d3_zipLength(d) { - return d.length; -} -// Locate the insertion point for x in a to maintain sorted order. The -// arguments lo and hi may be used to specify a subset of the array which should -// be considered; by default the entire array is used. If x is already present -// in a, the insertion point will be before (to the left of) any existing -// entries. The return value is suitable for use as the first argument to -// `array.splice` assuming that a is already sorted. -// -// The returned insertion point i partitions the array a into two halves so that -// all v < x for v in a[lo:i] for the left side and all v >= x for v in a[i:hi] -// for the right side. -d3.bisectLeft = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (a[mid] < x) lo = mid + 1; - else hi = mid; - } - return lo; -}; - -// Similar to bisectLeft, but returns an insertion point which comes after (to -// the right of) any existing entries of x in a. -// -// The returned insertion point i partitions the array into two halves so that -// all v <= x for v in a[lo:i] for the left side and all v > x for v in a[i:hi] -// for the right side. -d3.bisect = -d3.bisectRight = function(a, x, lo, hi) { - if (arguments.length < 3) lo = 0; - if (arguments.length < 4) hi = a.length; - while (lo < hi) { - var mid = (lo + hi) >> 1; - if (x < a[mid]) hi = mid; - else lo = mid + 1; - } - return lo; -}; -d3.first = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) > 0) { - a = b; - } - } - return a; -}; -d3.last = function(array, f) { - var i = 0, - n = array.length, - a = array[0], - b; - if (arguments.length === 1) f = d3.ascending; - while (++i < n) { - if (f.call(array, a, b = array[i]) <= 0) { - a = b; - } - } - return a; -}; -d3.nest = function() { - var nest = {}, - keys = [], - sortKeys = [], - sortValues, - rollup; - - function map(array, depth) { - if (depth >= keys.length) return rollup - ? rollup.call(nest, array) : (sortValues - ? array.sort(sortValues) - : array); - - var i = -1, - n = array.length, - key = keys[depth++], - keyValue, - object, - o = {}; - - while (++i < n) { - if ((keyValue = key(object = array[i])) in o) { - o[keyValue].push(object); - } else { - o[keyValue] = [object]; - } - } - - for (keyValue in o) { - o[keyValue] = map(o[keyValue], depth); - } - - return o; - } - - function entries(map, depth) { - if (depth >= keys.length) return map; - - var a = [], - sortKey = sortKeys[depth++], - key; - - for (key in map) { - a.push({key: key, values: entries(map[key], depth)}); - } - - if (sortKey) a.sort(function(a, b) { - return sortKey(a.key, b.key); - }); - - return a; - } - - nest.map = function(array) { - return map(array, 0); - }; - - nest.entries = function(array) { - return entries(map(array, 0), 0); - }; - - nest.key = function(d) { - keys.push(d); - return nest; - }; - - // Specifies the order for the most-recently specified key. - // Note: only applies to entries. Map keys are unordered! - nest.sortKeys = function(order) { - sortKeys[keys.length - 1] = order; - return nest; - }; - - // Specifies the order for leaf values. - // Applies to both maps and entries array. - nest.sortValues = function(order) { - sortValues = order; - return nest; - }; - - nest.rollup = function(f) { - rollup = f; - return nest; - }; - - return nest; -}; -d3.keys = function(map) { - var keys = []; - for (var key in map) keys.push(key); - return keys; -}; -d3.values = function(map) { - var values = []; - for (var key in map) values.push(map[key]); - return values; -}; -d3.entries = function(map) { - var entries = []; - for (var key in map) entries.push({key: key, value: map[key]}); - return entries; -}; -d3.permute = function(array, indexes) { - var permutes = [], - i = -1, - n = indexes.length; - while (++i < n) permutes[i] = array[indexes[i]]; - return permutes; -}; -d3.merge = function(arrays) { - return Array.prototype.concat.apply([], arrays); -}; -d3.split = function(array, f) { - var arrays = [], - values = [], - value, - i = -1, - n = array.length; - if (arguments.length < 2) f = d3_splitter; - while (++i < n) { - if (f.call(values, value = array[i], i)) { - values = []; - } else { - if (!values.length) arrays.push(values); - values.push(value); - } - } - return arrays; -}; - -function d3_splitter(d) { - return d == null; -} -function d3_collapse(s) { - return s.replace(/(^\s+)|(\s+$)/g, "").replace(/\s+/g, " "); -} -/** - * @param {number} start - * @param {number=} stop - * @param {number=} step - */ -d3.range = function(start, stop, step) { - if (arguments.length < 3) { - step = 1; - if (arguments.length < 2) { - stop = start; - start = 0; - } - } - if ((stop - start) / step == Infinity) throw new Error("infinite range"); - var range = [], - i = -1, - j; - if (step < 0) while ((j = start + step * ++i) > stop) range.push(j); - else while ((j = start + step * ++i) < stop) range.push(j); - return range; -}; -d3.requote = function(s) { - return s.replace(d3_requote_re, "\\$&"); -}; - -var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; -d3.round = function(x, n) { - return n - ? Math.round(x * Math.pow(10, n)) * Math.pow(10, -n) - : Math.round(x); -}; -d3.xhr = function(url, mime, callback) { - var req = new XMLHttpRequest; - if (arguments.length < 3) callback = mime; - else if (mime && req.overrideMimeType) req.overrideMimeType(mime); - req.open("GET", url, true); - req.onreadystatechange = function() { - if (req.readyState === 4) callback(req.status < 300 ? req : null); - }; - req.send(null); -}; -d3.text = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseText); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.json = function(url, callback) { - d3.text(url, "application/json", function(text) { - callback(text ? JSON.parse(text) : null); - }); -}; -d3.html = function(url, callback) { - d3.text(url, "text/html", function(text) { - if (text != null) { // Treat empty string as valid HTML. - var range = document.createRange(); - range.selectNode(document.body); - text = range.createContextualFragment(text); - } - callback(text); - }); -}; -d3.xml = function(url, mime, callback) { - function ready(req) { - callback(req && req.responseXML); - } - if (arguments.length < 3) { - callback = mime; - mime = null; - } - d3.xhr(url, mime, ready); -}; -d3.ns = { - - prefix: { - svg: "http://www.w3.org/2000/svg", - xhtml: "http://www.w3.org/1999/xhtml", - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - - qualify: function(name) { - var i = name.indexOf(":"); - return i < 0 ? name : { - space: d3.ns.prefix[name.substring(0, i)], - local: name.substring(i + 1) - }; - } - -}; -/** @param {...string} types */ -d3.dispatch = function(types) { - var dispatch = {}, - type; - for (var i = 0, n = arguments.length; i < n; i++) { - type = arguments[i]; - dispatch[type] = d3_dispatch(type); - } - return dispatch; -}; - -function d3_dispatch(type) { - var dispatch = {}, - listeners = []; - - dispatch.add = function(listener) { - for (var i = 0; i < listeners.length; i++) { - if (listeners[i].listener == listener) return dispatch; // already registered - } - listeners.push({listener: listener, on: true}); - return dispatch; - }; - - dispatch.remove = function(listener) { - for (var i = 0; i < listeners.length; i++) { - var l = listeners[i]; - if (l.listener == listener) { - l.on = false; - listeners = listeners.slice(0, i).concat(listeners.slice(i + 1)); - break; - } - } - return dispatch; - }; - - dispatch.dispatch = function() { - var ls = listeners; // defensive reference - for (var i = 0, n = ls.length; i < n; i++) { - var l = ls[i]; - if (l.on) l.listener.apply(this, arguments); - } - }; - - return dispatch; -}; -// TODO align -d3.format = function(specifier) { - var match = d3_format_re.exec(specifier), - fill = match[1] || " ", - sign = match[3] || "", - zfill = match[5], - width = +match[6], - comma = match[7], - precision = match[8], - type = match[9], - scale = 1, - suffix = "", - integer = false; - - if (precision) precision = +precision.substring(1); - - if (zfill) { - fill = "0"; // TODO align = "="; - if (comma) width -= Math.floor((width - 1) / 4); - } - - switch (type) { - case "n": comma = true; type = "g"; break; - case "%": scale = 100; suffix = "%"; type = "f"; break; - case "p": scale = 100; suffix = "%"; type = "r"; break; - case "d": integer = true; precision = 0; break; - case "s": scale = -1; type = "r"; break; - } - - // If no precision is specified for r, fallback to general notation. - if (type == "r" && !precision) type = "g"; - - type = d3_format_types[type] || d3_format_typeDefault; - - return function(value) { - - // Return the empty string for floats formatted as ints. - if (integer && (value % 1)) return ""; - - // Convert negative to positive, and record the sign prefix. - var negative = (value < 0) && (value = -value) ? "\u2212" : sign; - - // Apply the scale, computing it from the value's exponent for si format. - if (scale < 0) { - var prefix = d3.formatPrefix(value, precision); - value *= prefix.scale; - suffix = prefix.symbol; - } else { - value *= scale; - } - - // Convert to the desired precision. - value = type(value, precision); - - // If the fill character is 0, the sign and group is applied after the fill. - if (zfill) { - var length = value.length + negative.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - if (comma) value = d3_format_group(value); - value = negative + value; - } - - // Otherwise (e.g., space-filling), the sign and group is applied before. - else { - if (comma) value = d3_format_group(value); - value = negative + value; - var length = value.length; - if (length < width) value = new Array(width - length + 1).join(fill) + value; - } - - return value + suffix; - }; -}; - -// [[fill]align][sign][#][0][width][,][.precision][type] -var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/; - -var d3_format_types = { - g: function(x, p) { return x.toPrecision(p); }, - e: function(x, p) { return x.toExponential(p); }, - f: function(x, p) { return x.toFixed(p); }, - r: function(x, p) { return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); } -}; - -function d3_format_precision(x, p) { - return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1); -} - -function d3_format_typeDefault(x) { - return x + ""; -} - -// Apply comma grouping for thousands. -function d3_format_group(value) { - var i = value.lastIndexOf("."), - f = i >= 0 ? value.substring(i) : (i = value.length, ""), - t = []; - while (i > 0) t.push(value.substring(i -= 3, i + 3)); - return t.reverse().join(",") + f; -} -var d3_formatPrefixes = ["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(d3_formatPrefix); - -d3.formatPrefix = function(value, precision) { - var i = 0; - if (value) { - if (value < 0) value *= -1; - if (precision) value = d3.round(value, d3_format_precision(value, precision)); - i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10); - i = Math.max(-24, Math.min(24, Math.floor((i <= 0 ? i + 1 : i - 1) / 3) * 3)); - } - return d3_formatPrefixes[8 + i / 3]; -}; - -function d3_formatPrefix(d, i) { - return { - scale: Math.pow(10, (8 - i) * 3), - symbol: d - }; -} - -/* - * TERMS OF USE - EASING EQUATIONS - * - * Open source under the BSD License. - * - * Copyright 2001 Robert Penner - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * - Neither the name of the author nor the names of contributors may be used to - * endorse or promote products derived from this software without specific - * prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -var d3_ease_quad = d3_ease_poly(2), - d3_ease_cubic = d3_ease_poly(3); - -var d3_ease = { - linear: function() { return d3_ease_linear; }, - poly: d3_ease_poly, - quad: function() { return d3_ease_quad; }, - cubic: function() { return d3_ease_cubic; }, - sin: function() { return d3_ease_sin; }, - exp: function() { return d3_ease_exp; }, - circle: function() { return d3_ease_circle; }, - elastic: d3_ease_elastic, - back: d3_ease_back, - bounce: function() { return d3_ease_bounce; } -}; - -var d3_ease_mode = { - "in": function(f) { return f; }, - "out": d3_ease_reverse, - "in-out": d3_ease_reflect, - "out-in": function(f) { return d3_ease_reflect(d3_ease_reverse(f)); } -}; - -d3.ease = function(name) { - var i = name.indexOf("-"), - t = i >= 0 ? name.substring(0, i) : name, - m = i >= 0 ? name.substring(i + 1) : "in"; - return d3_ease_clamp(d3_ease_mode[m](d3_ease[t].apply(null, Array.prototype.slice.call(arguments, 1)))); -}; - -function d3_ease_clamp(f) { - return function(t) { - return t <= 0 ? 0 : t >= 1 ? 1 : f(t); - }; -} - -function d3_ease_reverse(f) { - return function(t) { - return 1 - f(1 - t); - }; -} - -function d3_ease_reflect(f) { - return function(t) { - return .5 * (t < .5 ? f(2 * t) : (2 - f(2 - 2 * t))); - }; -} - -function d3_ease_linear(t) { - return t; -} - -function d3_ease_poly(e) { - return function(t) { - return Math.pow(t, e); - } -} - -function d3_ease_sin(t) { - return 1 - Math.cos(t * Math.PI / 2); -} - -function d3_ease_exp(t) { - return Math.pow(2, 10 * (t - 1)); -} - -function d3_ease_circle(t) { - return 1 - Math.sqrt(1 - t * t); -} - -function d3_ease_elastic(a, p) { - var s; - if (arguments.length < 2) p = 0.45; - if (arguments.length < 1) { a = 1; s = p / 4; } - else s = p / (2 * Math.PI) * Math.asin(1 / a); - return function(t) { - return 1 + a * Math.pow(2, 10 * -t) * Math.sin((t - s) * 2 * Math.PI / p); - }; -} - -function d3_ease_back(s) { - if (!s) s = 1.70158; - return function(t) { - return t * t * ((s + 1) * t - s); - }; -} - -function d3_ease_bounce(t) { - return t < 1 / 2.75 ? 7.5625 * t * t - : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 - : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 - : 7.5625 * (t -= 2.625 / 2.75) * t + .984375; -} -d3.event = null; -d3.interpolate = function(a, b) { - var i = d3.interpolators.length, f; - while (--i >= 0 && !(f = d3.interpolators[i](a, b))); - return f; -}; - -d3.interpolateNumber = function(a, b) { - b -= a; - return function(t) { return a + b * t; }; -}; - -d3.interpolateRound = function(a, b) { - b -= a; - return function(t) { return Math.round(a + b * t); }; -}; - -d3.interpolateString = function(a, b) { - var m, // current match - i, // current index - j, // current index (for coallescing) - s0 = 0, // start index of current string prefix - s1 = 0, // end index of current string prefix - s = [], // string constants and placeholders - q = [], // number interpolators - n, // q.length - o; - - // Reset our regular expression! - d3_interpolate_number.lastIndex = 0; - - // Find all numbers in b. - for (i = 0; m = d3_interpolate_number.exec(b); ++i) { - if (m.index) s.push(b.substring(s0, s1 = m.index)); - q.push({i: s.length, x: m[0]}); - s.push(null); - s0 = d3_interpolate_number.lastIndex; - } - if (s0 < b.length) s.push(b.substring(s0)); - - // Find all numbers in a. - for (i = 0, n = q.length; (m = d3_interpolate_number.exec(a)) && i < n; ++i) { - o = q[i]; - if (o.x == m[0]) { // The numbers match, so coallesce. - if (o.i) { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i - 1] += o.x; - s.splice(o.i, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } else { // This match is followed by a string, so coallesce twice. - s[o.i - 1] += o.x + s[o.i + 1]; - s.splice(o.i, 2); - for (j = i + 1; j < n; ++j) q[j].i -= 2; - } - } else { - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - for (j = i + 1; j < n; ++j) q[j].i--; - } - } - q.splice(i, 1); - n--; - i--; - } else { - o.x = d3.interpolateNumber(parseFloat(m[0]), parseFloat(o.x)); - } - } - - // Remove any numbers in b not found in a. - while (i < n) { - o = q.pop(); - if (s[o.i + 1] == null) { // This match is followed by another number. - s[o.i] = o.x; - } else { // This match is followed by a string, so coallesce twice. - s[o.i] = o.x + s[o.i + 1]; - s.splice(o.i + 1, 1); - } - n--; - } - - // Special optimization for only a single match. - if (s.length === 1) { - return s[0] == null ? q[0].x : function() { return b; }; - } - - // Otherwise, interpolate each of the numbers and rejoin the string. - return function(t) { - for (i = 0; i < n; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; -}; - -d3.interpolateRgb = function(a, b) { - a = d3.rgb(a); - b = d3.rgb(b); - var ar = a.r, - ag = a.g, - ab = a.b, - br = b.r - ar, - bg = b.g - ag, - bb = b.b - ab; - return function(t) { - return "#" - + d3_rgb_hex(Math.round(ar + br * t)) - + d3_rgb_hex(Math.round(ag + bg * t)) - + d3_rgb_hex(Math.round(ab + bb * t)); - }; -}; - -// interpolates HSL space, but outputs RGB string (for compatibility) -d3.interpolateHsl = function(a, b) { - a = d3.hsl(a); - b = d3.hsl(b); - var h0 = a.h, - s0 = a.s, - l0 = a.l, - h1 = b.h - h0, - s1 = b.s - s0, - l1 = b.l - l0; - return function(t) { - return d3_hsl_rgb(h0 + h1 * t, s0 + s1 * t, l0 + l1 * t).toString(); - }; -}; - -d3.interpolateArray = function(a, b) { - var x = [], - c = [], - na = a.length, - nb = b.length, - n0 = Math.min(a.length, b.length), - i; - for (i = 0; i < n0; ++i) x.push(d3.interpolate(a[i], b[i])); - for (; i < na; ++i) c[i] = a[i]; - for (; i < nb; ++i) c[i] = b[i]; - return function(t) { - for (i = 0; i < n0; ++i) c[i] = x[i](t); - return c; - }; -}; - -d3.interpolateObject = function(a, b) { - var i = {}, - c = {}, - k; - for (k in a) { - if (k in b) { - i[k] = d3_interpolateByName(k)(a[k], b[k]); - } else { - c[k] = a[k]; - } - } - for (k in b) { - if (!(k in a)) { - c[k] = b[k]; - } - } - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; -} - -var d3_interpolate_number = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, - d3_interpolate_rgb = {background: 1, fill: 1, stroke: 1}; - -function d3_interpolateByName(n) { - return n in d3_interpolate_rgb || /\bcolor\b/.test(n) - ? d3.interpolateRgb - : d3.interpolate; -} - -d3.interpolators = [ - d3.interpolateObject, - function(a, b) { return (b instanceof Array) && d3.interpolateArray(a, b); }, - function(a, b) { return (typeof b === "string") && d3.interpolateString(String(a), b); }, - function(a, b) { return (typeof b === "string" ? b in d3_rgb_names || /^(#|rgb\(|hsl\()/.test(b) : b instanceof d3_Rgb || b instanceof d3_Hsl) && d3.interpolateRgb(String(a), b); }, - function(a, b) { return (typeof b === "number") && d3.interpolateNumber(+a, b); } -]; -function d3_uninterpolateNumber(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return (x - a) * b; }; -} - -function d3_uninterpolateClamp(a, b) { - b = b - (a = +a) ? 1 / (b - a) : 0; - return function(x) { return Math.max(0, Math.min(1, (x - a) * b)); }; -} -d3.rgb = function(r, g, b) { - return arguments.length === 1 - ? (r instanceof d3_Rgb ? d3_rgb(r.r, r.g, r.b) - : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb)) - : d3_rgb(~~r, ~~g, ~~b); -}; - -function d3_rgb(r, g, b) { - return new d3_Rgb(r, g, b); -} - -function d3_Rgb(r, g, b) { - this.r = r; - this.g = g; - this.b = b; -} - -d3_Rgb.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - var r = this.r, - g = this.g, - b = this.b, - i = 30; - if (!r && !g && !b) return d3_rgb(i, i, i); - if (r && r < i) r = i; - if (g && g < i) g = i; - if (b && b < i) b = i; - return d3_rgb( - Math.min(255, Math.floor(r / k)), - Math.min(255, Math.floor(g / k)), - Math.min(255, Math.floor(b / k))); -}; - -d3_Rgb.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_rgb( - Math.floor(k * this.r), - Math.floor(k * this.g), - Math.floor(k * this.b)); -}; - -d3_Rgb.prototype.hsl = function() { - return d3_rgb_hsl(this.r, this.g, this.b); -}; - -d3_Rgb.prototype.toString = function() { - return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b); -}; - -function d3_rgb_hex(v) { - return v < 0x10 - ? "0" + Math.max(0, v).toString(16) - : Math.min(255, v).toString(16); -} - -function d3_rgb_parse(format, rgb, hsl) { - var r = 0, // red channel; int in [0, 255] - g = 0, // green channel; int in [0, 255] - b = 0, // blue channel; int in [0, 255] - m1, // CSS color specification match - m2, // CSS color specification type (e.g., rgb) - name; - - /* Handle hsl, rgb. */ - m1 = /([a-z]+)\((.*)\)/i.exec(format); - if (m1) { - m2 = m1[2].split(","); - switch (m1[1]) { - case "hsl": { - return hsl( - parseFloat(m2[0]), // degrees - parseFloat(m2[1]) / 100, // percentage - parseFloat(m2[2]) / 100 // percentage - ); - } - case "rgb": { - return rgb( - d3_rgb_parseNumber(m2[0]), - d3_rgb_parseNumber(m2[1]), - d3_rgb_parseNumber(m2[2]) - ); - } - } - } - - /* Named colors. */ - if (name = d3_rgb_names[format]) return rgb(name.r, name.g, name.b); - - /* Hexadecimal colors: #rgb and #rrggbb. */ - if (format != null && format.charAt(0) === "#") { - if (format.length === 4) { - r = format.charAt(1); r += r; - g = format.charAt(2); g += g; - b = format.charAt(3); b += b; - } else if (format.length === 7) { - r = format.substring(1, 3); - g = format.substring(3, 5); - b = format.substring(5, 7); - } - r = parseInt(r, 16); - g = parseInt(g, 16); - b = parseInt(b, 16); - } - - return rgb(r, g, b); -} - -function d3_rgb_hsl(r, g, b) { - var min = Math.min(r /= 255, g /= 255, b /= 255), - max = Math.max(r, g, b), - d = max - min, - h, - s, - l = (max + min) / 2; - if (d) { - s = l < .5 ? d / (max + min) : d / (2 - max - min); - if (r == max) h = (g - b) / d + (g < b ? 6 : 0); - else if (g == max) h = (b - r) / d + 2; - else h = (r - g) / d + 4; - h *= 60; - } else { - s = h = 0; - } - return d3_hsl(h, s, l); -} - -function d3_rgb_parseNumber(c) { // either integer or percentage - var f = parseFloat(c); - return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f; -} - -var d3_rgb_names = { - aliceblue: "#f0f8ff", - antiquewhite: "#faebd7", - aqua: "#00ffff", - aquamarine: "#7fffd4", - azure: "#f0ffff", - beige: "#f5f5dc", - bisque: "#ffe4c4", - black: "#000000", - blanchedalmond: "#ffebcd", - blue: "#0000ff", - blueviolet: "#8a2be2", - brown: "#a52a2a", - burlywood: "#deb887", - cadetblue: "#5f9ea0", - chartreuse: "#7fff00", - chocolate: "#d2691e", - coral: "#ff7f50", - cornflowerblue: "#6495ed", - cornsilk: "#fff8dc", - crimson: "#dc143c", - cyan: "#00ffff", - darkblue: "#00008b", - darkcyan: "#008b8b", - darkgoldenrod: "#b8860b", - darkgray: "#a9a9a9", - darkgreen: "#006400", - darkgrey: "#a9a9a9", - darkkhaki: "#bdb76b", - darkmagenta: "#8b008b", - darkolivegreen: "#556b2f", - darkorange: "#ff8c00", - darkorchid: "#9932cc", - darkred: "#8b0000", - darksalmon: "#e9967a", - darkseagreen: "#8fbc8f", - darkslateblue: "#483d8b", - darkslategray: "#2f4f4f", - darkslategrey: "#2f4f4f", - darkturquoise: "#00ced1", - darkviolet: "#9400d3", - deeppink: "#ff1493", - deepskyblue: "#00bfff", - dimgray: "#696969", - dimgrey: "#696969", - dodgerblue: "#1e90ff", - firebrick: "#b22222", - floralwhite: "#fffaf0", - forestgreen: "#228b22", - fuchsia: "#ff00ff", - gainsboro: "#dcdcdc", - ghostwhite: "#f8f8ff", - gold: "#ffd700", - goldenrod: "#daa520", - gray: "#808080", - green: "#008000", - greenyellow: "#adff2f", - grey: "#808080", - honeydew: "#f0fff0", - hotpink: "#ff69b4", - indianred: "#cd5c5c", - indigo: "#4b0082", - ivory: "#fffff0", - khaki: "#f0e68c", - lavender: "#e6e6fa", - lavenderblush: "#fff0f5", - lawngreen: "#7cfc00", - lemonchiffon: "#fffacd", - lightblue: "#add8e6", - lightcoral: "#f08080", - lightcyan: "#e0ffff", - lightgoldenrodyellow: "#fafad2", - lightgray: "#d3d3d3", - lightgreen: "#90ee90", - lightgrey: "#d3d3d3", - lightpink: "#ffb6c1", - lightsalmon: "#ffa07a", - lightseagreen: "#20b2aa", - lightskyblue: "#87cefa", - lightslategray: "#778899", - lightslategrey: "#778899", - lightsteelblue: "#b0c4de", - lightyellow: "#ffffe0", - lime: "#00ff00", - limegreen: "#32cd32", - linen: "#faf0e6", - magenta: "#ff00ff", - maroon: "#800000", - mediumaquamarine: "#66cdaa", - mediumblue: "#0000cd", - mediumorchid: "#ba55d3", - mediumpurple: "#9370db", - mediumseagreen: "#3cb371", - mediumslateblue: "#7b68ee", - mediumspringgreen: "#00fa9a", - mediumturquoise: "#48d1cc", - mediumvioletred: "#c71585", - midnightblue: "#191970", - mintcream: "#f5fffa", - mistyrose: "#ffe4e1", - moccasin: "#ffe4b5", - navajowhite: "#ffdead", - navy: "#000080", - oldlace: "#fdf5e6", - olive: "#808000", - olivedrab: "#6b8e23", - orange: "#ffa500", - orangered: "#ff4500", - orchid: "#da70d6", - palegoldenrod: "#eee8aa", - palegreen: "#98fb98", - paleturquoise: "#afeeee", - palevioletred: "#db7093", - papayawhip: "#ffefd5", - peachpuff: "#ffdab9", - peru: "#cd853f", - pink: "#ffc0cb", - plum: "#dda0dd", - powderblue: "#b0e0e6", - purple: "#800080", - red: "#ff0000", - rosybrown: "#bc8f8f", - royalblue: "#4169e1", - saddlebrown: "#8b4513", - salmon: "#fa8072", - sandybrown: "#f4a460", - seagreen: "#2e8b57", - seashell: "#fff5ee", - sienna: "#a0522d", - silver: "#c0c0c0", - skyblue: "#87ceeb", - slateblue: "#6a5acd", - slategray: "#708090", - slategrey: "#708090", - snow: "#fffafa", - springgreen: "#00ff7f", - steelblue: "#4682b4", - tan: "#d2b48c", - teal: "#008080", - thistle: "#d8bfd8", - tomato: "#ff6347", - turquoise: "#40e0d0", - violet: "#ee82ee", - wheat: "#f5deb3", - white: "#ffffff", - whitesmoke: "#f5f5f5", - yellow: "#ffff00", - yellowgreen: "#9acd32" -}; - -for (var d3_rgb_name in d3_rgb_names) { - d3_rgb_names[d3_rgb_name] = d3_rgb_parse( - d3_rgb_names[d3_rgb_name], - d3_rgb, - d3_hsl_rgb); -} -d3.hsl = function(h, s, l) { - return arguments.length === 1 - ? (h instanceof d3_Hsl ? d3_hsl(h.h, h.s, h.l) - : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl)) - : d3_hsl(+h, +s, +l); -}; - -function d3_hsl(h, s, l) { - return new d3_Hsl(h, s, l); -} - -function d3_Hsl(h, s, l) { - this.h = h; - this.s = s; - this.l = l; -} - -d3_Hsl.prototype.brighter = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, this.l / k); -}; - -d3_Hsl.prototype.darker = function(k) { - k = Math.pow(0.7, arguments.length ? k : 1); - return d3_hsl(this.h, this.s, k * this.l); -}; - -d3_Hsl.prototype.rgb = function() { - return d3_hsl_rgb(this.h, this.s, this.l); -}; - -d3_Hsl.prototype.toString = function() { - return this.rgb().toString(); -}; - -function d3_hsl_rgb(h, s, l) { - var m1, - m2; - - /* Some simple corrections for h, s and l. */ - h = h % 360; if (h < 0) h += 360; - s = s < 0 ? 0 : s > 1 ? 1 : s; - l = l < 0 ? 0 : l > 1 ? 1 : l; - - /* From FvD 13.37, CSS Color Module Level 3 */ - m2 = l <= .5 ? l * (1 + s) : l + s - l * s; - m1 = 2 * l - m2; - - function v(h) { - if (h > 360) h -= 360; - else if (h < 0) h += 360; - if (h < 60) return m1 + (m2 - m1) * h / 60; - if (h < 180) return m2; - if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60; - return m1; - } - - function vv(h) { - return Math.round(v(h) * 255); - } - - return d3_rgb(vv(h + 120), vv(h), vv(h - 120)); -} -function d3_selection(groups) { - d3_arraySubclass(groups, d3_selectionPrototype); - return groups; -} - -var d3_select = function(s, n) { return n.querySelector(s); }, - d3_selectAll = function(s, n) { return n.querySelectorAll(s); }; - -// Prefer Sizzle, if available. -if (typeof Sizzle === "function") { - d3_select = function(s, n) { return Sizzle(s, n)[0]; }; - d3_selectAll = function(s, n) { return Sizzle.uniqueSort(Sizzle(s, n)); }; -} - -var d3_selectionPrototype = []; - -d3.selection = function() { - return d3_selectionRoot; -}; - -d3.selection.prototype = d3_selectionPrototype; -d3_selectionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - group, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(subnode = selector.call(node, node.__data__, i)); - if (subnode && "__data__" in node) subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selector(selector) { - return function() { - return d3_select(selector, this); - }; -} -d3_selectionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i))); - subgroup.parentNode = node; - } - } - } - - return d3_selection(subgroups); -}; - -function d3_selection_selectorAll(selector) { - return function() { - return d3_selectAll(selector, this); - }; -} -d3_selectionPrototype.attr = function(name, value) { - name = d3.ns.qualify(name); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - return name.local - ? node.getAttributeNS(name.space, name.local) - : node.getAttribute(name); - } - - function attrNull() { - this.removeAttribute(name); - } - - function attrNullNS() { - this.removeAttributeNS(name.space, name.local); - } - - function attrConstant() { - this.setAttribute(name, value); - } - - function attrConstantNS() { - this.setAttributeNS(name.space, name.local, value); - } - - function attrFunction() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttribute(name); - else this.setAttribute(name, x); - } - - function attrFunctionNS() { - var x = value.apply(this, arguments); - if (x == null) this.removeAttributeNS(name.space, name.local); - else this.setAttributeNS(name.space, name.local, x); - } - - return this.each(value == null - ? (name.local ? attrNullNS : attrNull) : (typeof value === "function" - ? (name.local ? attrFunctionNS : attrFunction) - : (name.local ? attrConstantNS : attrConstant))); -}; -d3_selectionPrototype.classed = function(name, value) { - var names = name.split(d3_selection_classedWhitespace), - n = names.length, - i = -1; - if (arguments.length > 1) { - while (++i < n) d3_selection_classed.call(this, names[i], value); - return this; - } else { - while (++i < n) if (!d3_selection_classed.call(this, names[i])) return false; - return true; - } -}; - -var d3_selection_classedWhitespace = /\s+/g; - -function d3_selection_classed(name, value) { - var re = new RegExp("(^|\\s+)" + d3.requote(name) + "(\\s+|$)", "g"); - - // If no value is specified, return the first value. - if (arguments.length < 2) { - var node = this.node(); - if (c = node.classList) return c.contains(name); - var c = node.className; - re.lastIndex = 0; - return re.test(c.baseVal != null ? c.baseVal : c); - } - - function classedAdd() { - if (c = this.classList) return c.add(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - re.lastIndex = 0; - if (!re.test(cv)) { - cv = d3_collapse(cv + " " + name); - if (cb) c.baseVal = cv; - else this.className = cv; - } - } - - function classedRemove() { - if (c = this.classList) return c.remove(name); - var c = this.className, - cb = c.baseVal != null, - cv = cb ? c.baseVal : c; - cv = d3_collapse(cv.replace(re, " ")); - if (cb) c.baseVal = cv; - else this.className = cv; - } - - function classedFunction() { - (value.apply(this, arguments) - ? classedAdd - : classedRemove).call(this); - } - - return this.each(typeof value === "function" - ? classedFunction : value - ? classedAdd - : classedRemove); -} -d3_selectionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - - // If no value is specified, return the first value. - if (arguments.length < 2) return window - .getComputedStyle(this.node(), null) - .getPropertyValue(name); - - function styleNull() { - this.style.removeProperty(name); - } - - function styleConstant() { - this.style.setProperty(name, value, priority); - } - - function styleFunction() { - var x = value.apply(this, arguments); - if (x == null) this.style.removeProperty(name); - else this.style.setProperty(name, x, priority); - } - - return this.each(value == null - ? styleNull : (typeof value === "function" - ? styleFunction : styleConstant)); -}; -d3_selectionPrototype.property = function(name, value) { - - // If no value is specified, return the first value. - if (arguments.length < 2) return this.node()[name]; - - function propertyNull() { - delete this[name]; - } - - function propertyConstant() { - this[name] = value; - } - - function propertyFunction() { - var x = value.apply(this, arguments); - if (x == null) delete this[name]; - else this[name] = x; - } - - return this.each(value == null - ? propertyNull : (typeof value === "function" - ? propertyFunction : propertyConstant)); -}; -d3_selectionPrototype.text = function(value) { - return arguments.length < 1 ? this.node().textContent - : (this.each(typeof value === "function" - ? function() { this.textContent = value.apply(this, arguments); } - : function() { this.textContent = value; })); -}; -d3_selectionPrototype.html = function(value) { - return arguments.length < 1 ? this.node().innerHTML - : (this.each(typeof value === "function" - ? function() { this.innerHTML = value.apply(this, arguments); } - : function() { this.innerHTML = value; })); -}; -// TODO append(node)? -// TODO append(function)? -d3_selectionPrototype.append = function(name) { - name = d3.ns.qualify(name); - - function append() { - return this.appendChild(document.createElement(name)); - } - - function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); - } - - return this.select(name.local ? appendNS : append); -}; -// TODO insert(node, function)? -// TODO insert(function, string)? -// TODO insert(function, function)? -d3_selectionPrototype.insert = function(name, before) { - name = d3.ns.qualify(name); - - function insert() { - return this.insertBefore( - document.createElement(name), - d3_select(before, this)); - } - - function insertNS() { - return this.insertBefore( - document.createElementNS(name.space, name.local), - d3_select(before, this)); - } - - return this.select(name.local ? insertNS : insert); -}; -// TODO remove(selector)? -// TODO remove(node)? -// TODO remove(function)? -d3_selectionPrototype.remove = function() { - return this.each(function() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); - }); -}; -// TODO data(null) for clearing data? -d3_selectionPrototype.data = function(data, join) { - var enter = [], - update = [], - exit = []; - - function bind(group, groupData) { - var i, - n = group.length, - m = groupData.length, - n0 = Math.min(n, m), - n1 = Math.max(n, m), - updateNodes = [], - enterNodes = [], - exitNodes = [], - node, - nodeData; - - if (join) { - var nodeByKey = {}, - keys = [], - key, - j = groupData.length; - - for (i = -1; ++i < n;) { - key = join.call(node = group[i], node.__data__, i); - if (key in nodeByKey) { - exitNodes[j++] = node; // duplicate key - } else { - nodeByKey[key] = node; - } - keys.push(key); - } - - for (i = -1; ++i < m;) { - node = nodeByKey[key = join.call(groupData, nodeData = groupData[i], i)]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - delete nodeByKey[key]; - } - - for (i = -1; ++i < n;) { - if (keys[i] in nodeByKey) { - exitNodes[i] = group[i]; - } - } - } else { - for (i = -1; ++i < n0;) { - node = group[i]; - nodeData = groupData[i]; - if (node) { - node.__data__ = nodeData; - updateNodes[i] = node; - enterNodes[i] = exitNodes[i] = null; - } else { - enterNodes[i] = d3_selection_dataNode(nodeData); - updateNodes[i] = exitNodes[i] = null; - } - } - for (; i < m; ++i) { - enterNodes[i] = d3_selection_dataNode(groupData[i]); - updateNodes[i] = exitNodes[i] = null; - } - for (; i < n1; ++i) { - exitNodes[i] = group[i]; - enterNodes[i] = updateNodes[i] = null; - } - } - - enterNodes.update - = updateNodes; - - enterNodes.parentNode - = updateNodes.parentNode - = exitNodes.parentNode - = group.parentNode; - - enter.push(enterNodes); - update.push(updateNodes); - exit.push(exitNodes); - } - - var i = -1, - n = this.length, - group; - if (typeof data === "function") { - while (++i < n) { - bind(group = this[i], data.call(group, group.parentNode.__data__, i)); - } - } else { - while (++i < n) { - bind(group = this[i], data); - } - } - - var selection = d3_selection(update); - selection.enter = function() { return d3_selection_enter(enter); }; - selection.exit = function() { return d3_selection(exit); }; - return selection; -}; - -function d3_selection_dataNode(data) { - return {__data__: data}; -} -// TODO preserve null elements to maintain index? -d3_selectionPrototype.filter = function(filter) { - var subgroups = [], - subgroup, - group, - node; - - for (var j = 0, m = this.length; j < m; j++) { - subgroups.push(subgroup = []); - subgroup.parentNode = (group = this[j]).parentNode; - for (var i = 0, n = group.length; i < n; i++) { - if ((node = group[i]) && filter.call(node, node.__data__, i)) { - subgroup.push(node); - } - } - } - - return d3_selection(subgroups); -}; -d3_selectionPrototype.map = function(map) { - return this.each(function() { - this.__data__ = map.apply(this, arguments); - }); -}; -d3_selectionPrototype.sort = function(comparator) { - comparator = d3_selection_sortComparator.apply(this, arguments); - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j].sort(comparator), i = 1, n = group.length, prev = group[0]; i < n; i++) { - var node = group[i]; - if (node) { - if (prev) prev.parentNode.insertBefore(node, prev.nextSibling); - prev = node; - } - } - } - return this; -}; - -function d3_selection_sortComparator(comparator) { - if (!arguments.length) comparator = d3.ascending; - return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); - }; -} -// type can be namespaced, e.g., "click.foo" -// listener can be null for removal -d3_selectionPrototype.on = function(type, listener, capture) { - if (arguments.length < 3) capture = false; - - // parse the type specifier - var name = "__on" + type, i = type.indexOf("."); - if (i > 0) type = type.substring(0, i); - - // if called with only one argument, return the current listener - if (arguments.length < 2) return (i = this.node()[name]) && i._; - - // remove the old event listener, and add the new event listener - return this.each(function(d, i) { - var node = this; - - if (node[name]) node.removeEventListener(type, node[name], capture); - if (listener) node.addEventListener(type, node[name] = l, capture); - - // wrapped event listener that preserves i - function l(e) { - var o = d3.event; // Events can be reentrant (e.g., focus). - d3.event = e; - try { - listener.call(node, node.__data__, i); - } finally { - d3.event = o; - } - } - - // stash the unwrapped listener for retrieval - l._ = listener; - }); -}; -d3_selectionPrototype.each = function(callback) { - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - var node = group[i]; - if (node) callback.call(node, node.__data__, i, j); - } - } - return this; -}; -// -// Note: assigning to the arguments array simultaneously changes the value of -// the corresponding argument! -// -// TODO The `this` argument probably shouldn't be the first argument to the -// callback, anyway, since it's redundant. However, that will require a major -// version bump due to backwards compatibility, so I'm not changing it right -// away. -// -d3_selectionPrototype.call = function(callback) { - callback.apply(this, (arguments[0] = this, arguments)); - return this; -}; -d3_selectionPrototype.empty = function() { - return !this.node(); -}; -d3_selectionPrototype.node = function(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) return node; - } - } - return null; -}; -d3_selectionPrototype.transition = function() { - var subgroups = [], - subgroup, - node; - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - subgroup.push((node = group[i]) ? {node: node, delay: 0, duration: 250} : null); - } - } - - return d3_transition(subgroups, d3_transitionInheritId || ++d3_transitionId, Date.now()); -}; -var d3_selectionRoot = d3_selection([[document]]); - -d3_selectionRoot[0].parentNode = document.documentElement; - -// TODO fast singleton implementation! -// TODO select(function) -d3.select = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.select(selector) - : d3_selection([[selector]]); // assume node -}; - -// TODO selectAll(function) -d3.selectAll = function(selector) { - return typeof selector === "string" - ? d3_selectionRoot.selectAll(selector) - : d3_selection([d3_array(selector)]); // assume node[] -}; -function d3_selection_enter(selection) { - d3_arraySubclass(selection, d3_selection_enterPrototype); - return selection; -} - -var d3_selection_enterPrototype = []; - -d3_selection_enterPrototype.append = d3_selectionPrototype.append; -d3_selection_enterPrototype.insert = d3_selectionPrototype.insert; -d3_selection_enterPrototype.empty = d3_selectionPrototype.empty; -d3_selection_enterPrototype.node = d3_selectionPrototype.node; -d3_selection_enterPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - upgroup, - group, - node; - - for (var j = -1, m = this.length; ++j < m;) { - upgroup = (group = this[j]).update; - subgroups.push(subgroup = []); - subgroup.parentNode = group.parentNode; - for (var i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i)); - subnode.__data__ = node.__data__; - } else { - subgroup.push(null); - } - } - } - - return d3_selection(subgroups); -}; -function d3_transition(groups, id, time) { - d3_arraySubclass(groups, d3_transitionPrototype); - - var tweens = {}, - event = d3.dispatch("start", "end"), - ease = d3_transitionEase; - - groups.id = id; - - groups.time = time; - - groups.tween = function(name, tween) { - if (arguments.length < 2) return tweens[name]; - if (tween == null) delete tweens[name]; - else tweens[name] = tween; - return groups; - }; - - groups.ease = function(value) { - if (!arguments.length) return ease; - ease = typeof value === "function" ? value : d3.ease.apply(d3, arguments); - return groups; - }; - - groups.each = function(type, listener) { - if (arguments.length < 2) return d3_transition_each.call(groups, type); - event[type].add(listener); - return groups; - }; - - d3.timer(function(elapsed) { - groups.each(function(d, i, j) { - var tweened = [], - node = this, - delay = groups[j][i].delay, - duration = groups[j][i].duration, - lock = node.__transition__ || (node.__transition__ = {active: 0, count: 0}); - - ++lock.count; - - delay <= elapsed ? start(elapsed) : d3.timer(start, delay, time); - - function start(elapsed) { - if (lock.active > id) return stop(); - lock.active = id; - - for (var tween in tweens) { - if (tween = tweens[tween].call(node, d, i)) { - tweened.push(tween); - } - } - - event.start.dispatch.call(node, d, i); - if (!tick(elapsed)) d3.timer(tick, 0, time); - return 1; - } - - function tick(elapsed) { - if (lock.active !== id) return stop(); - - var t = (elapsed - delay) / duration, - e = ease(t), - n = tweened.length; - - while (n > 0) { - tweened[--n].call(node, e); - } - - if (t >= 1) { - stop(); - d3_transitionInheritId = id; - event.end.dispatch.call(node, d, i); - d3_transitionInheritId = 0; - return 1; - } - } - - function stop() { - if (!--lock.count) delete node.__transition__; - return 1; - } - }); - return 1; - }, 0, time); - - return groups; -} - -var d3_transitionRemove = {}; - -function d3_transitionNull(d, i, a) { - return a != "" && d3_transitionRemove; -} - -function d3_transitionTween(b) { - - function transitionFunction(d, i, a) { - var v = b.call(this, d, i); - return v == null - ? a != "" && d3_transitionRemove - : a != v && d3.interpolate(a, v); - } - - function transitionString(d, i, a) { - return a != b && d3.interpolate(a, b); - } - - return typeof b === "function" ? transitionFunction - : b == null ? d3_transitionNull - : (b += "", transitionString); -} - -var d3_transitionPrototype = [], - d3_transitionId = 0, - d3_transitionInheritId = 0, - d3_transitionEase = d3.ease("cubic-in-out"); - -d3_transitionPrototype.call = d3_selectionPrototype.call; - -d3.transition = function() { - return d3_selectionRoot.transition(); -}; - -d3.transition.prototype = d3_transitionPrototype; -d3_transitionPrototype.select = function(selector) { - var subgroups = [], - subgroup, - subnode, - node; - - if (typeof selector !== "function") selector = d3_selection_selector(selector); - - for (var j = -1, m = this.length; ++j < m;) { - subgroups.push(subgroup = []); - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if ((node = group[i]) && (subnode = selector.call(node.node, node.node.__data__, i))) { - if ("__data__" in node.node) subnode.__data__ = node.node.__data__; - subgroup.push({node: subnode, delay: node.delay, duration: node.duration}); - } else { - subgroup.push(null); - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.selectAll = function(selector) { - var subgroups = [], - subgroup, - subnodes, - node; - - if (typeof selector !== "function") selector = d3_selection_selectorAll(selector); - - for (var j = -1, m = this.length; ++j < m;) { - for (var group = this[j], i = -1, n = group.length; ++i < n;) { - if (node = group[i]) { - subnodes = selector.call(node.node, node.node.__data__, i); - subgroups.push(subgroup = []); - for (var k = -1, o = subnodes.length; ++k < o;) { - subgroup.push({node: subnodes[k], delay: node.delay, duration: node.duration}); - } - } - } - } - - return d3_transition(subgroups, this.id, this.time).ease(this.ease()); -}; -d3_transitionPrototype.attr = function(name, value) { - return this.attrTween(name, d3_transitionTween(value)); -}; - -d3_transitionPrototype.attrTween = function(nameNS, tween) { - var name = d3.ns.qualify(nameNS); - - function attrTween(d, i) { - var f = tween.call(this, d, i, this.getAttribute(name)); - return f === d3_transitionRemove - ? (this.removeAttribute(name), null) - : f && function(t) { this.setAttribute(name, f(t)); }; - } - - function attrTweenNS(d, i) { - var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local)); - return f === d3_transitionRemove - ? (this.removeAttributeNS(name.space, name.local), null) - : f && function(t) { this.setAttributeNS(name.space, name.local, f(t)); }; - } - - return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween); -}; -d3_transitionPrototype.style = function(name, value, priority) { - if (arguments.length < 3) priority = ""; - return this.styleTween(name, d3_transitionTween(value), priority); -}; - -d3_transitionPrototype.styleTween = function(name, tween, priority) { - if (arguments.length < 3) priority = ""; - return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, window.getComputedStyle(this, null).getPropertyValue(name)); - return f === d3_transitionRemove - ? (this.style.removeProperty(name), null) - : f && function(t) { this.style.setProperty(name, f(t), priority); }; - }); -}; -d3_transitionPrototype.text = function(value) { - return this.tween("text", function(d, i) { - this.textContent = typeof value === "function" - ? value.call(this, d, i) - : value; - }); -}; -d3_transitionPrototype.remove = function() { - return this.each("end", function() { - var p; - if (!this.__transition__ && (p = this.parentNode)) p.removeChild(this); - }); -}; -d3_transitionPrototype.delay = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].delay = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].delay = value; })); -}; -d3_transitionPrototype.duration = function(value) { - var groups = this; - return groups.each(typeof value === "function" - ? function(d, i, j) { groups[j][i].duration = +value.apply(this, arguments); } - : (value = +value, function(d, i, j) { groups[j][i].duration = value; })); -}; -function d3_transition_each(callback) { - for (var j = 0, m = this.length; j < m; j++) { - for (var group = this[j], i = 0, n = group.length; i < n; i++) { - var node = group[i]; - if (node) callback.call(node = node.node, node.__data__, i, j); - } - } - return this; -} -d3_transitionPrototype.transition = function() { - return this.select(d3_this); -}; -var d3_timer_queue = null, - d3_timer_interval, // is an interval (or frame) active? - d3_timer_timeout; // is a timeout active? - -// The timer will continue to fire until callback returns true. -d3.timer = function(callback, delay, then) { - var found = false, - t0, - t1 = d3_timer_queue; - - if (arguments.length < 3) { - if (arguments.length < 2) delay = 0; - else if (!isFinite(delay)) return; - then = Date.now(); - } - - // See if the callback's already in the queue. - while (t1) { - if (t1.callback === callback) { - t1.then = then; - t1.delay = delay; - found = true; - break; - } - t0 = t1; - t1 = t1.next; - } - - // Otherwise, add the callback to the queue. - if (!found) d3_timer_queue = { - callback: callback, - then: then, - delay: delay, - next: d3_timer_queue - }; - - // Start animatin'! - if (!d3_timer_interval) { - d3_timer_timeout = clearTimeout(d3_timer_timeout); - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -function d3_timer_step() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (elapsed >= t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - var delay = d3_timer_flush() - now; - if (delay > 24) { - if (isFinite(delay)) { - clearTimeout(d3_timer_timeout); - d3_timer_timeout = setTimeout(d3_timer_step, delay); - } - d3_timer_interval = 0; - } else { - d3_timer_interval = 1; - d3_timer_frame(d3_timer_step); - } -} - -d3.timer.flush = function() { - var elapsed, - now = Date.now(), - t1 = d3_timer_queue; - - while (t1) { - elapsed = now - t1.then; - if (!t1.delay) t1.flush = t1.callback(elapsed); - t1 = t1.next; - } - - d3_timer_flush(); -}; - -// Flush after callbacks, to avoid concurrent queue modification. -function d3_timer_flush() { - var t0 = null, - t1 = d3_timer_queue, - then = Infinity; - while (t1) { - if (t1.flush) { - t1 = t0 ? t0.next = t1.next : d3_timer_queue = t1.next; - } else { - then = Math.min(then, t1.then + t1.delay); - t1 = (t0 = t1).next; - } - } - return then; -} - -var d3_timer_frame = window.requestAnimationFrame - || window.webkitRequestAnimationFrame - || window.mozRequestAnimationFrame - || window.oRequestAnimationFrame - || window.msRequestAnimationFrame - || function(callback) { setTimeout(callback, 17); }; -function d3_noop() {} -d3.scale = {}; - -function d3_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} -function d3_scale_nice(domain, nice) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - dx; - - if (x1 < x0) { - dx = i0; i0 = i1; i1 = dx; - dx = x0; x0 = x1; x1 = dx; - } - - if (dx = x1 - x0) { - nice = nice(dx); - domain[i0] = nice.floor(x0); - domain[i1] = nice.ceil(x1); - } - - return domain; -} - -function d3_scale_niceDefault() { - return Math; -} -d3.scale.linear = function() { - return d3_scale_linear([0, 1], [0, 1], d3.interpolate, false); -}; - -function d3_scale_linear(domain, range, interpolate, clamp) { - var output, - input; - - function rescale() { - var linear = domain.length == 2 ? d3_scale_bilinear : d3_scale_polylinear, - uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber; - output = linear(domain, range, uninterpolate, interpolate); - input = linear(range, domain, uninterpolate, d3.interpolate); - return scale; - } - - function scale(x) { - return output(x); - } - - // Note: requires range is coercible to number! - scale.invert = function(y) { - return input(y); - }; - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.map(Number); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.rangeRound = function(x) { - return scale.range(x).interpolate(d3.interpolateRound); - }; - - scale.clamp = function(x) { - if (!arguments.length) return clamp; - clamp = x; - return rescale(); - }; - - scale.interpolate = function(x) { - if (!arguments.length) return interpolate; - interpolate = x; - return rescale(); - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(domain, m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(domain, m); - }; - - scale.nice = function() { - d3_scale_nice(domain, d3_scale_linearNice); - return rescale(); - }; - - scale.copy = function() { - return d3_scale_linear(domain, range, interpolate, clamp); - }; - - return rescale(); -}; - -function d3_scale_linearRebind(scale, linear) { - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - return scale; -} - -function d3_scale_linearNice(dx) { - dx = Math.pow(10, Math.round(Math.log(dx) / Math.LN10) - 1); - return { - floor: function(x) { return Math.floor(x / dx) * dx; }, - ceil: function(x) { return Math.ceil(x / dx) * dx; } - }; -} - -// TODO Dates? Ugh. -function d3_scale_linearTickRange(domain, m) { - var extent = d3_scaleExtent(domain), - span = extent[1] - extent[0], - step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), - err = m / span * step; - - // Filter ticks to get closer to the desired count. - if (err <= .15) step *= 10; - else if (err <= .35) step *= 5; - else if (err <= .75) step *= 2; - - // Round start and stop values to step interval. - extent[0] = Math.ceil(extent[0] / step) * step; - extent[1] = Math.floor(extent[1] / step) * step + step * .5; // inclusive - extent[2] = step; - return extent; -} - -function d3_scale_linearTicks(domain, m) { - return d3.range.apply(d3, d3_scale_linearTickRange(domain, m)); -} - -function d3_scale_linearTickFormat(domain, m) { - return d3.format(",." + Math.max(0, -Math.floor(Math.log(d3_scale_linearTickRange(domain, m)[2]) / Math.LN10 + .01)) + "f"); -} -function d3_scale_bilinear(domain, range, uninterpolate, interpolate) { - var u = uninterpolate(domain[0], domain[1]), - i = interpolate(range[0], range[1]); - return function(x) { - return i(u(x)); - }; -} -function d3_scale_polylinear(domain, range, uninterpolate, interpolate) { - var u = [], - i = [], - j = 0, - n = domain.length; - - while (++j < n) { - u.push(uninterpolate(domain[j - 1], domain[j])); - i.push(interpolate(range[j - 1], range[j])); - } - - return function(x) { - var j = d3.bisect(domain, x, 1, domain.length - 1) - 1; - return i[j](u[j](x)); - }; -} -d3.scale.log = function() { - return d3_scale_log(d3.scale.linear(), d3_scale_logp); -}; - -function d3_scale_log(linear, log) { - var pow = log.pow; - - function scale(x) { - return linear(log(x)); - } - - scale.invert = function(x) { - return pow(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(pow); - log = x[0] < 0 ? d3_scale_logn : d3_scale_logp; - pow = log.pow; - linear.domain(x.map(log)); - return scale; - }; - - scale.nice = function() { - linear.domain(d3_scale_nice(linear.domain(), d3_scale_niceDefault)); - return scale; - }; - - scale.ticks = function() { - var extent = d3_scaleExtent(linear.domain()), - ticks = []; - if (extent.every(isFinite)) { - var i = Math.floor(extent[0]), - j = Math.ceil(extent[1]), - u = Math.round(pow(extent[0])), - v = Math.round(pow(extent[1])); - if (log === d3_scale_logn) { - ticks.push(pow(i)); - for (; i++ < j;) for (var k = 9; k > 0; k--) ticks.push(pow(i) * k); - } else { - for (; i < j; i++) for (var k = 1; k < 10; k++) ticks.push(pow(i) * k); - ticks.push(pow(i)); - } - for (i = 0; ticks[i] < u; i++) {} // strip small values - for (j = ticks.length; ticks[j - 1] > v; j--) {} // strip big values - ticks = ticks.slice(i, j); - } - return ticks; - }; - - scale.tickFormat = function(n, format) { - if (arguments.length < 2) format = d3_scale_logFormat; - if (arguments.length < 1) return format; - var k = n / scale.ticks().length, - f = log === d3_scale_logn ? (e = -1e-15, Math.floor) : (e = 1e-15, Math.ceil), - e; - return function(d) { - return d / pow(f(log(d) + e)) < k ? format(d) : ""; - }; - }; - - scale.copy = function() { - return d3_scale_log(linear.copy(), log); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -var d3_scale_logFormat = d3.format("e"); - -function d3_scale_logp(x) { - return Math.log(x) / Math.LN10; -} - -function d3_scale_logn(x) { - return -Math.log(-x) / Math.LN10; -} - -d3_scale_logp.pow = function(x) { - return Math.pow(10, x); -}; - -d3_scale_logn.pow = function(x) { - return -Math.pow(10, -x); -}; -d3.scale.pow = function() { - return d3_scale_pow(d3.scale.linear(), 1); -}; - -function d3_scale_pow(linear, exponent) { - var powp = d3_scale_powPow(exponent), - powb = d3_scale_powPow(1 / exponent); - - function scale(x) { - return linear(powp(x)); - } - - scale.invert = function(x) { - return powb(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(powb); - linear.domain(x.map(powp)); - return scale; - }; - - scale.ticks = function(m) { - return d3_scale_linearTicks(scale.domain(), m); - }; - - scale.tickFormat = function(m) { - return d3_scale_linearTickFormat(scale.domain(), m); - }; - - scale.nice = function() { - return scale.domain(d3_scale_nice(scale.domain(), d3_scale_linearNice)); - }; - - scale.exponent = function(x) { - if (!arguments.length) return exponent; - var domain = scale.domain(); - powp = d3_scale_powPow(exponent = x); - powb = d3_scale_powPow(1 / exponent); - return scale.domain(domain); - }; - - scale.copy = function() { - return d3_scale_pow(linear.copy(), exponent); - }; - - return d3_scale_linearRebind(scale, linear); -}; - -function d3_scale_powPow(e) { - return function(x) { - return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e); - }; -} -d3.scale.sqrt = function() { - return d3.scale.pow().exponent(.5); -}; -d3.scale.ordinal = function() { - return d3_scale_ordinal([], {t: "range", x: []}); -}; - -function d3_scale_ordinal(domain, ranger) { - var index, - range, - rangeBand; - - function scale(x) { - return range[((index[x] || (index[x] = domain.push(x))) - 1) % range.length]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = []; - index = {}; - var i = -1, n = x.length, xi; - while (++i < n) if (!index[xi = x[i]]) index[xi] = domain.push(xi); - return scale[ranger.t](ranger.x, ranger.p); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - rangeBand = 0; - ranger = {t: "range", x: x}; - return scale; - }; - - scale.rangePoints = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length - 1 + padding); - range = domain.length < 2 ? [(start + stop) / 2] : d3.range(start + step * padding / 2, stop + step / 2, step); - rangeBand = 0; - ranger = {t: "rangePoints", x: x, p: padding}; - return scale; - }; - - scale.rangeBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = (stop - start) / (domain.length + padding); - range = d3.range(start + step * padding, stop, step); - rangeBand = step * (1 - padding); - ranger = {t: "rangeBands", x: x, p: padding}; - return scale; - }; - - scale.rangeRoundBands = function(x, padding) { - if (arguments.length < 2) padding = 0; - var start = x[0], - stop = x[1], - step = Math.floor((stop - start) / (domain.length + padding)), - err = stop - start - (domain.length - padding) * step; - range = d3.range(start + Math.round(err / 2), stop, step); - rangeBand = Math.round(step * (1 - padding)); - ranger = {t: "rangeRoundBands", x: x, p: padding}; - return scale; - }; - - scale.rangeBand = function() { - return rangeBand; - }; - - scale.copy = function() { - return d3_scale_ordinal(domain, ranger); - }; - - return scale.domain(domain); -}; -/* - * This product includes color specifications and designs developed by Cynthia - * Brewer (http://colorbrewer.org/). See lib/colorbrewer for more information. - */ - -d3.scale.category10 = function() { - return d3.scale.ordinal().range(d3_category10); -}; - -d3.scale.category20 = function() { - return d3.scale.ordinal().range(d3_category20); -}; - -d3.scale.category20b = function() { - return d3.scale.ordinal().range(d3_category20b); -}; - -d3.scale.category20c = function() { - return d3.scale.ordinal().range(d3_category20c); -}; - -var d3_category10 = [ - "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", - "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" -]; - -var d3_category20 = [ - "#1f77b4", "#aec7e8", - "#ff7f0e", "#ffbb78", - "#2ca02c", "#98df8a", - "#d62728", "#ff9896", - "#9467bd", "#c5b0d5", - "#8c564b", "#c49c94", - "#e377c2", "#f7b6d2", - "#7f7f7f", "#c7c7c7", - "#bcbd22", "#dbdb8d", - "#17becf", "#9edae5" -]; - -var d3_category20b = [ - "#393b79", "#5254a3", "#6b6ecf", "#9c9ede", - "#637939", "#8ca252", "#b5cf6b", "#cedb9c", - "#8c6d31", "#bd9e39", "#e7ba52", "#e7cb94", - "#843c39", "#ad494a", "#d6616b", "#e7969c", - "#7b4173", "#a55194", "#ce6dbd", "#de9ed6" -]; - -var d3_category20c = [ - "#3182bd", "#6baed6", "#9ecae1", "#c6dbef", - "#e6550d", "#fd8d3c", "#fdae6b", "#fdd0a2", - "#31a354", "#74c476", "#a1d99b", "#c7e9c0", - "#756bb1", "#9e9ac8", "#bcbddc", "#dadaeb", - "#636363", "#969696", "#bdbdbd", "#d9d9d9" -]; -d3.scale.quantile = function() { - return d3_scale_quantile([], []); -}; - -function d3_scale_quantile(domain, range) { - var thresholds; - - function rescale() { - var k = 0, - n = domain.length, - q = range.length; - thresholds = []; - while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q); - return scale; - } - - function scale(x) { - if (isNaN(x = +x)) return NaN; - return range[d3.bisect(thresholds, x)]; - } - - scale.domain = function(x) { - if (!arguments.length) return domain; - domain = x.filter(function(d) { return !isNaN(d); }).sort(d3.ascending); - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.quantiles = function() { - return thresholds; - }; - - scale.copy = function() { - return d3_scale_quantile(domain, range); // copy on write! - }; - - return rescale(); -}; -d3.scale.quantize = function() { - return d3_scale_quantize(0, 1, [0, 1]); -}; - -function d3_scale_quantize(x0, x1, range) { - var kx, i; - - function scale(x) { - return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))]; - } - - function rescale() { - kx = range.length / (x1 - x0); - i = range.length - 1; - return scale; - } - - scale.domain = function(x) { - if (!arguments.length) return [x0, x1]; - x0 = +x[0]; - x1 = +x[x.length - 1]; - return rescale(); - }; - - scale.range = function(x) { - if (!arguments.length) return range; - range = x; - return rescale(); - }; - - scale.copy = function() { - return d3_scale_quantize(x0, x1, range); // copy on write - }; - - return rescale(); -}; -d3.svg = {}; -d3.svg.arc = function() { - var innerRadius = d3_svg_arcInnerRadius, - outerRadius = d3_svg_arcOuterRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - function arc() { - var r0 = innerRadius.apply(this, arguments), - r1 = outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) + d3_svg_arcOffset, - a1 = endAngle.apply(this, arguments) + d3_svg_arcOffset, - da = (a1 < a0 && (da = a0, a0 = a1, a1 = da), a1 - a0), - df = da < Math.PI ? "0" : "1", - c0 = Math.cos(a0), - s0 = Math.sin(a0), - c1 = Math.cos(a1), - s1 = Math.sin(a1); - return da >= d3_svg_arcMax - ? (r0 - ? "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "M0," + r0 - + "A" + r0 + "," + r0 + " 0 1,0 0," + (-r0) - + "A" + r0 + "," + r0 + " 0 1,0 0," + r0 - + "Z" - : "M0," + r1 - + "A" + r1 + "," + r1 + " 0 1,1 0," + (-r1) - + "A" + r1 + "," + r1 + " 0 1,1 0," + r1 - + "Z") - : (r0 - ? "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L" + r0 * c1 + "," + r0 * s1 - + "A" + r0 + "," + r0 + " 0 " + df + ",0 " + r0 * c0 + "," + r0 * s0 - + "Z" - : "M" + r1 * c0 + "," + r1 * s0 - + "A" + r1 + "," + r1 + " 0 " + df + ",1 " + r1 * c1 + "," + r1 * s1 - + "L0,0" - + "Z"); - } - - arc.innerRadius = function(v) { - if (!arguments.length) return innerRadius; - innerRadius = d3.functor(v); - return arc; - }; - - arc.outerRadius = function(v) { - if (!arguments.length) return outerRadius; - outerRadius = d3.functor(v); - return arc; - }; - - arc.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return arc; - }; - - arc.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return arc; - }; - - arc.centroid = function() { - var r = (innerRadius.apply(this, arguments) - + outerRadius.apply(this, arguments)) / 2, - a = (startAngle.apply(this, arguments) - + endAngle.apply(this, arguments)) / 2 + d3_svg_arcOffset; - return [Math.cos(a) * r, Math.sin(a) * r]; - }; - - return arc; -}; - -var d3_svg_arcOffset = -Math.PI / 2, - d3_svg_arcMax = 2 * Math.PI - 1e-6; - -function d3_svg_arcInnerRadius(d) { - return d.innerRadius; -} - -function d3_svg_arcOuterRadius(d) { - return d.outerRadius; -} - -function d3_svg_arcStartAngle(d) { - return d.startAngle; -} - -function d3_svg_arcEndAngle(d) { - return d.endAngle; -} -function d3_svg_line(projection) { - var x = d3_svg_lineX, - y = d3_svg_lineY, - interpolate = "linear", - interpolator = d3_svg_lineInterpolators[interpolate], - tension = .7; - - function line(d) { - return d.length < 1 ? null : "M" + interpolator(projection(d3_svg_linePoints(this, d, x, y)), tension); - } - - line.x = function(v) { - if (!arguments.length) return x; - x = v; - return line; - }; - - line.y = function(v) { - if (!arguments.length) return y; - y = v; - return line; - }; - - line.interpolate = function(v) { - if (!arguments.length) return interpolate; - interpolator = d3_svg_lineInterpolators[interpolate = v]; - return line; - }; - - line.tension = function(v) { - if (!arguments.length) return tension; - tension = v; - return line; - }; - - return line; -} - -d3.svg.line = function() { - return d3_svg_line(Object); -}; - -// Converts the specified array of data into an array of points -// (x-y tuples), by evaluating the specified `x` and `y` functions on each -// data point. The `this` context of the evaluated functions is the specified -// "self" object; each function is passed the current datum and index. -function d3_svg_linePoints(self, d, x, y) { - var points = [], - i = -1, - n = d.length, - fx = typeof x === "function", - fy = typeof y === "function", - value; - if (fx && fy) { - while (++i < n) points.push([ - x.call(self, value = d[i], i), - y.call(self, value, i) - ]); - } else if (fx) { - while (++i < n) points.push([x.call(self, d[i], i), y]); - } else if (fy) { - while (++i < n) points.push([x, y.call(self, d[i], i)]); - } else { - while (++i < n) points.push([x, y]); - } - return points; -} - -// The default `x` property, which references d[0]. -function d3_svg_lineX(d) { - return d[0]; -} - -// The default `y` property, which references d[1]. -function d3_svg_lineY(d) { - return d[1]; -} - -// The various interpolators supported by the `line` class. -var d3_svg_lineInterpolators = { - "linear": d3_svg_lineLinear, - "step-before": d3_svg_lineStepBefore, - "step-after": d3_svg_lineStepAfter, - "basis": d3_svg_lineBasis, - "basis-open": d3_svg_lineBasisOpen, - "basis-closed": d3_svg_lineBasisClosed, - "bundle": d3_svg_lineBundle, - "cardinal": d3_svg_lineCardinal, - "cardinal-open": d3_svg_lineCardinalOpen, - "cardinal-closed": d3_svg_lineCardinalClosed, - "monotone": d3_svg_lineMonotone -}; - -// Linear interpolation; generates "L" commands. -function d3_svg_lineLinear(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("L", (p = points[i])[0], ",", p[1]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepBefore(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]); - return path.join(""); -} - -// Step interpolation; generates "H" and "V" commands. -function d3_svg_lineStepAfter(points) { - var i = 0, - n = points.length, - p = points[0], - path = [p[0], ",", p[1]]; - while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]); - return path.join(""); -} - -// Open cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalOpen(points, tension) { - return points.length < 4 - ? d3_svg_lineLinear(points) - : points[1] + d3_svg_lineHermite(points.slice(1, points.length - 1), - d3_svg_lineCardinalTangents(points, tension)); -} - -// Closed cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinalClosed(points, tension) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite((points.push(points[0]), points), - d3_svg_lineCardinalTangents([points[points.length - 2]] - .concat(points, [points[1]]), tension)); -} - -// Cardinal spline interpolation; generates "C" commands. -function d3_svg_lineCardinal(points, tension, closed) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + d3_svg_lineHermite(points, - d3_svg_lineCardinalTangents(points, tension)); -} - -// Hermite spline construction; generates "C" commands. -function d3_svg_lineHermite(points, tangents) { - if (tangents.length < 1 - || (points.length != tangents.length - && points.length != tangents.length + 2)) { - return d3_svg_lineLinear(points); - } - - var quad = points.length != tangents.length, - path = "", - p0 = points[0], - p = points[1], - t0 = tangents[0], - t = t0, - pi = 1; - - if (quad) { - path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) - + "," + p[0] + "," + p[1]; - p0 = points[1]; - pi = 2; - } - - if (tangents.length > 1) { - t = tangents[1]; - p = points[pi]; - pi++; - path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) - + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - for (var i = 2; i < tangents.length; i++, pi++) { - p = points[pi]; - t = tangents[i]; - path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) - + "," + p[0] + "," + p[1]; - } - } - - if (quad) { - var lp = points[pi]; - path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) - + "," + lp[0] + "," + lp[1]; - } - - return path; -} - -// Generates tangents for a cardinal spline. -function d3_svg_lineCardinalTangents(points, tension) { - var tangents = [], - a = (1 - tension) / 2, - p0, - p1 = points[0], - p2 = points[1], - i = 1, - n = points.length; - while (++i < n) { - p0 = p1; - p1 = p2; - p2 = points[i]; - tangents.push([a * (p2[0] - p0[0]), a * (p2[1] - p0[1])]); - } - return tangents; -} - -// B-spline interpolation; generates "C" commands. -function d3_svg_lineBasis(points) { - if (points.length < 3) return d3_svg_lineLinear(points); - var i = 1, - n = points.length, - pi = points[0], - x0 = pi[0], - y0 = pi[1], - px = [x0, x0, x0, (pi = points[1])[0]], - py = [y0, y0, y0, pi[1]], - path = [x0, ",", y0]; - d3_svg_lineBasisBezier(path, px, py); - while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - i = -1; - while (++i < 2) { - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Open B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisOpen(points) { - if (points.length < 4) return d3_svg_lineLinear(points); - var path = [], - i = -1, - n = points.length, - pi, - px = [0], - py = [0]; - while (++i < 3) { - pi = points[i]; - px.push(pi[0]); - py.push(pi[1]); - } - path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) - + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py)); - --i; while (++i < n) { - pi = points[i]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -// Closed B-spline interpolation; generates "C" commands. -function d3_svg_lineBasisClosed(points) { - var path, - i = -1, - n = points.length, - m = n + 4, - pi, - px = [], - py = []; - while (++i < 4) { - pi = points[i % n]; - px.push(pi[0]); - py.push(pi[1]); - } - path = [ - d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", - d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) - ]; - --i; while (++i < m) { - pi = points[i % n]; - px.shift(); px.push(pi[0]); - py.shift(); py.push(pi[1]); - d3_svg_lineBasisBezier(path, px, py); - } - return path.join(""); -} - -function d3_svg_lineBundle(points, tension) { - var n = points.length - 1, - x0 = points[0][0], - y0 = points[0][1], - dx = points[n][0] - x0, - dy = points[n][1] - y0, - i = -1, - p, - t; - while (++i <= n) { - p = points[i]; - t = i / n; - p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx); - p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy); - } - return d3_svg_lineBasis(points); -} - -// Returns the dot product of the given four-element vectors. -function d3_svg_lineDot4(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3]; -} - -// Matrix to transform basis (b-spline) control points to bezier -// control points. Derived from FvD 11.2.8. -var d3_svg_lineBasisBezier1 = [0, 2/3, 1/3, 0], - d3_svg_lineBasisBezier2 = [0, 1/3, 2/3, 0], - d3_svg_lineBasisBezier3 = [0, 1/6, 2/3, 1/6]; - -// Pushes a "C" Bézier curve onto the specified path array, given the -// two specified four-element arrays which define the control points. -function d3_svg_lineBasisBezier(path, x, y) { - path.push( - "C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), - ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y)); -} - -// Computes the slope from points p0 to p1. -function d3_svg_lineSlope(p0, p1) { - return (p1[1] - p0[1]) / (p1[0] - p0[0]); -} - -// Compute three-point differences for the given points. -// http://en.wikipedia.org/wiki/Cubic_Hermite_spline#Finite_difference -function d3_svg_lineFiniteDifferences(points) { - var i = 0, - j = points.length - 1, - m = [], - p0 = points[0], - p1 = points[1], - d = m[0] = d3_svg_lineSlope(p0, p1); - while (++i < j) { - m[i] = d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1])); - } - m[i] = d; - return m; -} - -// Interpolates the given points using Fritsch-Carlson Monotone cubic Hermite -// interpolation. Returns an array of tangent vectors. For details, see -// http://en.wikipedia.org/wiki/Monotone_cubic_interpolation -function d3_svg_lineMonotoneTangents(points) { - var tangents = [], - d, - a, - b, - s, - m = d3_svg_lineFiniteDifferences(points), - i = -1, - j = points.length - 1; - - // The first two steps are done by computing finite-differences: - // 1. Compute the slopes of the secant lines between successive points. - // 2. Initialize the tangents at every point as the average of the secants. - - // Then, for each segment… - while (++i < j) { - d = d3_svg_lineSlope(points[i], points[i + 1]); - - // 3. If two successive yk = y{k + 1} are equal (i.e., d is zero), then set - // mk = m{k + 1} = 0 as the spline connecting these points must be flat to - // preserve monotonicity. Ignore step 4 and 5 for those k. - - if (Math.abs(d) < 1e-6) { - m[i] = m[i + 1] = 0; - } else { - // 4. Let ak = mk / dk and bk = m{k + 1} / dk. - a = m[i] / d; - b = m[i + 1] / d; - - // 5. Prevent overshoot and ensure monotonicity by restricting the - // magnitude of vector <ak, bk> to a circle of radius 3. - s = a * a + b * b; - if (s > 9) { - s = d * 3 / Math.sqrt(s); - m[i] = s * a; - m[i + 1] = s * b; - } - } - } - - // Compute the normalized tangent vector from the slopes. Note that if x is - // not monotonic, it's possible that the slope will be infinite, so we protect - // against NaN by setting the coordinate to zero. - i = -1; while (++i <= j) { - s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) - / (6 * (1 + m[i] * m[i])); - tangents.push([s || 0, m[i] * s || 0]); - } - - return tangents; -} - -function d3_svg_lineMonotone(points) { - return points.length < 3 - ? d3_svg_lineLinear(points) - : points[0] + - d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points)); -} -d3.svg.line.radial = function() { - var line = d3_svg_line(d3_svg_lineRadial); - line.radius = line.x, delete line.x; - line.angle = line.y, delete line.y; - return line; -}; - -function d3_svg_lineRadial(points) { - var point, - i = -1, - n = points.length, - r, - a; - while (++i < n) { - point = points[i]; - r = point[0]; - a = point[1] + d3_svg_arcOffset; - point[0] = r * Math.cos(a); - point[1] = r * Math.sin(a); - } - return points; -} -function d3_svg_area(projection) { - var x0 = d3_svg_lineX, - x1 = d3_svg_lineX, - y0 = 0, - y1 = d3_svg_lineY, - interpolate, - i0, - i1, - tension = .7; - - function area(d) { - if (d.length < 1) return null; - var points0 = d3_svg_linePoints(this, d, x0, y0), - points1 = d3_svg_linePoints(this, d, x0 === x1 ? d3_svg_areaX(points0) : x1, y0 === y1 ? d3_svg_areaY(points0) : y1); - return "M" + i0(projection(points1), tension) - + "L" + i1(projection(points0.reverse()), tension) - + "Z"; - } - - area.x = function(x) { - if (!arguments.length) return x1; - x0 = x1 = x; - return area; - }; - - area.x0 = function(x) { - if (!arguments.length) return x0; - x0 = x; - return area; - }; - - area.x1 = function(x) { - if (!arguments.length) return x1; - x1 = x; - return area; - }; - - area.y = function(y) { - if (!arguments.length) return y1; - y0 = y1 = y; - return area; - }; - - area.y0 = function(y) { - if (!arguments.length) return y0; - y0 = y; - return area; - }; - - area.y1 = function(y) { - if (!arguments.length) return y1; - y1 = y; - return area; - }; - - area.interpolate = function(x) { - if (!arguments.length) return interpolate; - i0 = d3_svg_lineInterpolators[interpolate = x]; - i1 = i0.reverse || i0; - return area; - }; - - area.tension = function(x) { - if (!arguments.length) return tension; - tension = x; - return area; - }; - - return area.interpolate("linear"); -} - -d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter; -d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore; - -d3.svg.area = function() { - return d3_svg_area(Object); -}; - -function d3_svg_areaX(points) { - return function(d, i) { - return points[i][0]; - }; -} - -function d3_svg_areaY(points) { - return function(d, i) { - return points[i][1]; - }; -} -d3.svg.area.radial = function() { - var area = d3_svg_area(d3_svg_lineRadial); - area.radius = area.x, delete area.x; - area.innerRadius = area.x0, delete area.x0; - area.outerRadius = area.x1, delete area.x1; - area.angle = area.y, delete area.y; - area.startAngle = area.y0, delete area.y0; - area.endAngle = area.y1, delete area.y1; - return area; -}; -d3.svg.chord = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - radius = d3_svg_chordRadius, - startAngle = d3_svg_arcStartAngle, - endAngle = d3_svg_arcEndAngle; - - // TODO Allow control point to be customized. - - function chord(d, i) { - var s = subgroup(this, source, d, i), - t = subgroup(this, target, d, i); - return "M" + s.p0 - + arc(s.r, s.p1) + (equals(s, t) - ? curve(s.r, s.p1, s.r, s.p0) - : curve(s.r, s.p1, t.r, t.p0) - + arc(t.r, t.p1) - + curve(t.r, t.p1, s.r, s.p0)) - + "Z"; - } - - function subgroup(self, f, d, i) { - var subgroup = f.call(self, d, i), - r = radius.call(self, subgroup, i), - a0 = startAngle.call(self, subgroup, i) + d3_svg_arcOffset, - a1 = endAngle.call(self, subgroup, i) + d3_svg_arcOffset; - return { - r: r, - a0: a0, - a1: a1, - p0: [r * Math.cos(a0), r * Math.sin(a0)], - p1: [r * Math.cos(a1), r * Math.sin(a1)] - }; - } - - function equals(a, b) { - return a.a0 == b.a0 && a.a1 == b.a1; - } - - function arc(r, p) { - return "A" + r + "," + r + " 0 0,1 " + p; - } - - function curve(r0, p0, r1, p1) { - return "Q 0,0 " + p1; - } - - chord.radius = function(v) { - if (!arguments.length) return radius; - radius = d3.functor(v); - return chord; - }; - - chord.source = function(v) { - if (!arguments.length) return source; - source = d3.functor(v); - return chord; - }; - - chord.target = function(v) { - if (!arguments.length) return target; - target = d3.functor(v); - return chord; - }; - - chord.startAngle = function(v) { - if (!arguments.length) return startAngle; - startAngle = d3.functor(v); - return chord; - }; - - chord.endAngle = function(v) { - if (!arguments.length) return endAngle; - endAngle = d3.functor(v); - return chord; - }; - - return chord; -}; - -function d3_svg_chordSource(d) { - return d.source; -} - -function d3_svg_chordTarget(d) { - return d.target; -} - -function d3_svg_chordRadius(d) { - return d.radius; -} - -function d3_svg_chordStartAngle(d) { - return d.startAngle; -} - -function d3_svg_chordEndAngle(d) { - return d.endAngle; -} -d3.svg.diagonal = function() { - var source = d3_svg_chordSource, - target = d3_svg_chordTarget, - projection = d3_svg_diagonalProjection; - - function diagonal(d, i) { - var p0 = source.call(this, d, i), - p3 = target.call(this, d, i), - m = (p0.y + p3.y) / 2, - p = [p0, {x: p0.x, y: m}, {x: p3.x, y: m}, p3]; - p = p.map(projection); - return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3]; - } - - diagonal.source = function(x) { - if (!arguments.length) return source; - source = d3.functor(x); - return diagonal; - }; - - diagonal.target = function(x) { - if (!arguments.length) return target; - target = d3.functor(x); - return diagonal; - }; - - diagonal.projection = function(x) { - if (!arguments.length) return projection; - projection = x; - return diagonal; - }; - - return diagonal; -}; - -function d3_svg_diagonalProjection(d) { - return [d.x, d.y]; -} -d3.svg.diagonal.radial = function() { - var diagonal = d3.svg.diagonal(), - projection = d3_svg_diagonalProjection, - projection_ = diagonal.projection; - - diagonal.projection = function(x) { - return arguments.length - ? projection_(d3_svg_diagonalRadialProjection(projection = x)) - : projection; - }; - - return diagonal; -}; - -function d3_svg_diagonalRadialProjection(projection) { - return function() { - var d = projection.apply(this, arguments), - r = d[0], - a = d[1] + d3_svg_arcOffset; - return [r * Math.cos(a), r * Math.sin(a)]; - }; -} -d3.svg.mouse = function(container) { - return d3_svg_mousePoint(container, d3.event); -}; - -// https://bugs.webkit.org/show_bug.cgi?id=44083 -var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; - -function d3_svg_mousePoint(container, e) { - var point = (container.ownerSVGElement || container).createSVGPoint(); - if ((d3_mouse_bug44083 < 0) && (window.scrollX || window.scrollY)) { - var svg = d3.select(document.body) - .append("svg:svg") - .style("position", "absolute") - .style("top", 0) - .style("left", 0); - var ctm = svg[0][0].getScreenCTM(); - d3_mouse_bug44083 = !(ctm.f || ctm.e); - svg.remove(); - } - if (d3_mouse_bug44083) { - point.x = e.pageX; - point.y = e.pageY; - } else { - point.x = e.clientX; - point.y = e.clientY; - } - point = point.matrixTransform(container.getScreenCTM().inverse()); - return [point.x, point.y]; -}; -d3.svg.touches = function(container) { - var touches = d3.event.touches; - return touches ? d3_array(touches).map(function(touch) { - var point = d3_svg_mousePoint(container, touch); - point.identifier = touch.identifier; - return point; - }) : []; -}; -d3.svg.symbol = function() { - var type = d3_svg_symbolType, - size = d3_svg_symbolSize; - - function symbol(d, i) { - return (d3_svg_symbols[type.call(this, d, i)] - || d3_svg_symbols.circle) - (size.call(this, d, i)); - } - - symbol.type = function(x) { - if (!arguments.length) return type; - type = d3.functor(x); - return symbol; - }; - - // size of symbol in square pixels - symbol.size = function(x) { - if (!arguments.length) return size; - size = d3.functor(x); - return symbol; - }; - - return symbol; -}; - -function d3_svg_symbolSize() { - return 64; -} - -function d3_svg_symbolType() { - return "circle"; -} - -// TODO cross-diagonal? -var d3_svg_symbols = { - "circle": function(size) { - var r = Math.sqrt(size / Math.PI); - return "M0," + r - + "A" + r + "," + r + " 0 1,1 0," + (-r) - + "A" + r + "," + r + " 0 1,1 0," + r - + "Z"; - }, - "cross": function(size) { - var r = Math.sqrt(size / 5) / 2; - return "M" + -3 * r + "," + -r - + "H" + -r - + "V" + -3 * r - + "H" + r - + "V" + -r - + "H" + 3 * r - + "V" + r - + "H" + r - + "V" + 3 * r - + "H" + -r - + "V" + r - + "H" + -3 * r - + "Z"; - }, - "diamond": function(size) { - var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), - rx = ry * d3_svg_symbolTan30; - return "M0," + -ry - + "L" + rx + ",0" - + " 0," + ry - + " " + -rx + ",0" - + "Z"; - }, - "square": function(size) { - var r = Math.sqrt(size) / 2; - return "M" + -r + "," + -r - + "L" + r + "," + -r - + " " + r + "," + r - + " " + -r + "," + r - + "Z"; - }, - "triangle-down": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + ry - + "L" + rx +"," + -ry - + " " + -rx + "," + -ry - + "Z"; - }, - "triangle-up": function(size) { - var rx = Math.sqrt(size / d3_svg_symbolSqrt3), - ry = rx * d3_svg_symbolSqrt3 / 2; - return "M0," + -ry - + "L" + rx +"," + ry - + " " + -rx + "," + ry - + "Z"; - } -}; - -d3.svg.symbolTypes = d3.keys(d3_svg_symbols); - -var d3_svg_symbolSqrt3 = Math.sqrt(3), - d3_svg_symbolTan30 = Math.tan(30 * Math.PI / 180); -d3.svg.axis = function() { - var scale = d3.scale.linear(), - orient = "bottom", - tickMajorSize = 6, - tickMinorSize = 6, - tickEndSize = 6, - tickPadding = 3, - tickArguments_ = [10], - tickFormat_, - tickSubdivide = 0; - - function axis(selection) { - selection.each(function(d, i, j) { - var g = d3.select(this); - - // If selection is a transition, create subtransitions. - var transition = selection.delay ? function(o) { - var id = d3_transitionInheritId; - try { - d3_transitionInheritId = selection.id; - return o.transition() - .delay(selection[j][i].delay) - .duration(selection[j][i].duration) - .ease(selection.ease()); - } finally { - d3_transitionInheritId = id; - } - } : Object; - - // Ticks. - var ticks = scale.ticks.apply(scale, tickArguments_), - tickFormat = tickFormat_ == null ? scale.tickFormat.apply(scale, tickArguments_) : tickFormat_; - - // Minor ticks. - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), - subtick = g.selectAll(".minor").data(subticks, String), - subtickEnter = subtick.enter().insert("svg:line", "g").attr("class", "tick minor").style("opacity", 1e-6), - subtickExit = transition(subtick.exit()).style("opacity", 1e-6).remove(), - subtickUpdate = transition(subtick).style("opacity", 1); - - // Major ticks. - var tick = g.selectAll("g").data(ticks, String), - tickEnter = tick.enter().insert("svg:g", "path").style("opacity", 1e-6), - tickExit = transition(tick.exit()).style("opacity", 1e-6).remove(), - tickUpdate = transition(tick).style("opacity", 1), - tickTransform; - - // Domain. - var range = d3_scaleExtent(scale.range()), - path = g.selectAll(".domain").data([0]), - pathEnter = path.enter().append("svg:path").attr("class", "domain"), - pathUpdate = transition(path); - - // Stash the new scale and grab the old scale. - var scale0 = this.__chart__ || scale; - this.__chart__ = scale.copy(); - - tickEnter.append("svg:line").attr("class", "tick"); - tickEnter.append("svg:text"); - tickUpdate.select("text").text(tickFormat); - - switch (orient) { - case "bottom": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("x2", 0).attr("y2", tickMinorSize); - tickUpdate.select("line").attr("x2", 0).attr("y2", tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", Math.max(tickMajorSize, 0) + tickPadding).attr("dy", ".71em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + tickEndSize + "V0H" + range[1] + "V" + tickEndSize); - break; - } - case "top": { - tickTransform = d3_svg_axisX; - subtickUpdate.attr("x2", 0).attr("y2", -tickMinorSize); - tickUpdate.select("line").attr("x2", 0).attr("y2", -tickMajorSize); - tickUpdate.select("text").attr("x", 0).attr("y", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("dy", "0em").attr("text-anchor", "middle"); - pathUpdate.attr("d", "M" + range[0] + "," + -tickEndSize + "V0H" + range[1] + "V" + -tickEndSize); - break; - } - case "left": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", -tickMinorSize).attr("y2", 0); - tickUpdate.select("line").attr("x2", -tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", -(Math.max(tickMajorSize, 0) + tickPadding)).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "end"); - pathUpdate.attr("d", "M" + -tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + -tickEndSize); - break; - } - case "right": { - tickTransform = d3_svg_axisY; - subtickUpdate.attr("x2", tickMinorSize).attr("y2", 0); - tickUpdate.select("line").attr("x2", tickMajorSize).attr("y2", 0); - tickUpdate.select("text").attr("x", Math.max(tickMajorSize, 0) + tickPadding).attr("y", 0).attr("dy", ".32em").attr("text-anchor", "start"); - pathUpdate.attr("d", "M" + tickEndSize + "," + range[0] + "H0V" + range[1] + "H" + tickEndSize); - break; - } - } - - tickEnter.call(tickTransform, scale0); - tickUpdate.call(tickTransform, scale); - tickExit.call(tickTransform, scale); - - subtickEnter.call(tickTransform, scale0); - subtickUpdate.call(tickTransform, scale); - subtickExit.call(tickTransform, scale); - }); - } - - axis.scale = function(x) { - if (!arguments.length) return scale; - scale = x; - return axis; - }; - - axis.orient = function(x) { - if (!arguments.length) return orient; - orient = x; - return axis; - }; - - axis.ticks = function() { - if (!arguments.length) return tickArguments_; - tickArguments_ = arguments; - return axis; - }; - - axis.tickFormat = function(x) { - if (!arguments.length) return tickFormat_; - tickFormat_ = x; - return axis; - }; - - axis.tickSize = function(x, y, z) { - if (!arguments.length) return tickMajorSize; - var n = arguments.length - 1; - tickMajorSize = +x; - tickMinorSize = n > 1 ? +y : tickMajorSize; - tickEndSize = n > 0 ? +arguments[n] : tickMajorSize; - return axis; - }; - - axis.tickPadding = function(x) { - if (!arguments.length) return tickPadding; - tickPadding = +x; - return axis; - }; - - axis.tickSubdivide = function(x) { - if (!arguments.length) return tickSubdivide; - tickSubdivide = +x; - return axis; - }; - - return axis; -}; - -function d3_svg_axisX(selection, x) { - selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; }); -} - -function d3_svg_axisY(selection, y) { - selection.attr("transform", function(d) { return "translate(0," + y(d) + ")"; }); -} - -function d3_svg_axisSubdivide(scale, ticks, m) { - subticks = []; - if (m && ticks.length > 1) { - var extent = d3_scaleExtent(scale.domain()), - subticks, - i = -1, - n = ticks.length, - d = (ticks[1] - ticks[0]) / ++m, - j, - v; - while (++i < n) { - for (j = m; --j > 0;) { - if ((v = +ticks[i] - j * d) >= extent[0]) { - subticks.push(v); - } - } - } - for (--i, j = 0; ++j < m && (v = +ticks[i] + j * d) < extent[1];) { - subticks.push(v); - } - } - return subticks; -} -d3.behavior = {}; -d3.behavior.drag = function() { - var event = d3.dispatch("drag", "dragstart", "dragend"); - - function drag() { - this - .on("mousedown.drag", mousedown) - .on("touchstart.drag", mousedown); - - d3.select(window) - .on("mousemove.drag", d3_behavior_dragMove) - .on("touchmove.drag", d3_behavior_dragMove) - .on("mouseup.drag", d3_behavior_dragUp, true) - .on("touchend.drag", d3_behavior_dragUp, true) - .on("click.drag", d3_behavior_dragClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_dragEvent = event; - d3_behavior_dragEventTarget = d3.event.target; - d3_behavior_dragOffset = d3_behavior_dragPoint((d3_behavior_dragTarget = this).parentNode); - d3_behavior_dragMoved = 0; - d3_behavior_dragArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_dragDispatch("dragstart"); - } - - drag.on = function(type, listener) { - event[type].add(listener); - return drag; - }; - - return drag; -}; - -var d3_behavior_dragEvent, - d3_behavior_dragEventTarget, - d3_behavior_dragTarget, - d3_behavior_dragArguments, - d3_behavior_dragOffset, - d3_behavior_dragMoved, - d3_behavior_dragStopClick; - -function d3_behavior_dragDispatch(type) { - var o = d3.event, p = d3_behavior_dragTarget.parentNode, dx = 0, dy = 0; - - if (p) { - p = d3_behavior_dragPoint(p); - dx = p[0] - d3_behavior_dragOffset[0]; - dy = p[1] - d3_behavior_dragOffset[1]; - d3_behavior_dragOffset = p; - d3_behavior_dragMoved |= dx | dy; - } - - try { - d3.event = {dx: dx, dy: dy}; - d3_behavior_dragEvent[type].dispatch.apply(d3_behavior_dragTarget, d3_behavior_dragArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} - -function d3_behavior_dragPoint(container) { - return d3.event.touches - ? d3.svg.touches(container)[0] - : d3.svg.mouse(container); -} - -function d3_behavior_dragMove() { - if (!d3_behavior_dragTarget) return; - var parent = d3_behavior_dragTarget.parentNode; - - // O NOES! The drag element was removed from the DOM. - if (!parent) return d3_behavior_dragUp(); - - d3_behavior_dragDispatch("drag"); - d3_behavior_dragCancel(); -} - -function d3_behavior_dragUp() { - if (!d3_behavior_dragTarget) return; - d3_behavior_dragDispatch("dragend"); - d3_behavior_dragTarget = null; - - // If the node was moved, prevent the mouseup from propagating. - // Also prevent the subsequent click from propagating (e.g., for anchors). - if (d3_behavior_dragMoved && d3_behavior_dragEventTarget === d3.event.target) { - d3_behavior_dragStopClick = true; - d3_behavior_dragCancel(); - } -} - -function d3_behavior_dragClick() { - if (d3_behavior_dragStopClick && d3_behavior_dragEventTarget === d3.event.target) { - d3_behavior_dragCancel(); - d3_behavior_dragStopClick = false; - d3_behavior_dragEventTarget = null; - } -} - -function d3_behavior_dragCancel() { - d3.event.stopPropagation(); - d3.event.preventDefault(); -} -// TODO unbind zoom behavior? -// TODO unbind listener? -d3.behavior.zoom = function() { - var xyz = [0, 0, 0], - event = d3.dispatch("zoom"); - - function zoom() { - this - .on("mousedown.zoom", mousedown) - .on("mousewheel.zoom", mousewheel) - .on("DOMMouseScroll.zoom", mousewheel) - .on("dblclick.zoom", dblclick) - .on("touchstart.zoom", touchstart); - - d3.select(window) - .on("mousemove.zoom", d3_behavior_zoomMousemove) - .on("mouseup.zoom", d3_behavior_zoomMouseup) - .on("touchmove.zoom", d3_behavior_zoomTouchmove) - .on("touchend.zoom", d3_behavior_zoomTouchup) - .on("click.zoom", d3_behavior_zoomClick, true); - } - - // snapshot the local context for subsequent dispatch - function start() { - d3_behavior_zoomXyz = xyz; - d3_behavior_zoomDispatch = event.zoom.dispatch; - d3_behavior_zoomEventTarget = d3.event.target; - d3_behavior_zoomTarget = this; - d3_behavior_zoomArguments = arguments; - } - - function mousedown() { - start.apply(this, arguments); - d3_behavior_zoomPanning = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomMoved = false; - d3.event.preventDefault(); - window.focus(); - } - - // store starting mouse location - function mousewheel() { - start.apply(this, arguments); - if (!d3_behavior_zoomZooming) d3_behavior_zoomZooming = d3_behavior_zoomLocation(d3.svg.mouse(d3_behavior_zoomTarget)); - d3_behavior_zoomTo(d3_behavior_zoomDelta() + xyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomZooming); - } - - function dblclick() { - start.apply(this, arguments); - var mouse = d3.svg.mouse(d3_behavior_zoomTarget); - d3_behavior_zoomTo(d3.event.shiftKey ? Math.ceil(xyz[2] - 1) : Math.floor(xyz[2] + 1), mouse, d3_behavior_zoomLocation(mouse)); - } - - // doubletap detection - function touchstart() { - start.apply(this, arguments); - var touches = d3_behavior_zoomTouchup(), - touch, - now = Date.now(); - if ((touches.length === 1) && (now - d3_behavior_zoomLast < 300)) { - d3_behavior_zoomTo(1 + Math.floor(xyz[2]), touch = touches[0], d3_behavior_zoomLocations[touch.identifier]); - } - d3_behavior_zoomLast = now; - } - - zoom.on = function(type, listener) { - event[type].add(listener); - return zoom; - }; - - return zoom; -}; - -var d3_behavior_zoomDiv, - d3_behavior_zoomPanning, - d3_behavior_zoomZooming, - d3_behavior_zoomLocations = {}, // identifier -> location - d3_behavior_zoomLast = 0, - d3_behavior_zoomXyz, - d3_behavior_zoomDispatch, - d3_behavior_zoomEventTarget, - d3_behavior_zoomTarget, - d3_behavior_zoomArguments, - d3_behavior_zoomMoved, - d3_behavior_zoomStopClick; - -function d3_behavior_zoomLocation(point) { - return [ - point[0] - d3_behavior_zoomXyz[0], - point[1] - d3_behavior_zoomXyz[1], - d3_behavior_zoomXyz[2] - ]; -} - -// detect the pixels that would be scrolled by this wheel event -function d3_behavior_zoomDelta() { - - // mousewheel events are totally broken! - // https://bugs.webkit.org/show_bug.cgi?id=40441 - // not only that, but Chrome and Safari differ in re. to acceleration! - if (!d3_behavior_zoomDiv) { - d3_behavior_zoomDiv = d3.select("body").append("div") - .style("visibility", "hidden") - .style("top", 0) - .style("height", 0) - .style("width", 0) - .style("overflow-y", "scroll") - .append("div") - .style("height", "2000px") - .node().parentNode; - } - - var e = d3.event, delta; - try { - d3_behavior_zoomDiv.scrollTop = 1000; - d3_behavior_zoomDiv.dispatchEvent(e); - delta = 1000 - d3_behavior_zoomDiv.scrollTop; - } catch (error) { - delta = e.wheelDelta || (-e.detail * 5); - } - - return delta * .005; -} - -// Note: Since we don't rotate, it's possible for the touches to become -// slightly detached from their original positions. Thus, we recompute the -// touch points on touchend as well as touchstart! -function d3_behavior_zoomTouchup() { - var touches = d3.svg.touches(d3_behavior_zoomTarget), - i = -1, - n = touches.length, - touch; - while (++i < n) d3_behavior_zoomLocations[(touch = touches[i]).identifier] = d3_behavior_zoomLocation(touch); - return touches; -} - -function d3_behavior_zoomTouchmove() { - var touches = d3.svg.touches(d3_behavior_zoomTarget); - switch (touches.length) { - - // single-touch pan - case 1: { - var touch = touches[0]; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], touch, d3_behavior_zoomLocations[touch.identifier]); - break; - } - - // double-touch pan + zoom - case 2: { - var p0 = touches[0], - p1 = touches[1], - p2 = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2], - l0 = d3_behavior_zoomLocations[p0.identifier], - l1 = d3_behavior_zoomLocations[p1.identifier], - l2 = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2, l0[2]]; - d3_behavior_zoomTo(Math.log(d3.event.scale) / Math.LN2 + l0[2], p2, l2); - break; - } - } -} - -function d3_behavior_zoomMousemove() { - d3_behavior_zoomZooming = null; - if (d3_behavior_zoomPanning) { - d3_behavior_zoomMoved = true; - d3_behavior_zoomTo(d3_behavior_zoomXyz[2], d3.svg.mouse(d3_behavior_zoomTarget), d3_behavior_zoomPanning); - } -} - -function d3_behavior_zoomMouseup() { - if (d3_behavior_zoomPanning) { - if (d3_behavior_zoomMoved && d3_behavior_zoomEventTarget === d3.event.target) { - d3_behavior_zoomStopClick = true; - } - d3_behavior_zoomMousemove(); - d3_behavior_zoomPanning = null; - } -} - -function d3_behavior_zoomClick() { - if (d3_behavior_zoomStopClick && d3_behavior_zoomEventTarget === d3.event.target) { - d3.event.stopPropagation(); - d3.event.preventDefault(); - d3_behavior_zoomStopClick = false; - d3_behavior_zoomEventTarget = null; - } -} - -function d3_behavior_zoomTo(z, x0, x1) { - var K = Math.pow(2, (d3_behavior_zoomXyz[2] = z) - x1[2]), - x = d3_behavior_zoomXyz[0] = x0[0] - K * x1[0], - y = d3_behavior_zoomXyz[1] = x0[1] - K * x1[1], - o = d3.event, // Events can be reentrant (e.g., focus). - k = Math.pow(2, z); - - d3.event = { - scale: k, - translate: [x, y], - transform: function(sx, sy) { - if (sx) transform(sx, x); - if (sy) transform(sy, y); - } - }; - - function transform(scale, o) { - var domain = scale.__domain || (scale.__domain = scale.domain()), - range = scale.range().map(function(v) { return (v - o) / k; }); - scale.domain(domain).domain(range.map(scale.invert)); - } - - try { - d3_behavior_zoomDispatch.apply(d3_behavior_zoomTarget, d3_behavior_zoomArguments); - } finally { - d3.event = o; - } - - o.preventDefault(); -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js deleted file mode 100644 index f812247e2f4..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.layout.js +++ /dev/null @@ -1,1892 +0,0 @@ -(function(){d3.layout = {}; -// Implements hierarchical edge bundling using Holten's algorithm. For each -// input link, a path is computed that travels through the tree, up the parent -// hierarchy to the least common ancestor, and then back down to the destination -// node. Each path is simply an array of nodes. -d3.layout.bundle = function() { - return function(links) { - var paths = [], - i = -1, - n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; -}; - -function d3_layout_bundlePath(link) { - var start = link.source, - end = link.target, - lca = d3_layout_bundleLeastCommonAncestor(start, end), - points = [start]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; -} - -function d3_layout_bundleAncestors(node) { - var ancestors = [], - parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; -} - -function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), - bNodes = d3_layout_bundleAncestors(b), - aNode = aNodes.pop(), - bNode = bNodes.pop(), - sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; -} -d3.layout.chord = function() { - var chord = {}, - chords, - groups, - matrix, - n, - padding = 0, - sortGroups, - sortSubgroups, - sortChords; - - function relayout() { - var subgroups = {}, - groupSums = [], - groupIndex = d3.range(n), - subgroupIndex = [], - k, - x, - x0, - i, - j; - - chords = []; - groups = []; - - // Compute the sum. - k = 0, i = -1; while (++i < n) { - x = 0, j = -1; while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - - // Sort groups… - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - - // Sort subgroups… - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - - // Convert the sum to scaling factor for [0, 2pi]. - // TODO Allow start and end angle to be specified. - // TODO Allow padding to be specified as percentage? - k = (2 * Math.PI - padding * n) / k; - - // Compute the start and end angle for each group and subgroup. - x = 0, i = -1; while (++i < n) { - x0 = x, j = -1; while (++j < n) { - var di = groupIndex[i], - dj = subgroupIndex[di][j], - v = matrix[di][dj]; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: x, - endAngle: x += v * k, - value: v - }; - } - groups.push({ - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }); - x += padding; - } - - // Generate chords for each (non-empty) subgroup-subgroup link. - i = -1; while (++i < n) { - j = i - 1; while (++j < n) { - var source = subgroups[i + "-" + j], - target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value - ? {source: target, target: source} - : {source: source, target: target}); - } - } - } - - if (sortChords) resort(); - } - - function resort() { - chords.sort(function(a, b) { - return sortChords( - (a.source.value + a.target.value) / 2, - (b.source.value + b.target.value) / 2); - }); - } - - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - - return chord; -}; -// A rudimentary force layout using Gauss-Seidel. -d3.layout.force = function() { - var force = {}, - event = d3.dispatch("tick"), - size = [1, 1], - drag, - alpha, - friction = .9, - linkDistance = d3_layout_forceLinkDistance, - linkStrength = d3_layout_forceLinkStrength, - charge = -30, - gravity = .1, - theta = .8, - interval, - nodes = [], - links = [], - distances, - strengths, - charges; - - function repulse(node) { - return function(quad, x1, y1, x2, y2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, - dy = quad.cy - node.y, - dn = 1 / Math.sqrt(dx * dx + dy * dy); - - /* Barnes-Hut criterion. */ - if ((x2 - x1) * dn < theta) { - var k = quad.charge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - - if (quad.point && isFinite(dn)) { - var k = quad.pointCharge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - - function tick() { - var n = nodes.length, - m = links.length, - q, - i, // current index - o, // current object - s, // current source - t, // current target - l, // current distance - k, // current force - x, // x-distance - y; // y-distance - - // gauss-seidel relaxation for links - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = (x * x + y * y)) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - - // apply gravity forces - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - - // compute quadtree center of mass and apply charge forces - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - - // position verlet integration - i = -1; while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - - event.tick.dispatch({type: "tick", alpha: alpha}); - - // simulated annealing, basically - return (alpha *= .99) < .005; - } - - force.on = function(type, listener) { - event[type].add(listener); - return force; - }; - - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3.functor(x); - return force; - }; - - // For backwards-compatibility. - force.distance = force.linkDistance; - - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3.functor(x); - return force; - }; - - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - - force.start = function() { - var i, - j, - n = nodes.length, - m = links.length, - w = size[0], - h = size[1], - neighbors, - o; - - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - - charges = []; - if (typeof charge === "function") { - for (i = 0; i < n; ++i) { - charges[i] = +charge.call(this, nodes[i], i); - } - } else { - for (i = 0; i < n; ++i) { - charges[i] = charge; - } - } - - // initialize node position based on first neighbor - function position(dimension, size) { - var neighbors = neighbor(i), - j = -1, - m = neighbors.length, - x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - - // initialize neighbors lazily - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - - return force.resume(); - }; - - force.resume = function() { - alpha = .1; - d3.timer(tick); - return force; - }; - - force.stop = function() { - alpha = 0; - return force; - }; - - // use `node.call(force.drag)` to make nodes draggable - force.drag = function() { - if (!drag) drag = d3.behavior.drag() - .on("dragstart", dragstart) - .on("drag", d3_layout_forceDrag) - .on("dragend", d3_layout_forceDragEnd); - - this.on("mouseover.force", d3_layout_forceDragOver) - .on("mouseout.force", d3_layout_forceDragOut) - .call(drag); - }; - - function dragstart(d) { - d3_layout_forceDragOver(d3_layout_forceDragNode = d); - d3_layout_forceDragForce = force; - } - - return force; -}; - -var d3_layout_forceDragForce, - d3_layout_forceDragNode; - -function d3_layout_forceDragOver(d) { - d.fixed |= 2; -} - -function d3_layout_forceDragOut(d) { - if (d !== d3_layout_forceDragNode) d.fixed &= 1; -} - -function d3_layout_forceDragEnd() { - d3_layout_forceDrag(); - d3_layout_forceDragNode.fixed &= 1; - d3_layout_forceDragForce = d3_layout_forceDragNode = null; -} - -function d3_layout_forceDrag() { - d3_layout_forceDragNode.px += d3.event.dx; - d3_layout_forceDragNode.py += d3.event.dy; - d3_layout_forceDragForce.resume(); // restart annealing -} - -function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, - cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, - n = nodes.length, - i = -1, - c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - // jitter internal nodes that are coincident - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; -} - -function d3_layout_forceLinkDistance(link) { - return 20; -} - -function d3_layout_forceLinkStrength(link) { - return 1; -} -d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), - size = [1, 1]; // width, height - - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, - n, - c, - d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - - function depth(node) { - var children = node.children, - d = 0; - if (children && (n = children.length)) { - var i = -1, - n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - - return d3_layout_hierarchyRebind(partition, hierarchy); -}; -d3.layout.pie = function() { - var value = Number, - sort = null, - startAngle = 0, - endAngle = 2 * Math.PI; - - function pie(data, i) { - - // Compute the start angle. - var a = +(typeof startAngle === "function" - ? startAngle.apply(this, arguments) - : startAngle); - - // Compute the angular range (end - start). - var k = (typeof endAngle === "function" - ? endAngle.apply(this, arguments) - : endAngle) - startAngle; - - // Optionally sort the data. - var index = d3.range(data.length); - if (sort != null) index.sort(function(i, j) { - return sort(data[i], data[j]); - }); - - // Compute the numeric values for each data element. - var values = data.map(value); - - // Convert k into a scale factor from value to angle, using the sum. - k /= values.reduce(function(p, d) { return p + d; }, 0); - - // Compute the arcs! - var arcs = index.map(function(i) { - return { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - - // Return the arcs in the original data's order. - return data.map(function(d, i) { - return arcs[index[i]]; - }); - } - - /** - * Specifies the value function *x*, which returns a nonnegative numeric value - * for each datum. The default value function is `Number`. The value function - * is passed two arguments: the current datum and the current index. - */ - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - - /** - * Specifies a sort comparison operator *x*. The comparator is passed two data - * elements from the data array, a and b; it returns a negative value if a is - * less than b, a positive value if a is greater than b, and zero if a equals - * b. - */ - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - - /** - * Specifies the overall start angle of the pie chart. Defaults to 0. The - * start angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - - /** - * Specifies the overall end angle of the pie chart. Defaults to 2π. The - * end angle can be specified either as a constant or as a function; in the - * case of a function, it is evaluated once per array (as opposed to per - * element). - */ - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - - return pie; -}; -// data is two-dimensional array of x,y; we populate y0 -d3.layout.stack = function() { - var values = Object, - order = d3_layout_stackOrders["default"], - offset = d3_layout_stackOffsets["zero"], - out = d3_layout_stackOut, - x = d3_layout_stackX, - y = d3_layout_stackY; - - function stack(data, index) { - - // Convert series to canonical two-dimensional representation. - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - - // Convert each series to canonical [[x,y]] representation. - var points = series.map(function(d, i) { - return d.map(function(v, i) { - return [x.call(stack, v, i), y.call(stack, v, i)]; - }); - }); - - // Compute the order of series, and permute them. - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - - // Compute the baseline… - var offsets = offset.call(stack, points, index); - - // And propagate it to other series. - var n = series.length, - m = series[0].length, - i, - j, - o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - - return data; - } - - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders[x]; - return stack; - }; - - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets[x]; - return stack; - }; - - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - - return stack; -} - -function d3_layout_stackX(d) { - return d.x; -} - -function d3_layout_stackY(d) { - return d.y; -} - -function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; -} - -var d3_layout_stackOrders = { - - "inside-out": function(data) { - var n = data.length, - i, - j, - max = data.map(d3_layout_stackMaxIndex), - sums = data.map(d3_layout_stackReduceSum), - index = d3.range(n).sort(function(a, b) { return max[a] - max[b]; }), - top = 0, - bottom = 0, - tops = [], - bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - - "reverse": function(data) { - return d3.range(data.length).reverse(); - }, - - "default": function(data) { - return d3.range(data.length); - } - -}; - -var d3_layout_stackOffsets = { - - "silhouette": function(data) { - var n = data.length, - m = data[0].length, - sums = [], - max = 0, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - - "wiggle": function(data) { - var n = data.length, - x = data[0], - m = x.length, - max = 0, - i, - j, - k, - s1, - s2, - s3, - dx, - o, - o0, - y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - - "expand": function(data) { - var n = data.length, - m = data[0].length, - k = 1 / n, - i, - j, - o, - y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; - else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - - "zero": function(data) { - var j = -1, - m = data[0].length, - y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - -}; - -function d3_layout_stackMaxIndex(array) { - var i = 1, - j = 0, - v = array[0][1], - k, - n = array.length; - for (; i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; -} - -function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); -} - -function d3_layout_stackSum(p, d) { - return p + d[1]; -} -d3.layout.histogram = function() { - var frequency = true, - valuer = Number, - ranger = d3_layout_histogramRange, - binner = d3_layout_histogramBinSturges; - - function histogram(data, i) { - var bins = [], - values = data.map(valuer, this), - range = ranger.call(this, values, i), - thresholds = binner.call(this, range, values, i), - bin, - i = -1, - n = values.length, - m = thresholds.length - 1, - k = frequency ? 1 : 1 / n, - x; - - // Initialize the bins. - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - - // Fill the bins, ignoring values outside the range. - i = -1; while(++i < n) { - x = values[i]; - if ((x >= range[0]) && (x <= range[1])) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - - return bins; - } - - // Specifies how to extract a value from the associated data. The default - // value function is `Number`, which is equivalent to the identity function. - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - - // Specifies the range of the histogram. Values outside the specified range - // will be ignored. The argument `x` may be specified either as a two-element - // array representing the minimum and maximum value of the range, or as a - // function that returns the range given the array of values and the current - // index `i`. The default range is the extent (minimum and maximum) of the - // values. - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3.functor(x); - return histogram; - }; - - // Specifies how to bin values in the histogram. The argument `x` may be - // specified as a number, in which case the range of values will be split - // uniformly into the given number of bins. Or, `x` may be an array of - // threshold values, defining the bins; the specified array must contain the - // rightmost (upper) value, thus specifying n + 1 values for n bins. Or, `x` - // may be a function which is evaluated, being passed the range, the array of - // values, and the current index `i`, returning an array of thresholds. The - // default bin function will divide the values into uniform bins using - // Sturges' formula. - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" - ? function(range) { return d3_layout_histogramBinFixed(range, x); } - : d3.functor(x); - return histogram; - }; - - // Specifies whether the histogram's `y` value is a count (frequency) or a - // probability (density). The default value is true. - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - - return histogram; -}; - -function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); -} - -function d3_layout_histogramBinFixed(range, n) { - var x = -1, - b = +range[0], - m = (range[1] - b) / n, - f = []; - while (++x <= n) f[x] = m * x + b; - return f; -} - -function d3_layout_histogramRange(values) { - return [d3.min(values), d3.max(values)]; -} -d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, - children = d3_layout_hierarchyChildren, - value = d3_layout_hierarchyValue; - - // Recursively compute the node depth and value. - // Also converts the data representation into a standard hierarchy structure. - function recurse(data, depth, nodes) { - var childs = children.call(hierarchy, data, depth), - node = d3_layout_hierarchyInline ? data : {data: data}; - node.depth = depth; - nodes.push(node); - if (childs && (n = childs.length)) { - var i = -1, - n, - c = node.children = [], - v = 0, - j = depth + 1; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, data, depth) || 0; - } - return node; - } - - // Recursively re-evaluates the node value. - function revalue(node, depth) { - var children = node.children, - v = 0; - if (children && (n = children.length)) { - var i = -1, - n, - j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, d3_layout_hierarchyInline ? node : node.data, depth) || 0; - } - if (value) node.value = v; - return v; - } - - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - - // Re-evaluates the `value` property for the specified hierarchy. - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - - return hierarchy; -}; - -// A method assignment helper for hierarchy subclasses. -function d3_layout_hierarchyRebind(object, hierarchy) { - object.sort = d3.rebind(object, hierarchy.sort); - object.children = d3.rebind(object, hierarchy.children); - object.links = d3_layout_hierarchyLinks; - object.value = d3.rebind(object, hierarchy.value); - - // If the new API is used, enabling inlining. - object.nodes = function(d) { - d3_layout_hierarchyInline = true; - return (object.nodes = object)(d); - }; - - return object; -} - -function d3_layout_hierarchyChildren(d) { - return d.children; -} - -function d3_layout_hierarchyValue(d) { - return d.value; -} - -function d3_layout_hierarchySort(a, b) { - return b.value - a.value; -} - -// Returns an array source+target objects for the specified nodes. -function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return {source: parent, target: child}; - }); - })); -} - -// For backwards-compatibility, don't enable inlining by default. -var d3_layout_hierarchyInline = false; -d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), - size = [1, 1]; - - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - // Recursively compute the layout. - root.x = 0; - root.y = 0; - d3_layout_packTree(root); - - // Scale the layout to fit the requested size. - var w = size[0], - h = size[1], - k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); - d3_layout_packTransform(root, w / 2, h / 2, k); - - return nodes; - } - - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - - return d3_layout_hierarchyRebind(pack, hierarchy); -}; - -function d3_layout_packSort(a, b) { - return a.value - b.value; -} - -function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; -} - -function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; -} - -function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, - dy = b.y - a.y, - dr = a.r + b.r; - return (dr * dr - dx * dx - dy * dy) > .001; // within epsilon -} - -function d3_layout_packCircle(nodes) { - var xMin = Infinity, - xMax = -Infinity, - yMin = Infinity, - yMax = -Infinity, - n = nodes.length, - a, b, c, j, k; - - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - - // Create node links. - nodes.forEach(d3_layout_packLink); - - // Create first node. - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - - // Create second node. - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - - // Create third node and build chain. - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - - // Now iterate through the rest. - for (var i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - - // Search for the closest intersection. - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - if (s2 < s1) { - isect = -1; - j = k; - } - break; - } - } - } - - // Update node chain. - if (isect == 0) { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } else if (isect > 0) { - d3_layout_packSplice(a, j); - b = j; - i--; - } else { // isect < 0 - d3_layout_packSplice(j, b); - a = j; - i--; - } - } - } - } - - // Re-center the circles and return the encompassing radius. - var cx = (xMin + xMax) / 2, - cy = (yMin + yMax) / 2, - cr = 0; - for (var i = 0; i < n; i++) { - var node = nodes[i]; - node.x -= cx; - node.y -= cy; - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); - } - - // Remove node links. - nodes.forEach(d3_layout_packUnlink); - - return cr; -} - -function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; -} - -function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; -} - -function d3_layout_packTree(node) { - var children = node.children; - if (children && children.length) { - children.forEach(d3_layout_packTree); - node.r = d3_layout_packCircle(children); - } else { - node.r = Math.sqrt(node.value); - } -} - -function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = (x += k * node.x); - node.y = (y += k * node.y); - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } -} - -function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, - dx = b.x - a.x, - dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, - dc = Math.sqrt(dx * dx + dy * dy), - cos = Math.max(-1, Math.min(1, (db * db + dc * dc - da * da) / (2 * db * dc))), - theta = Math.acos(cos), - x = cos * (db /= dc), - y = Math.sin(theta) * db; - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } -} -// Implements a hierarchical layout using the cluster (or dendogram) algorithm. -d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0], - previousNode, - x = 0, - kx, - ky; - - // First walk, computing the initial x & y values. - d3_layout_treeVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_clusterLeft(root), - right = d3_layout_clusterRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; - - // Second walk, normalizing x & y to the desired size. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - node.y / root.y) * size[1]; - }); - - return nodes; - } - - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - - return d3_layout_hierarchyRebind(cluster, hierarchy); -}; - -function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); -} - -function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; -} - -function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; -} - -function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; -} -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), - separation = d3_layout_treeSeparation, - size = [1, 1]; // width, height - - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), - root = nodes[0]; - - function firstWalk(node, previousSibling) { - var children = node.children, - layout = node._tree; - if (children && (n = children.length)) { - var n, - firstChild = children[0], - previousChild, - ancestor = firstChild, - child, - i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children && (n = children.length)) { - var i = -1, - n; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, - vop = node, - vim = previousSibling, - vom = node.parent.children[0], - sip = vip._tree.mod, - sop = vop._tree.mod, - sim = vim._tree.mod, - som = vom._tree.mod, - shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - - // Initialize temporary layout variables. - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - - // Compute the layout using Buchheim et al.'s algorithm. - firstWalk(root); - secondWalk(root, -root._tree.prelim); - - // Compute the left-most, right-most, and depth-most nodes for extents. - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), - right = d3_layout_treeSearch(root, d3_layout_treeRightmost), - deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2, - y1 = deep.depth || 1; - - // Clear temporary layout variables; transform x and y. - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - - return nodes; - } - - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - - return d3_layout_hierarchyRebind(tree, hierarchy); -}; - -function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; -} - -// function d3_layout_treeSeparationRadial(a, b) { -// return (a.parent == b.parent ? 1 : 2) / a.depth; -// } - -function d3_layout_treeLeft(node) { - var children = node.children; - return children && children.length ? children[0] : node._tree.thread; -} - -function d3_layout_treeRight(node) { - var children = node.children, - n; - return children && (n = children.length) ? children[n - 1] : node._tree.thread; -} - -function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children && (n = children.length)) { - var child, - n, - i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; -} - -function d3_layout_treeRightmost(a, b) { - return a.x - b.x; -} - -function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; -} - -function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; -} - -function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children && (n = children.length)) { - var child, - previousChild = null, - i = -1, - n; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); -} - -function d3_layout_treeShift(node) { - var shift = 0, - change = 0, - children = node.children, - i = children.length, - child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } -} - -function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; -} - -function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent - ? vim._tree.ancestor - : ancestor; -} -// Squarified Treemaps by Mark Bruls, Kees Huizing, and Jarke J. van Wijk -// Modified to support a target aspect ratio by Jeff Heer -d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), - round = Math.round, - size = [1, 1], // width, height - padding = null, - pad = d3_layout_treemapPadNull, - sticky = false, - stickies, - ratio = 0.5 * (1 + Math.sqrt(5)); // golden ratio - - // Compute the area for each child based on value & scale. - function scale(children, k) { - var i = -1, - n = children.length, - child, - area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - - // Recursively arranges the specified node's children into squarified rows. - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - row = [], - remaining = children.slice(), // copy-on-write - child, - best = Infinity, // the best row score so far - score, // the current row score - u = Math.min(rect.dx, rect.dy), // initial orientation - n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if ((score = worst(row, u)) <= best) { // continue with this orientation - remaining.pop(); - best = score; - } else { // abort, and try a different orientation - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - - // Recursively resizes the specified node's children into existing rows. - // Preserves the existing layout! - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), - remaining = children.slice(), // copy-on-write - child, - row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - - // Computes the score for the specified row, as the worst aspect ratio. - function worst(row, u) { - var s = row.area, - r, - rmax = 0, - rmin = Infinity, - i = -1, - n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s - ? Math.max((u * rmax * ratio) / s, s / (u * rmin * ratio)) - : Infinity; - } - - // Positions the specified row of nodes. Modifies `rect`. - function position(row, u, rect, flush) { - var i = -1, - n = row.length, - x = rect.x, - y = rect.y, - v = u ? round(row.area / u) : 0, - o; - if (u == rect.dx) { // horizontal subdivision - if (flush || v > rect.dy) v = v ? rect.dy : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = v ? round(o.area / v) : 0; - } - o.z = true; - o.dx += rect.x + rect.dx - x; // rounding error - rect.y += v; - rect.dy -= v; - } else { // vertical subdivision - if (flush || v > rect.dx) v = v ? rect.dx : 0; // over+underflow - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = v ? round(o.area / v) : 0; - } - o.z = false; - o.dy += rect.y + rect.dy - y; // rounding error - rect.x += v; - rect.dx -= v; - } - } - - function treemap(d) { - var nodes = stickies || hierarchy(d), - root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([root], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - - treemap.padding = function(x) { - if (!arguments.length) return padding; - - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null - ? d3_layout_treemapPadNull(node) - : d3_layout_treemapPad(node, typeof p === "number" ? [p, p, p, p] : p); - } - - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull - : (type = typeof x) === "function" ? padFunction - : type === "number" ? (x = [x, x, x, x], padConstant) - : padConstant; - return treemap; - }; - - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - - return d3_layout_hierarchyRebind(treemap, hierarchy); -}; - -function d3_layout_treemapPadNull(node) { - return {x: node.x, y: node.y, dx: node.dx, dy: node.dy}; -} - -function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], - y = node.y + padding[0], - dx = node.dx - padding[1] - padding[3], - dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { x += dx / 2; dx = 0; } - if (dy < 0) { y += dy / 2; dy = 0; } - return {x: x, y: y, dx: dx, dy: dy}; -} -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js deleted file mode 100644 index e1c0831c88e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/d3/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js deleted file mode 100644 index 54e90e13fbf..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.js +++ /dev/null @@ -1,4049 +0,0 @@ -/* -Copyright (c) 2012 Chris Pettitt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -(function() { - dagre = {}; -dagre.version = "0.0.6"; -/* - * Directed multi-graph used during layout. - */ -dagre.graph = {}; - -/* - * Creates a new directed multi-graph. This should be invoked with - * `var g = dagre.graph()` and _not_ `var g = new dagre.graph()`. - */ -dagre.graph = function() { - var nodes = {}, - inEdges = {}, - outEdges = {}, - edges = {}, - graph = {}, - idCounter = 0; - - graph.addNode = function(u, value) { - if (graph.hasNode(u)) { - throw new Error("Graph already has node '" + u + "':\n" + graph.toString()); - } - nodes[u] = { id: u, value: value }; - inEdges[u] = {}; - outEdges[u] = {}; - } - - graph.delNode = function(u) { - strictGetNode(u); - - graph.edges(u).forEach(function(e) { graph.delEdge(e); }); - - delete inEdges[u]; - delete outEdges[u]; - delete nodes[u]; - } - - graph.node = function(u) { - return strictGetNode(u).value; - } - - graph.hasNode = function(u) { - return u in nodes; - } - - graph.addEdge = function(e, source, target, value) { - strictGetNode(source); - strictGetNode(target); - - if (e === null) { - e = "_ANON-" + ++idCounter; - } - else if (graph.hasEdge(e)) { - throw new Error("Graph already has edge '" + e + "':\n" + graph.toString()); - } - - edges[e] = { id: e, source: source, target: target, value: value }; - addEdgeToMap(inEdges[target], source, e); - addEdgeToMap(outEdges[source], target, e); - } - - graph.delEdge = function(e) { - var edge = strictGetEdge(e); - delEdgeFromMap(inEdges[edge.target], edge.source, e) - delEdgeFromMap(outEdges[edge.source], edge.target, e) - delete edges[e]; - } - - graph.edge = function(e) { - return strictGetEdge(e).value; - } - - graph.source = function(e) { - return strictGetEdge(e).source; - } - - graph.target = function(e) { - return strictGetEdge(e).target; - } - - graph.hasEdge = function(e) { - return e in edges; - } - - graph.successors = function(u) { - strictGetNode(u); - return keys(outEdges[u]).map(function(v) { return nodes[v].id; }); - } - - graph.predecessors = function(u) { - strictGetNode(u); - return keys(inEdges[u]).map(function(v) { return nodes[v].id; }); - } - - graph.neighbors = function(u) { - strictGetNode(u); - var vs = {}; - keys(outEdges[u]).map(function(v) { vs[v] = true; }); - keys(inEdges[u]).map(function(v) { vs[v] = true; }); - return keys(vs).map(function(v) { return nodes[v].id; }); - } - - graph.nodes = function() { - var nodes = []; - graph.eachNode(function(id, _) { nodes.push(id); }); - return nodes; - } - - graph.eachNode = function(func) { - for (var k in nodes) { - var node = nodes[k]; - func(node.id, node.value); - } - } - - /* - * Return all edges with no arguments, - * the ones that are incident on a node (one argument), - * or all edges from a source to a target (two arguments) - */ - graph.edges = function(u, v) { - var es, sourceEdges; - if (!arguments.length) { - es = []; - graph.eachEdge(function(id) { es.push(id); }); - return es; - } else if (arguments.length === 1) { - return union([graph.inEdges(u), graph.outEdges(u)]); - } else if (arguments.length === 2) { - strictGetNode(u); - strictGetNode(v); - sourceEdges = outEdges[u]; - es = (v in sourceEdges) ? keys(sourceEdges[v].edges) : []; - return es.map(function(e) { return edges[e].id }); - } - }; - - graph.eachEdge = function(func) { - for (var k in edges) { - var edge = edges[k]; - func(edge.id, edge.source, edge.target, edge.value); - } - } - - /* - * Return all in edges to a target node - */ - graph.inEdges = function(target) { - strictGetNode(target); - return concat(values(inEdges[target]).map(function(es) { return keys(es.edges); })); - }; - - /* - * Return all out edges from a source node - */ - graph.outEdges = function(source) { - strictGetNode(source); - return concat(values(outEdges[source]).map(function(es) { return keys(es.edges); })); - }; - - graph.subgraph = function(us) { - var g = dagre.graph(); - us.forEach(function(u) { - g.addNode(u, graph.node(u)); - }); - values(edges).forEach(function(e) { - if (g.hasNode(e.source) && g.hasNode(e.target)) { - g.addEdge(e.id, e.source, e.target, graph.edge(e.id)); - } - }); - return g; - }; - - graph.toString = function() { - var str = "GRAPH:\n"; - str += " Nodes:\n"; - keys(nodes).forEach(function(u) { - str += " " + u + ": " + JSON.stringify(nodes[u].value) + "\n"; - }); - str += " Edges:\n"; - keys(edges).forEach(function(e) { - var edge = edges[e]; - str += " " + e + " (" + edge.source + " -> " + edge.target + "): " + JSON.stringify(edges[e].value) + "\n"; - }); - return str; - }; - - function addEdgeToMap(map, v, e) { - var vEntry = map[v]; - if (!vEntry) { - vEntry = map[v] = { count: 0, edges: {} }; - } - vEntry.count++; - vEntry.edges[e] = true; - } - - function delEdgeFromMap(map, v, e) { - var vEntry = map[v]; - if (--vEntry.count == 0) { - delete map[v]; - } else { - delete vEntry.edges[e]; - } - } - - function strictGetNode(u) { - var node = nodes[u]; - if (!(u in nodes)) { - throw new Error("Node '" + u + "' is not in graph:\n" + graph.toString()); - } - return node; - } - - function strictGetEdge(e) { - var edge = edges[e]; - if (!edge) { - throw new Error("Edge '" + e + "' is not in graph:\n" + graph.toString()); - } - return edge; - } - - return graph; -} -dagre.layout = function() { - // External configuration - var config = { - // Nodes to lay out. At minimum must have `width` and `height` attributes. - nodes: [], - // Edges to lay out. At mimimum must have `source` and `target` attributes. - edges: [], - // How much debug information to include? - debugLevel: 0, - }; - - var timer = createTimer(); - - // Phase functions - var - acyclic = dagre.layout.acyclic(), - rank = dagre.layout.rank(), - order = dagre.layout.order(), - position = dagre.layout.position(); - - // This layout object - var self = {}; - - self.nodes = propertyAccessor(self, config, "nodes"); - self.edges = propertyAccessor(self, config, "edges"); - - self.orderIters = delegateProperty(order.iterations); - - self.nodeSep = delegateProperty(position.nodeSep); - self.edgeSep = delegateProperty(position.edgeSep); - self.universalSep = delegateProperty(position.universalSep); - self.rankSep = delegateProperty(position.rankSep); - self.rankDir = delegateProperty(position.rankDir); - self.debugAlignment = delegateProperty(position.debugAlignment); - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - acyclic.debugLevel(x); - rank.debugLevel(x); - order.debugLevel(x); - position.debugLevel(x); - }); - - self.run = timer.wrap("Total layout", run); - - return self; - - // Build graph and save mapping of generated ids to original nodes and edges - function init() { - var g = dagre.graph(); - var nextId = 0; - - // Tag each node so that we can properly represent relationships when - // we add edges. Also copy relevant dimension information. - config.nodes.forEach(function(u) { - var id = "id" in u ? u.id : "_N" + nextId++; - u.dagre = { id: id, width: u.width, height: u.height }; - g.addNode(id, u.dagre); - }); - - config.edges.forEach(function(e) { - var source = e.source.dagre.id; - if (!g.hasNode(source)) { - throw new Error("Source node for '" + e + "' not in node list"); - } - - var target = e.target.dagre.id; - if (!g.hasNode(target)) { - throw new Error("Target node for '" + e + "' not in node list"); - } - - e.dagre = { - points: [] - }; - - // Track edges that aren't self loops - layout does nothing for self - // loops, so they can be skipped. - if (source !== target) { - var id = "id" in e ? e.id : "_E" + nextId++; - e.dagre.id = id; - e.dagre.minLen = e.minLen || 1; - e.dagre.width = e.width || 0; - e.dagre.height = e.height || 0; - g.addEdge(id, source, target, e.dagre); - } - }); - - return g; - } - - function run () { - var rankSep = self.rankSep(); - try { - if (!config.nodes.length) { - return; - } - - // Build internal graph - var g = init(); - - // Make space for edge labels - g.eachEdge(function(e, s, t, a) { - a.minLen *= 2; - }); - self.rankSep(rankSep / 2); - - // Reverse edges to get an acyclic graph, we keep the graph in an acyclic - // state until the very end. - acyclic.run(g); - - // Determine the rank for each node. Nodes with a lower rank will appear - // above nodes of higher rank. - rank.run(g); - - // Normalize the graph by ensuring that every edge is proper (each edge has - // a length of 1). We achieve this by adding dummy nodes to long edges, - // thus shortening them. - normalize(g); - - // Order the nodes so that edge crossings are minimized. - order.run(g); - - // Find the x and y coordinates for every node in the graph. - position.run(g); - - // De-normalize the graph by removing dummy nodes and augmenting the - // original long edges with coordinate information. - undoNormalize(g); - - // Reverses points for edges that are in a reversed state. - fixupEdgePoints(g); - - // Reverse edges that were revered previously to get an acyclic graph. - acyclic.undo(g); - } finally { - self.rankSep(rankSep); - } - - return self; - } - - // Assumes input graph has no self-loops and is otherwise acyclic. - function normalize(g) { - var dummyCount = 0; - g.eachEdge(function(e, s, t, a) { - var sourceRank = g.node(s).rank; - var targetRank = g.node(t).rank; - if (sourceRank + 1 < targetRank) { - for (var u = s, rank = sourceRank + 1, i = 0; rank < targetRank; ++rank, ++i) { - var v = "_D" + ++dummyCount; - var node = { - width: a.width, - height: a.height, - edge: { id: e, source: s, target: t, attrs: a }, - rank: rank, - dummy: true - }; - - // If this node represents a bend then we will use it as a control - // point. For edges with 2 segments this will be the center dummy - // node. For edges with more than two segments, this will be the - // first and last dummy node. - if (i === 0) node.index = 0; - else if (rank + 1 === targetRank) node.index = 1; - - g.addNode(v, node); - g.addEdge(null, u, v, {}); - u = v; - } - g.addEdge(null, u, t, {}); - g.delEdge(e); - } - }); - } - - function undoNormalize(g) { - var visited = {}; - - g.eachNode(function(u, a) { - if (a.dummy && "index" in a) { - var edge = a.edge; - if (!g.hasEdge(edge.id)) { - g.addEdge(edge.id, edge.source, edge.target, edge.attrs); - } - var points = g.edge(edge.id).points; - points[a.index] = { x: a.x, y: a.y, ul: a.ul, ur: a.ur, dl: a.dl, dr: a.dr }; - g.delNode(u); - } - }); - } - - function fixupEdgePoints(g) { - g.eachEdge(function(e, s, t, a) { if (a.reversed) a.points.reverse(); }); - } - - function delegateProperty(f) { - return function() { - if (!arguments.length) return f(); - f.apply(null, arguments); - return self; - } - } -} -dagre.layout.acyclic = function() { - // External configuration - var config = { - debugLevel: 0 - } - - var timer = createTimer(); - - var self = {}; - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Acyclic Phase", run); - - self.undo = function(g) { - g.eachEdge(function(e, s, t, a) { - if (a.reversed) { - delete a.reversed; - g.delEdge(e); - g.addEdge(e, t, s, a); - } - }); - } - - return self; - - function run(g) { - var onStack = {}, - visited = {}, - reverseCount = 0; - - function dfs(u) { - if (u in visited) return; - - visited[u] = onStack[u] = true; - g.outEdges(u).forEach(function(e) { - var t = g.target(e), - a; - - if (t in onStack) { - a = g.edge(e); - g.delEdge(e); - a.reversed = true; - ++reverseCount; - g.addEdge(e, t, u, a); - } else { - dfs(t); - } - }); - - delete onStack[u]; - } - - g.eachNode(function(u) { dfs(u); }); - - if (config.debugLevel >= 2) console.log("Acyclic Phase: reversed " + reverseCount + " edge(s)"); - } -}; -dagre.layout.rank = function() { - // External configuration - var config = { - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Rank Phase", run); - - return self; - - function run(g) { - initRank(g); - components(g).forEach(function(cmpt) { - var subgraph = g.subgraph(cmpt); - feasibleTree(subgraph); - normalize(subgraph); - }); - }; - - - function initRank(g) { - var minRank = {}; - var pq = priorityQueue(); - - g.eachNode(function(u) { - pq.add(u, g.inEdges(u).length); - minRank[u] = 0; - }); - - while (pq.size() > 0) { - var minId = pq.min(); - if (pq.priority(minId) > 0) { - throw new Error("Input graph is not acyclic: " + g.toString()); - } - pq.removeMin(); - - var rank = minRank[minId]; - g.node(minId).rank = rank; - - g.outEdges(minId).forEach(function(e) { - var target = g.target(e); - minRank[target] = Math.max(minRank[target], rank + (g.edge(e).minLen || 1)); - pq.decrease(target, pq.priority(target) - 1); - }); - } - } - - function feasibleTree(g) { - // Precompute minimum lengths for each directed edge - var minLen = {}; - g.eachEdge(function(e, source, target, edge) { - var id = incidenceId(source, target); - minLen[id] = Math.max(minLen[id] || 1, edge.minLen || 1); - }); - - var tree = dagre.util.prim(g, function(u, v) { - return Math.abs(g.node(u).rank - g.node(v).rank) - minLen[incidenceId(u, v)]; - }); - - var visited = {}; - function dfs(u, rank) { - visited[u] = true; - g.node(u).rank = rank; - - tree[u].forEach(function(v) { - if (!(v in visited)) { - var delta = minLen[incidenceId(u, v)]; - dfs(v, rank + (g.edges(u, v).length ? delta : -delta)); - } - }); - } - - dfs(g.nodes()[0], 0); - - return tree; - } - - function normalize(g) { - var m = min(g.nodes().map(function(u) { return g.node(u).rank; })); - g.eachNode(function(u, node) { node.rank -= m; }); - } - - /* - * This id can be used to group (in an undirected manner) multi-edges - * incident on the same two nodes. - */ - function incidenceId(u, v) { - return u < v ? u.length + ":" + u + "-" + v : v.length + ":" + v + "-" + u; - } -} -dagre.layout.order = function() { - var config = { - iterations: 24, // max number of iterations - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.iterations = propertyAccessor(self, config, "iterations"); - - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Order Phase", run); - - return self; - - function run(g) { - var layering = initOrder(g); - var bestLayering = copyLayering(layering); - var bestCC = crossCount(g, layering); - - if (config.debugLevel >= 2) { - console.log("Order phase start cross count: " + bestCC); - } - - var cc, i, lastBest; - for (i = 0, lastBest = 0; lastBest < 4 && i < config.iterations; ++i, ++lastBest) { - cc = sweep(g, i, layering); - if (cc < bestCC) { - bestLayering = copyLayering(layering); - bestCC = cc; - lastBest = 0; - } - if (config.debugLevel >= 3) { - console.log("Order phase iter " + i + " cross count: " + bestCC); - } - } - - bestLayering.forEach(function(layer) { - layer.forEach(function(u, i) { - g.node(u).order = i; - }); - }); - - if (config.debugLevel >= 2) { - console.log("Order iterations: " + i); - console.log("Order phase best cross count: " + bestCC); - } - - return bestLayering; - } - - function initOrder(g) { - var layering = []; - g.eachNode(function(n, a) { - var layer = layering[a.rank] || (layering[a.rank] = []); - layer.push(n); - }); - return layering; - } - - /* - * Returns a function that will return the predecessors for a node. This - * function differs from `g.predecessors(u)` in that a predecessor appears - * for each incident edge (`g.predecessors(u)` treats predecessors as a set). - * This allows pseudo-weighting of predecessor nodes. - */ - function multiPredecessors(g) { - return function(u) { - var preds = []; - g.inEdges(u).forEach(function(e) { - preds.push(g.source(e)); - }); - return preds; - } - } - - /* - * Same as `multiPredecessors(g)` but for successors. - */ - function multiSuccessors(g) { - return function(u) { - var sucs = []; - g.outEdges(u).forEach(function(e) { - sucs.push(g.target(e)); - }); - return sucs; - } - } - - function sweep(g, iter, layering) { - if (iter % 2 === 0) { - for (var i = 1; i < layering.length; ++i) { - barycenterLayer(layering[i - 1], layering[i], multiPredecessors(g)); - } - } else { - for (var i = layering.length - 2; i >= 0; --i) { - barycenterLayer(layering[i + 1], layering[i], multiSuccessors(g)); - } - } - return crossCount(g, layering); - } - - /* - * Given a fixed layer and a movable layer in a graph this function will - * attempt to find an improved ordering for the movable layer such that - * edge crossings may be reduced. - * - * This algorithm is based on the barycenter method. - */ - function barycenterLayer(fixed, movable, predecessors) { - var pos = layerPos(movable); - var bs = barycenters(fixed, movable, predecessors); - - var toSort = movable.slice(0).sort(function(x, y) { - return bs[x] - bs[y] || pos[x] - pos[y]; - }); - - for (var i = movable.length - 1; i >= 0; --i) { - if (bs[movable[i]] !== -1) { - movable[i] = toSort.pop(); - } - } - } - - /* - * Given a fixed layer and a movable layer in a graph, this function will - * return weights for the movable layer that can be used to reorder the layer - * for potentially reduced edge crossings. - */ - function barycenters(fixed, movable, predecessors) { - var pos = layerPos(fixed), // Position of node in fixed list - bs = {}; // Barycenters for each node - - movable.forEach(function(u) { - var b = -1; - var preds = predecessors(u); - if (preds.length > 0) { - b = 0; - preds.forEach(function(v) { b += pos[v]; }); - b = b / preds.length; - } - bs[u] = b; - }); - - return bs; - } - - function copyLayering(layering) { - return layering.map(function(l) { return l.slice(0); }); - } -} - -var crossCount = dagre.layout.order.crossCount = function(g, layering) { - var cc = 0; - var prevLayer; - layering.forEach(function(layer) { - if (prevLayer) { - cc += bilayerCrossCount(g, prevLayer, layer); - } - prevLayer = layer; - }); - return cc; -} - -/* - * This function searches through a ranked and ordered graph and counts the - * number of edges that cross. This algorithm is derived from: - * - * W. Barth et al., Bilayer Cross Counting, JGAA, 8(2) 179–194 (2004) - */ -var bilayerCrossCount = dagre.layout.order.bilayerCrossCount = function(g, layer1, layer2) { - var layer2Pos = layerPos(layer2); - - var indices = []; - layer1.forEach(function(u) { - var nodeIndices = []; - g.outEdges(u).forEach(function(e) { nodeIndices.push(layer2Pos[g.target(e)]); }); - nodeIndices.sort(function(x, y) { return x - y; }); - indices = indices.concat(nodeIndices); - }); - - var firstIndex = 1; - while (firstIndex < layer2.length) firstIndex <<= 1; - - var treeSize = 2 * firstIndex - 1; - firstIndex -= 1; - - var tree = []; - for (var i = 0; i < treeSize; ++i) { tree[i] = 0; } - - var cc = 0; - indices.forEach(function(i) { - var treeIndex = i + firstIndex; - ++tree[treeIndex]; - var weightSum = 0; - while (treeIndex > 0) { - if (treeIndex % 2) { - cc += tree[treeIndex + 1]; - } - treeIndex = (treeIndex - 1) >> 1; - ++tree[treeIndex]; - } - }); - - return cc; -} - -function layerPos(layer) { - var pos = {}; - layer.forEach(function(u, i) { pos[u] = i; }); - return pos; -} -/* - * The algorithms here are based on Brandes and Köpf, "Fast and Simple - * Horizontal Coordinate Assignment". - */ -dagre.layout.position = function() { - // External configuration - var config = { - nodeSep: 50, - edgeSep: 10, - universalSep: null, - rankSep: 30, - rankDir: "TB", - debugLevel: 0 - }; - - var timer = createTimer(); - - var self = {}; - - self.nodeSep = propertyAccessor(self, config, "nodeSep"); - self.edgeSep = propertyAccessor(self, config, "edgeSep"); - // If not null this separation value is used for all nodes and edges - // regardless of their widths. `nodeSep` and `edgeSep` are ignored with this - // option. - self.universalSep = propertyAccessor(self, config, "universalSep"); - self.rankSep = propertyAccessor(self, config, "rankSep"); - self.rankDir = propertyAccessor(self, config, "rankDir"); - self.debugLevel = propertyAccessor(self, config, "debugLevel", function(x) { - timer.enabled(x); - }); - - self.run = timer.wrap("Position Phase", run); - - return self; - - function run(g) { - var layering = []; - g.eachNode(function(u, node) { - var layer = layering[node.rank] || (layering[node.rank] = []); - layer[node.order] = u; - }); - - var conflicts = findConflicts(g, layering); - - var xss = {}; - ["u", "d"].forEach(function(vertDir) { - if (vertDir === "d") layering.reverse(); - - ["l", "r"].forEach(function(horizDir) { - if (horizDir === "r") reverseInnerOrder(layering); - - var dir = vertDir + horizDir; - var align = verticalAlignment(g, layering, conflicts, vertDir === "u" ? "predecessors" : "successors"); - xss[dir]= horizontalCompaction(g, layering, align.pos, align.root, align.align); - if (horizDir === "r") flipHorizontally(xss[dir]); - - if (horizDir === "r") reverseInnerOrder(layering); - }); - - if (vertDir === "d") layering.reverse(); - }); - - balance(g, layering, xss); - g.eachNode(function(v) { - var xs = []; - for (alignment in xss) { - xDebug(alignment, g, v, xss[alignment][v]); - xs.push(xss[alignment][v]); - } - xs.sort(function(x, y) { return x - y; }); - x(g, v, (xs[1] + xs[2]) / 2); - }); - - // Translate layout so left edge of bounding rectangle has coordinate 0 - var minX = min(g.nodes().map(function(u) { return x(g, u) - width(g, u) / 2; })); - g.eachNode(function(u) { x(g, u, x(g, u) - minX); }); - - // Align y coordinates with ranks - var posY = 0; - layering.forEach(function(layer) { - var maxHeight = max(layer.map(function(u) { return height(g, u); })); - posY += maxHeight / 2; - layer.forEach(function(u) { y(g, u, posY); }); - posY += maxHeight / 2 + config.rankSep; - }); - }; - - /* - * Generate an ID that can be used to represent any undirected edge that is - * incident on `u` and `v`. - */ - function undirEdgeId(u, v) { - return u < v - ? u.toString().length + ":" + u + "-" + v - : v.toString().length + ":" + v + "-" + u; - } - - function findConflicts(g, layering) { - var conflicts = {}, // Set of conflicting edge ids - pos = {}; // Position of node in its layer - - if (layering.length <= 2) return conflicts; - - layering[1].forEach(function(u, i) { pos[u] = i; }); - for (var i = 1; i < layering.length - 1; ++i) { - prevLayer = layering[i]; - currLayer = layering[i+1]; - var k0 = 0; // Position of the last inner segment in the previous layer - var l = 0; // Current position in the current layer (for iteration up to `l1`) - - // Scan current layer for next node that is incident to an inner segement - // between layering[i+1] and layering[i]. - for (var l1 = 0; l1 < currLayer.length; ++l1) { - var u = currLayer[l1]; // Next inner segment in the current layer or - // last node in the current layer - pos[u] = l1; - - var k1 = undefined; // Position of the next inner segment in the previous layer or - // the position of the last element in the previous layer - if (g.node(u).dummy) { - var uPred = g.predecessors(u)[0]; - if (g.node(uPred).dummy) - k1 = pos[uPred]; - } - if (k1 === undefined && l1 === currLayer.length - 1) - k1 = prevLayer.length - 1; - - if (k1 !== undefined) { - for (; l <= l1; ++l) { - g.predecessors(currLayer[l]).forEach(function(v) { - var k = pos[v]; - if (k < k0 || k > k1) - conflicts[undirEdgeId(currLayer[l], v)] = true; - }); - } - k0 = k1; - } - } - } - - return conflicts; - } - - function verticalAlignment(g, layering, conflicts, relationship) { - var pos = {}, // Position for a node in its layer - root = {}, // Root of the block that the node participates in - align = {}; // Points to the next node in the block or, if the last - // element in the block, points to the first block's root - - layering.forEach(function(layer) { - layer.forEach(function(u, i) { - root[u] = u; - align[u] = u; - pos[u] = i; - }); - }); - - layering.forEach(function(layer) { - var prevIdx = -1; - layer.forEach(function(v) { - var related = g[relationship](v), // Adjacent nodes from the previous layer - m; // The mid point in the related array - - if (related.length > 0) { - related.sort(function(x, y) { return pos[x] - pos[y]; }); - mid = (related.length - 1) / 2; - related.slice(Math.floor(mid), Math.ceil(mid) + 1).forEach(function(u) { - if (align[v] === v) { - if (!conflicts[undirEdgeId(u, v)] && prevIdx < pos[u]) { - align[u] = v; - align[v] = root[v] = root[u]; - prevIdx = pos[u]; - } - } - }); - } - }); - }); - - return { pos: pos, root: root, align: align }; - } - - // This function deviates from the standard BK algorithm in two ways. First - // it takes into account the size of the nodes. Second it includes a fix to - // the original algorithm that is described in Carstens, "Node and Label - // Placement in a Layered Layout Algorithm". - function horizontalCompaction(g, layering, pos, root, align) { - var sink = {}, // Mapping of node id -> sink node id for class - shift = {}, // Mapping of sink node id -> x delta - pred = {}, // Mapping of node id -> predecessor node (or null) - xs = {}; // Calculated X positions - - layering.forEach(function(layer) { - layer.forEach(function(u, i) { - sink[u] = u; - if (i > 0) - pred[u] = layer[i - 1]; - }); - }); - - function placeBlock(v) { - if (!(v in xs)) { - xs[v] = 0; - var w = v; - do { - if (pos[w] > 0) { - var u = root[pred[w]]; - placeBlock(u); - if (sink[v] === v) { - sink[v] = sink[u]; - } - var delta = sep(g, pred[w]) + sep(g, w); - if (sink[v] !== sink[u]) { - shift[sink[u]] = Math.min(shift[sink[u]] || Number.POSITIVE_INFINITY, xs[v] - xs[u] - delta); - } else { - xs[v] = Math.max(xs[v], xs[u] + delta); - } - } - w = align[w]; - } while (w !== v); - } - } - - // Root coordinates relative to sink - values(root).forEach(function(v) { - placeBlock(v); - }); - - // Absolute coordinates - layering.forEach(function(layer) { - layer.forEach(function(v) { - xs[v] = xs[root[v]]; - var xDelta = shift[sink[v]]; - if (root[v] === v && xDelta < Number.POSITIVE_INFINITY) - xs[v] += xDelta; - }); - }); - - return xs; - } - - function findMinCoord(g, layering, xs) { - return min(layering.map(function(layer) { - var u = layer[0]; - return xs[u]; - })); - } - - function findMaxCoord(g, layering, xs) { - return max(layering.map(function(layer) { - var u = layer[layer.length - 1]; - return xs[u]; - })); - } - - function balance(g, layering, xss) { - var min = {}, // Min coordinate for the alignment - max = {}, // Max coordinate for the alginment - smallestAlignment, - shift = {}; // Amount to shift a given alignment - - var smallest = Number.POSITIVE_INFINITY; - for (var alignment in xss) { - var xs = xss[alignment]; - min[alignment] = findMinCoord(g, layering, xs); - max[alignment] = findMaxCoord(g, layering, xs); - var w = max[alignment] - min[alignment]; - if (w < smallest) { - smallest = w; - smallestAlignment = alignment; - } - } - - // Determine how much to adjust positioning for each alignment - ["u", "d"].forEach(function(vertDir) { - ["l", "r"].forEach(function(horizDir) { - var alignment = vertDir + horizDir; - shift[alignment] = horizDir === "l" - ? min[smallestAlignment] - min[alignment] - : max[smallestAlignment] - max[alignment]; - }); - }); - - // Find average of medians for xss array - for (var alignment in xss) { - g.eachNode(function(v) { - xss[alignment][v] += shift[alignment]; - }); - }; - } - - function flipHorizontally(xs) { - for (var u in xs) { - xs[u] = -xs[u]; - } - } - - function reverseInnerOrder(layering) { - layering.forEach(function(layer) { - layer.reverse(); - }); - } - - function width(g, u) { - switch (config.rankDir) { - case "LR": return g.node(u).height; - default: return g.node(u).width; - } - } - - function height(g, u) { - switch(config.rankDir) { - case "LR": return g.node(u).width; - default: return g.node(u).height; - } - } - - function sep(g, u) { - if (config.universalSep !== null) { - return config.universalSep; - } - var w = width(g, u); - var s = g.node(u).dummy ? config.edgeSep : config.nodeSep; - return (w + s) / 2; - } - - function x(g, u, x) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u).y; - } else { - g.node(u).y = x; - } - break; - default: - if (arguments.length < 3) { - return g.node(u).x; - } else { - g.node(u).x = x; - } - } - } - - function xDebug(name, g, u, x) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u)[name]; - } else { - g.node(u)[name] = x; - } - break; - default: - if (arguments.length < 3) { - return g.node(u)[name]; - } else { - g.node(u)[name] = x; - } - } - } - - function y(g, u, y) { - switch (config.rankDir) { - case "LR": - if (arguments.length < 3) { - return g.node(u).x; - } else { - g.node(u).x = y; - } - break; - default: - if (arguments.length < 3) { - return g.node(u).y; - } else { - g.node(u).y = y; - } - } - } -} -dagre.util = {}; - -/* - * Copies attributes from `src` to `dst`. If an attribute name is in both - * `src` and `dst` then the attribute value from `src` takes precedence. - */ -function mergeAttributes(src, dst) { - Object.keys(src).forEach(function(k) { dst[k] = src[k]; }); -} - -function min(values) { - return Math.min.apply(null, values); -} - -function max(values) { - return Math.max.apply(null, values); -} - -function concat(arrays) { - return Array.prototype.concat.apply([], arrays); -} - -var keys = dagre.util.keys = Object.keys; - -/* - * Returns an array of all values in the given object. - */ -function values(obj) { - return Object.keys(obj).map(function(k) { return obj[k]; }); -} - -function union(arrays) { - var obj = {}; - for (var i = 0; i < arrays.length; ++i) { - var a = arrays[i]; - for (var j = 0; j < a.length; ++j) { - var v = a[j]; - obj[v] = v; - } - } - - var results = []; - for (var k in obj) { - results.push(obj[k]); - } - - return results; -} - -/* - * Returns all components in the graph using undirected navigation. - */ -var components = dagre.util.components = function(g) { - var results = []; - var visited = {}; - - function dfs(u, component) { - if (!(u in visited)) { - visited[u] = true; - component.push(u); - g.neighbors(u).forEach(function(v) { - dfs(v, component); - }); - } - }; - - g.eachNode(function(u) { - var component = []; - dfs(u, component); - if (component.length > 0) { - results.push(component); - } - }); - - return results; -}; - -/* - * This algorithm uses undirected traversal to find a miminum spanning tree - * using the supplied weight function. The algorithm is described in - * Cormen, et al., "Introduction to Algorithms". The returned structure - * is an array of node id to an array of adjacent nodes. - */ -var prim = dagre.util.prim = function(g, weight) { - var result = {}; - var parent = {}; - var q = priorityQueue(); - - if (g.nodes().length === 0) { - return result; - } - - g.eachNode(function(u) { - q.add(u, Number.POSITIVE_INFINITY); - result[u] = []; - }); - - // Start from arbitrary node - q.decrease(g.nodes()[0], 0); - - var u; - var init = false; - while (q.size() > 0) { - u = q.removeMin(); - if (u in parent) { - result[u].push(parent[u]); - result[parent[u]].push(u); - } else if (init) { - throw new Error("Input graph is not connected:\n" + g.toString()); - } else { - init = true; - } - - g.neighbors(u).forEach(function(v) { - var pri = q.priority(v); - if (pri !== undefined) { - var edgeWeight = weight(u, v); - if (edgeWeight < pri) { - parent[v] = u; - q.decrease(v, edgeWeight); - } - } - }); - } - - return result; -}; - -var intersectRect = dagre.util.intersectRect = function(rect, point) { - var x = rect.x; - var y = rect.y; - - // For now we only support rectangles - - // Rectangle intersection algorithm from: - // http://math.stackexchange.com/questions/108113/find-edge-between-two-boxes - var dx = point.x - x; - var dy = point.y - y; - var w = rect.width / 2; - var h = rect.height / 2; - - var sx, sy; - if (Math.abs(dy) * w > Math.abs(dx) * h) { - // Intersection is top or bottom of rect. - if (dy < 0) { - h = -h; - } - sx = dy === 0 ? 0 : h * dx / dy; - sy = h; - } else { - // Intersection is left or right of rect. - if (dx < 0) { - w = -w; - } - sx = w; - sy = dx === 0 ? 0 : w * dy / dx; - } - - return {x: x + sx, y: y + sy}; -} - -var pointStr = dagre.util.pointStr = function(point) { - return point.x + "," + point.y; -} - -var createTimer = function() { - var self = {}, - enabled = false; - - self.enabled = function(x) { - if (!arguments.length) return enabled; - enabled = x; - return self; - }; - - self.wrap = function(name, func) { - return function() { - var start = enabled ? new Date().getTime() : null; - try { - return func.apply(null, arguments); - } finally { - if (start) console.log(name + " time: " + (new Date().getTime() - start) + "ms"); - } - } - }; - - return self; -} - -function propertyAccessor(self, config, field, setHook) { - return function(x) { - if (!arguments.length) return config[field]; - config[field] = x; - if (setHook) setHook(x); - return self; - }; -} -function priorityQueue() { - var _arr = []; - var _keyIndices = {}; - - function _heapify(i) { - var arr = _arr; - var l = 2 * i, - r = l + 1, - largest = i; - if (l < arr.length) { - largest = arr[l].pri < arr[largest].pri ? l : largest; - if (r < arr.length) { - largest = arr[r].pri < arr[largest].pri ? r : largest; - } - if (largest !== i) { - _swap(i, largest); - _heapify(largest); - } - } - } - - function _decrease(index) { - var arr = _arr; - var pri = arr[index].pri; - var parent; - while (index > 0) { - parent = index >> 1; - if (arr[parent].pri < pri) { - break; - } - _swap(index, parent); - index = parent; - } - } - - function _swap(i, j) { - var arr = _arr; - var keyIndices = _keyIndices; - var tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; - keyIndices[arr[i].key] = i; - keyIndices[arr[j].key] = j; - } - - function size() { return _arr.length; } - - function keys() { return Object.keys(_keyIndices); } - - function has(key) { return key in _keyIndices; } - - function priority(key) { - var index = _keyIndices[key]; - if (index !== undefined) { - return _arr[index].pri; - } - } - - function add(key, pri) { - if (!(key in _keyIndices)) { - var entry = {key: key, pri: pri}; - var index = _arr.length; - _keyIndices[key] = index; - _arr.push(entry); - _decrease(index); - return true; - } - return false; - } - - function min() { - if (size() > 0) { - return _arr[0].key; - } - } - - function removeMin() { - _swap(0, _arr.length - 1); - var min = _arr.pop(); - delete _keyIndices[min.key]; - _heapify(0); - return min.key; - } - - function decrease(key, pri) { - var index = _keyIndices[key]; - if (pri > _arr[index].pri) { - throw new Error("New priority is greater than current priority. " + - "Key: " + key + " Old: " + _arr[index].pri + " New: " + pri); - } - _arr[index].pri = pri; - _decrease(index); - } - - return { - size: size, - keys: keys, - has: has, - priority: priority, - add: add, - min: min, - removeMin: removeMin, - decrease: decrease - }; -} -dagre.dot = {}; - -dagre.dot.toGraph = function(str) { - var parseTree = dot_parser.parse(str); - var g = dagre.graph(); - var undir = parseTree.type === "graph"; - - function createNode(id, attrs) { - if (!(g.hasNode(id))) { - g.addNode(id, { id: id, label: id }); - } - if (attrs) { - mergeAttributes(attrs, g.node(id)); - } - } - - var edgeCount = {}; - function createEdge(source, target, attrs) { - var edgeKey = source + "-" + target; - var count = edgeCount[edgeKey]; - if (!count) { - count = edgeCount[edgeKey] = 0; - } - edgeCount[edgeKey]++; - - var id = attrs.id || edgeKey + "-" + count; - var edge = {}; - mergeAttributes(attrs, edge); - mergeAttributes({ id: id }, edge); - g.addEdge(id, source, target, edge); - } - - function handleStmt(stmt) { - switch (stmt.type) { - case "node": - createNode(stmt.id, stmt.attrs); - break; - case "edge": - var prev; - stmt.elems.forEach(function(elem) { - handleStmt(elem); - - switch(elem.type) { - case "node": - var curr = elem.id; - - if (prev) { - createEdge(prev, curr, stmt.attrs); - if (undir) { - createEdge(curr, prev, stmt.attrs); - } - } - prev = curr; - break; - default: - // We don't currently support subgraphs incident on an edge - throw new Error("Unsupported type incident on edge: " + elem.type); - } - }); - break; - case "attr": - // Ignore for now - break; - default: - throw new Error("Unsupported statement type: " + stmt.type); - } - } - - if (parseTree.stmts) { - parseTree.stmts.forEach(function(stmt) { - handleStmt(stmt); - }); - } - - return g; -}; - -dagre.dot.toObjects = function(str) { - var g = dagre.dot.toGraph(str); - var nodes = g.nodes().map(function(u) { return g.node(u); }); - var edges = g.edges().map(function(e) { - var edge = g.edge(e); - edge.source = g.node(g.source(e)); - edge.target = g.node(g.target(e)); - return edge; - }); - return { nodes: nodes, edges: edges }; -}; -dot_parser = (function(){ - /* - * Generated by PEG.js 0.7.0. - * - * http://pegjs.majda.cz/ - */ - - function quote(s) { - /* - * ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a - * string literal except for the closing quote character, backslash, - * carriage return, line separator, paragraph separator, and line feed. - * Any character may appear in the form of an escape sequence. - * - * For portability, we also escape escape all control and non-ASCII - * characters. Note that "\0" and "\v" escape sequences are not used - * because JSHint does not like the first and IE the second. - */ - return '"' + s - .replace(/\\/g, '\\\\') // backslash - .replace(/"/g, '\\"') // closing quote character - .replace(/\x08/g, '\\b') // backspace - .replace(/\t/g, '\\t') // horizontal tab - .replace(/\n/g, '\\n') // line feed - .replace(/\f/g, '\\f') // form feed - .replace(/\r/g, '\\r') // carriage return - .replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape) - + '"'; - } - - var result = { - /* - * Parses the input with a generated parser. If the parsing is successfull, - * returns a value explicitly or implicitly specified by the grammar from - * which the parser was generated (see |PEG.buildParser|). If the parsing is - * unsuccessful, throws |PEG.parser.SyntaxError| describing the error. - */ - parse: function(input, startRule) { - var parseFunctions = { - "start": parse_start, - "stmtList": parse_stmtList, - "stmt": parse_stmt, - "attrStmt": parse_attrStmt, - "inlineAttrStmt": parse_inlineAttrStmt, - "nodeStmt": parse_nodeStmt, - "edgeStmt": parse_edgeStmt, - "subgraphStmt": parse_subgraphStmt, - "attrList": parse_attrList, - "attrListBlock": parse_attrListBlock, - "aList": parse_aList, - "edgeRHS": parse_edgeRHS, - "idDef": parse_idDef, - "nodeIdOrSubgraph": parse_nodeIdOrSubgraph, - "nodeId": parse_nodeId, - "port": parse_port, - "compassPt": parse_compassPt, - "id": parse_id, - "node": parse_node, - "edge": parse_edge, - "graph": parse_graph, - "digraph": parse_digraph, - "subgraph": parse_subgraph, - "strict": parse_strict, - "graphType": parse_graphType, - "whitespace": parse_whitespace, - "comment": parse_comment, - "_": parse__ - }; - - if (startRule !== undefined) { - if (parseFunctions[startRule] === undefined) { - throw new Error("Invalid rule name: " + quote(startRule) + "."); - } - } else { - startRule = "start"; - } - - var pos = 0; - var reportFailures = 0; - var rightmostFailuresPos = 0; - var rightmostFailuresExpected = []; - - function padLeft(input, padding, length) { - var result = input; - - var padLength = length - input.length; - for (var i = 0; i < padLength; i++) { - result = padding + result; - } - - return result; - } - - function escape(ch) { - var charCode = ch.charCodeAt(0); - var escapeChar; - var length; - - if (charCode <= 0xFF) { - escapeChar = 'x'; - length = 2; - } else { - escapeChar = 'u'; - length = 4; - } - - return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length); - } - - function matchFailed(failure) { - if (pos < rightmostFailuresPos) { - return; - } - - if (pos > rightmostFailuresPos) { - rightmostFailuresPos = pos; - rightmostFailuresExpected = []; - } - - rightmostFailuresExpected.push(failure); - } - - function parse_start() { - var result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10, result11, result12; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = []; - result1 = parse__(); - while (result1 !== null) { - result0.push(result1); - result1 = parse__(); - } - if (result0 !== null) { - pos2 = pos; - result1 = parse_strict(); - if (result1 !== null) { - result2 = parse__(); - if (result2 !== null) { - result1 = [result1, result2]; - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result2 = parse_graphType(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result5 = []; - result6 = parse__(); - while (result6 !== null) { - result5.push(result6); - result6 = parse__(); - } - if (result5 !== null) { - if (input.charCodeAt(pos) === 123) { - result6 = "{"; - pos++; - } else { - result6 = null; - if (reportFailures === 0) { - matchFailed("\"{\""); - } - } - if (result6 !== null) { - result7 = []; - result8 = parse__(); - while (result8 !== null) { - result7.push(result8); - result8 = parse__(); - } - if (result7 !== null) { - result8 = parse_stmtList(); - result8 = result8 !== null ? result8 : ""; - if (result8 !== null) { - result9 = []; - result10 = parse__(); - while (result10 !== null) { - result9.push(result10); - result10 = parse__(); - } - if (result9 !== null) { - if (input.charCodeAt(pos) === 125) { - result10 = "}"; - pos++; - } else { - result10 = null; - if (reportFailures === 0) { - matchFailed("\"}\""); - } - } - if (result10 !== null) { - result11 = []; - result12 = parse__(); - while (result12 !== null) { - result11.push(result12); - result12 = parse__(); - } - if (result11 !== null) { - result0 = [result0, result1, result2, result3, result4, result5, result6, result7, result8, result9, result10, result11]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, type, id, stmts) { - return {type: type, id: id, stmts: stmts}; - })(pos0, result0[2], result0[4], result0[8]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_stmtList() { - var result0, result1, result2, result3, result4, result5, result6, result7; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_stmt(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 59) { - result2 = ";"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = []; - pos2 = pos; - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_stmt(); - if (result5 !== null) { - result6 = []; - result7 = parse__(); - while (result7 !== null) { - result6.push(result7); - result7 = parse__(); - } - if (result6 !== null) { - if (input.charCodeAt(pos) === 59) { - result7 = ";"; - pos++; - } else { - result7 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result7 = result7 !== null ? result7 : ""; - if (result7 !== null) { - result4 = [result4, result5, result6, result7]; - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - while (result4 !== null) { - result3.push(result4); - pos2 = pos; - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_stmt(); - if (result5 !== null) { - result6 = []; - result7 = parse__(); - while (result7 !== null) { - result6.push(result7); - result7 = parse__(); - } - if (result6 !== null) { - if (input.charCodeAt(pos) === 59) { - result7 = ";"; - pos++; - } else { - result7 = null; - if (reportFailures === 0) { - matchFailed("\";\""); - } - } - result7 = result7 !== null ? result7 : ""; - if (result7 !== null) { - result4 = [result4, result5, result6, result7]; - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } else { - result4 = null; - pos = pos2; - } - } - if (result3 !== null) { - result0 = [result0, result1, result2, result3]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = [first]; - for (var i = 0; i < rest.length; ++i) { - result.push(rest[i][1]); - } - return result; - })(pos0, result0[0], result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_stmt() { - var result0; - - result0 = parse_attrStmt(); - if (result0 === null) { - result0 = parse_subgraphStmt(); - if (result0 === null) { - result0 = parse_inlineAttrStmt(); - if (result0 === null) { - result0 = parse_edgeStmt(); - if (result0 === null) { - result0 = parse_nodeStmt(); - } - } - } - } - return result0; - } - - function parse_attrStmt() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_graph(); - if (result0 === null) { - result0 = parse_node(); - if (result0 === null) { - result0 = parse_edge(); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_attrList(); - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, type, attrs) { - return { type: "attr", attrType: type, attrs: attrs || {}}; - })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_inlineAttrStmt() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 61) { - result2 = "="; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, k, v) { - var attrs = {}; - attrs[k] = v; - return { type: "inlineAttr", attrs: attrs }; - })(pos0, result0[0], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nodeStmt() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_nodeId(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_attrList(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id, attrs) { return {type: "node", id: id, attrs: attrs || {}}; })(pos0, result0[0], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edgeStmt() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_nodeIdOrSubgraph(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_edgeRHS(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_attrList(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, lhs, rhs, attrs) { - var elems = [lhs]; - for (var i = 0; i < rhs.length; ++i) { - elems.push(rhs[i]); - } - return { type: "edge", elems: elems, attrs: attrs || {} }; - })(pos0, result0[0], result0[2], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_subgraphStmt() { - var result0, result1, result2, result3, result4, result5; - var pos0, pos1, pos2, pos3; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - result0 = parse_subgraph(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - pos3 = pos; - result2 = parse_id(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (input.charCodeAt(pos) === 123) { - result1 = "{"; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\"{\""); - } - } - if (result1 !== null) { - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_stmtList(); - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - if (input.charCodeAt(pos) === 125) { - result5 = "}"; - pos++; - } else { - result5 = null; - if (reportFailures === 0) { - matchFailed("\"}\""); - } - } - if (result5 !== null) { - result0 = [result0, result1, result2, result3, result4, result5]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id, stmts) { - id = id[2] || []; - return { type: "subgraph", id: id[0], stmts: stmts }; - })(pos0, result0[0], result0[3]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_attrList() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_attrListBlock(); - if (result0 !== null) { - result1 = []; - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_attrListBlock(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - result3 = parse_attrListBlock(); - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = first; - for (var i = 0; i < rest.length; ++i) { - result = rightBiasedMerge(result, rest[i][1]); - } - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_attrListBlock() { - var result0, result1, result2, result3, result4; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 91) { - result0 = "["; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"[\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_aList(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - if (input.charCodeAt(pos) === 93) { - result4 = "]"; - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\"]\""); - } - } - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, aList) { return aList; })(pos0, result0[2]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_aList() { - var result0, result1, result2, result3, result4, result5; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_idDef(); - if (result0 !== null) { - result1 = []; - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - if (input.charCodeAt(pos) === 44) { - result3 = ","; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\",\""); - } - } - result3 = result3 !== null ? result3 : ""; - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_idDef(); - if (result5 !== null) { - result2 = [result2, result3, result4, result5]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - result2 = []; - result3 = parse__(); - while (result3 !== null) { - result2.push(result3); - result3 = parse__(); - } - if (result2 !== null) { - if (input.charCodeAt(pos) === 44) { - result3 = ","; - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("\",\""); - } - } - result3 = result3 !== null ? result3 : ""; - if (result3 !== null) { - result4 = []; - result5 = parse__(); - while (result5 !== null) { - result4.push(result5); - result5 = parse__(); - } - if (result4 !== null) { - result5 = parse_idDef(); - if (result5 !== null) { - result2 = [result2, result3, result4, result5]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, first, rest) { - var result = first; - for (var i = 0; i < rest.length; ++i) { - result = rightBiasedMerge(result, rest[i][3]); - } - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edgeRHS() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - pos2 = pos; - if (input.substr(pos, 2) === "--") { - result0 = "--"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"--\""); - } - } - if (result0 !== null) { - result1 = (function(offset) { return directed; })(pos) ? null : ""; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - if (result0 === null) { - pos2 = pos; - if (input.substr(pos, 2) === "->") { - result0 = "->"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"->\""); - } - } - if (result0 !== null) { - result1 = (function(offset) { return directed; })(pos) ? "" : null; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos2; - } - } else { - result0 = null; - pos = pos2; - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_nodeIdOrSubgraph(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_edgeRHS(); - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, rhs, rest) { - var result = [rhs]; - for (var i = 0; i < rest.length; ++i) { - result.push(rest[i]); - } - return result; - })(pos0, result0[2], result0[4]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_idDef() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - pos2 = pos; - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 61) { - result2 = "="; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"=\""); - } - } - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - result4 = parse_id(); - if (result4 !== null) { - result1 = [result1, result2, result3, result4]; - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - } else { - result1 = null; - pos = pos2; - } - result1 = result1 !== null ? result1 : ""; - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, k, v) { - var result = {}; - result[k] = v[3]; - return result; - })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_nodeIdOrSubgraph() { - var result0; - var pos0; - - result0 = parse_subgraphStmt(); - if (result0 === null) { - pos0 = pos; - result0 = parse_nodeId(); - if (result0 !== null) { - result0 = (function(offset, id) { return { type: "node", id: id, attrs: {} }; })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - - function parse_nodeId() { - var result0, result1, result2; - var pos0, pos1; - - pos0 = pos; - pos1 = pos; - result0 = parse_id(); - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_port(); - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id) { return id; })(pos0, result0[0]); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_port() { - var result0, result1, result2, result3, result4, result5, result6; - var pos0, pos1; - - pos0 = pos; - if (input.charCodeAt(pos) === 58) { - result0 = ":"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\":\""); - } - } - if (result0 !== null) { - result1 = []; - result2 = parse__(); - while (result2 !== null) { - result1.push(result2); - result2 = parse__(); - } - if (result1 !== null) { - result2 = parse_id(); - if (result2 !== null) { - result3 = []; - result4 = parse__(); - while (result4 !== null) { - result3.push(result4); - result4 = parse__(); - } - if (result3 !== null) { - pos1 = pos; - if (input.charCodeAt(pos) === 58) { - result4 = ":"; - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("\":\""); - } - } - if (result4 !== null) { - result5 = []; - result6 = parse__(); - while (result6 !== null) { - result5.push(result6); - result6 = parse__(); - } - if (result5 !== null) { - result6 = parse_compassPt(); - if (result6 !== null) { - result4 = [result4, result5, result6]; - } else { - result4 = null; - pos = pos1; - } - } else { - result4 = null; - pos = pos1; - } - } else { - result4 = null; - pos = pos1; - } - result4 = result4 !== null ? result4 : ""; - if (result4 !== null) { - result0 = [result0, result1, result2, result3, result4]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - return result0; - } - - function parse_compassPt() { - var result0; - - if (input.charCodeAt(pos) === 110) { - result0 = "n"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"n\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "ne") { - result0 = "ne"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"ne\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 101) { - result0 = "e"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"e\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "se") { - result0 = "se"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"se\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 115) { - result0 = "s"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"s\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "sw") { - result0 = "sw"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"sw\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 119) { - result0 = "w"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"w\""); - } - } - if (result0 === null) { - if (input.substr(pos, 2) === "nw") { - result0 = "nw"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"nw\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 99) { - result0 = "c"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"c\""); - } - } - if (result0 === null) { - if (input.charCodeAt(pos) === 95) { - result0 = "_"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"_\""); - } - } - } - } - } - } - } - } - } - } - } - return result0; - } - - function parse_id() { - var result0, result1, result2, result3, result4; - var pos0, pos1, pos2, pos3; - - reportFailures++; - pos0 = pos; - pos1 = pos; - if (/^[a-zA-Z\u0200-\u0377_]/.test(input.charAt(pos))) { - result0 = input.charAt(pos); - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_]"); - } - } - if (result0 !== null) { - result1 = []; - if (/^[a-zA-Z\u0200-\u0377_0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_0-9]"); - } - } - while (result2 !== null) { - result1.push(result2); - if (/^[a-zA-Z\u0200-\u0377_0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[a-zA-Z\\u0200-\\u0377_0-9]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, fst, rest) { return fst + rest.join(""); })(pos0, result0[0], result0[1]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 45) { - result0 = "-"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"-\""); - } - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (input.charCodeAt(pos) === 46) { - result1 = "."; - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("\".\""); - } - } - if (result1 !== null) { - if (/^[0-9]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - if (result3 !== null) { - result2 = []; - while (result3 !== null) { - result2.push(result3); - if (/^[0-9]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - } else { - result2 = null; - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, sign, dot, after) { return sign + dot + after.join(""); })(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 45) { - result0 = "-"; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"-\""); - } - } - result0 = result0 !== null ? result0 : ""; - if (result0 !== null) { - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - if (result2 !== null) { - result1 = []; - while (result2 !== null) { - result1.push(result2); - if (/^[0-9]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - } else { - result1 = null; - } - if (result1 !== null) { - pos2 = pos; - if (input.charCodeAt(pos) === 46) { - result2 = "."; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\".\""); - } - } - if (result2 !== null) { - result3 = []; - if (/^[0-9]/.test(input.charAt(pos))) { - result4 = input.charAt(pos); - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - while (result4 !== null) { - result3.push(result4); - if (/^[0-9]/.test(input.charAt(pos))) { - result4 = input.charAt(pos); - pos++; - } else { - result4 = null; - if (reportFailures === 0) { - matchFailed("[0-9]"); - } - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos2; - } - } else { - result2 = null; - pos = pos2; - } - result2 = result2 !== null ? result2 : ""; - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, sign, before, after) { return sign + before.join("") + (after[0] || "") + (after[1] || []).join(""); })(pos0, result0[0], result0[1], result0[2]); - } - if (result0 === null) { - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - pos1 = pos; - if (input.charCodeAt(pos) === 34) { - result0 = "\""; - pos++; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result0 !== null) { - result1 = []; - pos2 = pos; - if (input.substr(pos, 2) === "\\\"") { - result2 = "\\\""; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\\\"\""); - } - } - if (result2 !== null) { - result2 = (function(offset) { return '"'; })(pos2); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 92) { - result2 = "\\"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result2 !== null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - if (result2 !== null) { - result2 = (function(offset, ch) { return "\\" + ch; })(pos2, result2[1]); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - } - } - while (result2 !== null) { - result1.push(result2); - pos2 = pos; - if (input.substr(pos, 2) === "\\\"") { - result2 = "\\\""; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\\\"\""); - } - } - if (result2 !== null) { - result2 = (function(offset) { return '"'; })(pos2); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - pos2 = pos; - pos3 = pos; - if (input.charCodeAt(pos) === 92) { - result2 = "\\"; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\\\""); - } - } - if (result2 !== null) { - if (/^[^"]/.test(input.charAt(pos))) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos3; - } - } else { - result2 = null; - pos = pos3; - } - if (result2 !== null) { - result2 = (function(offset, ch) { return "\\" + ch; })(pos2, result2[1]); - } - if (result2 === null) { - pos = pos2; - } - if (result2 === null) { - if (/^[^"]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\"]"); - } - } - } - } - } - if (result1 !== null) { - if (input.charCodeAt(pos) === 34) { - result2 = "\""; - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"\\\"\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - } else { - result0 = null; - pos = pos1; - } - if (result0 !== null) { - result0 = (function(offset, id) { return id.join(""); })(pos0, result0[1]); - } - if (result0 === null) { - pos = pos0; - } - } - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("identifier"); - } - return result0; - } - - function parse_node() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 4).toLowerCase() === "node") { - result0 = input.substr(pos, 4); - pos += 4; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"node\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_edge() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 4).toLowerCase() === "edge") { - result0 = input.substr(pos, 4); - pos += 4; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"edge\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_graph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 5).toLowerCase() === "graph") { - result0 = input.substr(pos, 5); - pos += 5; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"graph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_digraph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 7).toLowerCase() === "digraph") { - result0 = input.substr(pos, 7); - pos += 7; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"digraph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_subgraph() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 8).toLowerCase() === "subgraph") { - result0 = input.substr(pos, 8); - pos += 8; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"subgraph\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_strict() { - var result0; - var pos0; - - pos0 = pos; - if (input.substr(pos, 6).toLowerCase() === "strict") { - result0 = input.substr(pos, 6); - pos += 6; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"strict\""); - } - } - if (result0 !== null) { - result0 = (function(offset, k) { return k.toLowerCase(); })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - return result0; - } - - function parse_graphType() { - var result0; - var pos0; - - result0 = parse_graph(); - if (result0 === null) { - pos0 = pos; - result0 = parse_digraph(); - if (result0 !== null) { - result0 = (function(offset, graph) { - directed = graph === "digraph"; - return graph; - })(pos0, result0); - } - if (result0 === null) { - pos = pos0; - } - } - return result0; - } - - function parse_whitespace() { - var result0, result1; - - reportFailures++; - if (/^[ \t\r\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\r\\n]"); - } - } - if (result1 !== null) { - result0 = []; - while (result1 !== null) { - result0.push(result1); - if (/^[ \t\r\n]/.test(input.charAt(pos))) { - result1 = input.charAt(pos); - pos++; - } else { - result1 = null; - if (reportFailures === 0) { - matchFailed("[ \\t\\r\\n]"); - } - } - } - } else { - result0 = null; - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("whitespace"); - } - return result0; - } - - function parse_comment() { - var result0, result1, result2, result3; - var pos0, pos1, pos2; - - reportFailures++; - pos0 = pos; - if (input.substr(pos, 2) === "//") { - result0 = "//"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"//\""); - } - } - if (result0 !== null) { - result1 = []; - if (/^[^\n]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\\n]"); - } - } - while (result2 !== null) { - result1.push(result2); - if (/^[^\n]/.test(input.charAt(pos))) { - result2 = input.charAt(pos); - pos++; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("[^\\n]"); - } - } - } - if (result1 !== null) { - result0 = [result0, result1]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - if (result0 === null) { - pos0 = pos; - if (input.substr(pos, 2) === "/*") { - result0 = "/*"; - pos += 2; - } else { - result0 = null; - if (reportFailures === 0) { - matchFailed("\"/*\""); - } - } - if (result0 !== null) { - result1 = []; - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - while (result2 !== null) { - result1.push(result2); - pos1 = pos; - pos2 = pos; - reportFailures++; - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - reportFailures--; - if (result2 === null) { - result2 = ""; - } else { - result2 = null; - pos = pos2; - } - if (result2 !== null) { - if (input.length > pos) { - result3 = input.charAt(pos); - pos++; - } else { - result3 = null; - if (reportFailures === 0) { - matchFailed("any character"); - } - } - if (result3 !== null) { - result2 = [result2, result3]; - } else { - result2 = null; - pos = pos1; - } - } else { - result2 = null; - pos = pos1; - } - } - if (result1 !== null) { - if (input.substr(pos, 2) === "*/") { - result2 = "*/"; - pos += 2; - } else { - result2 = null; - if (reportFailures === 0) { - matchFailed("\"*/\""); - } - } - if (result2 !== null) { - result0 = [result0, result1, result2]; - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } else { - result0 = null; - pos = pos0; - } - } - reportFailures--; - if (reportFailures === 0 && result0 === null) { - matchFailed("comment"); - } - return result0; - } - - function parse__() { - var result0; - - result0 = parse_whitespace(); - if (result0 === null) { - result0 = parse_comment(); - } - return result0; - } - - - function cleanupExpected(expected) { - expected.sort(); - - var lastExpected = null; - var cleanExpected = []; - for (var i = 0; i < expected.length; i++) { - if (expected[i] !== lastExpected) { - cleanExpected.push(expected[i]); - lastExpected = expected[i]; - } - } - return cleanExpected; - } - - function computeErrorPosition() { - /* - * The first idea was to use |String.split| to break the input up to the - * error position along newlines and derive the line and column from - * there. However IE's |split| implementation is so broken that it was - * enough to prevent it. - */ - - var line = 1; - var column = 1; - var seenCR = false; - - for (var i = 0; i < Math.max(pos, rightmostFailuresPos); i++) { - var ch = input.charAt(i); - if (ch === "\n") { - if (!seenCR) { line++; } - column = 1; - seenCR = false; - } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { - line++; - column = 1; - seenCR = true; - } else { - column++; - seenCR = false; - } - } - - return { line: line, column: column }; - } - - - var directed; - - function rightBiasedMerge(lhs, rhs) { - var result = {}; - for (var k in lhs) { - result[k] = lhs[k]; - } - for (var k in rhs) { - result[k] = rhs[k]; - } - return result; - } - - - var result = parseFunctions[startRule](); - - /* - * The parser is now in one of the following three states: - * - * 1. The parser successfully parsed the whole input. - * - * - |result !== null| - * - |pos === input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 2. The parser successfully parsed only a part of the input. - * - * - |result !== null| - * - |pos < input.length| - * - |rightmostFailuresExpected| may or may not contain something - * - * 3. The parser did not successfully parse any part of the input. - * - * - |result === null| - * - |pos === 0| - * - |rightmostFailuresExpected| contains at least one failure - * - * All code following this comment (including called functions) must - * handle these states. - */ - if (result === null || pos !== input.length) { - var offset = Math.max(pos, rightmostFailuresPos); - var found = offset < input.length ? input.charAt(offset) : null; - var errorPosition = computeErrorPosition(); - - throw new this.SyntaxError( - cleanupExpected(rightmostFailuresExpected), - found, - offset, - errorPosition.line, - errorPosition.column - ); - } - - return result; - }, - - /* Returns the parser source code. */ - toSource: function() { return this._source; } - }; - - /* Thrown when a parser encounters a syntax error. */ - - result.SyntaxError = function(expected, found, offset, line, column) { - function buildMessage(expected, found) { - var expectedHumanized, foundHumanized; - - switch (expected.length) { - case 0: - expectedHumanized = "end of input"; - break; - case 1: - expectedHumanized = expected[0]; - break; - default: - expectedHumanized = expected.slice(0, expected.length - 1).join(", ") - + " or " - + expected[expected.length - 1]; - } - - foundHumanized = found ? quote(found) : "end of input"; - - return "Expected " + expectedHumanized + " but " + foundHumanized + " found."; - } - - this.name = "SyntaxError"; - this.expected = expected; - this.found = found; - this.message = buildMessage(expected, found); - this.offset = offset; - this.line = line; - this.column = column; - }; - - result.SyntaxError.prototype = Error.prototype; - - return result; -})(); -})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js deleted file mode 100644 index ddc669f92b2..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/dagre/dagre.min.js +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright (c) 2012 Chris Pettitt - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/(function(){function c(a){var b={};return a.forEach(function(a,c){b[a]=c}),b}function d(a,b){Object.keys(a).forEach(function(c){b[c]=a[c]})}function e(a){return Math.min.apply(null,a)}function f(a){return Math.max.apply(null,a)}function g(a){return Array.prototype.concat.apply([],a)}function i(a){return Object.keys(a).map(function(b){return a[b]})}function j(a){var b={};for(var c=0;c<a.length;++c){var d=a[c];for(var e=0;e<d.length;++e){var f=d[e];b[f]=f}}var g=[];for(var h in b)g.push(b[h]);return g}function p(a,b,c,d){return function(e){return arguments.length?(b[c]=e,d&&d(e),a):b[c]}}function q(){function c(b){var d=a,f=2*b,g=f+1,h=b;f<d.length&&(h=d[f].pri<d[h].pri?f:h,g<d.length&&(h=d[g].pri<d[h].pri?g:h),h!==b&&(e(b,h),c(h)))}function d(b){var c=a,d=c[b].pri,f;while(b>0){f=b>>1;if(c[f].pri<d)break;e(b,f),b=f}}function e(c,d){var e=a,f=b,g=e[c];e[c]=e[d],e[d]=g,f[e[c].key]=c,f[e[d].key]=d}function f(){return a.length}function g(){return Object.keys(b)}function h(a){return a in b}function i(c){var d=b[c];if(d!==undefined)return a[d].pri}function j(c,e){if(c in b)return!1;var f={key:c,pri:e},g=a.length;return b[c]=g,a.push(f),d(g),!0}function k(){if(f()>0)return a[0].key}function l(){e(0,a.length-1);var d=a.pop();return delete b[d.key],c(0),d.key}function m(c,e){var f=b[c];if(e>a[f].pri)throw new Error("New priority is greater than current priority. Key: "+c+" Old: "+a[f].pri+" New: "+e);a[f].pri=e,d(f)}var a=[],b={};return{size:f,keys:g,has:h,priority:i,add:j,min:k,removeMin:l,decrease:m}}dagre={},dagre.version="0.0.6",dagre.graph={},dagre.graph=function(){function k(a,b,c){var d=a[b];d||(d=a[b]={count:0,edges:{}}),d.count++,d.edges[c]=!0}function l(a,b,c){var d=a[b];--d.count==0?delete a[b]:delete d.edges[c]}function m(b){var c=a[b];if(b in a)return c;throw new Error("Node '"+b+"' is not in graph:\n"+e.toString())}function n(a){var b=d[a];if(!b)throw new Error("Edge '"+a+"' is not in graph:\n"+e.toString());return b}var a={},b={},c={},d={},e={},f=0;return e.addNode=function(d,f){if(e.hasNode(d))throw new Error("Graph already has node '"+d+"':\n"+e.toString());a[d]={id:d,value:f},b[d]={},c[d]={}},e.delNode=function(d){m(d),e.edges(d).forEach(function(a){e.delEdge(a)}),delete b[d],delete c[d],delete a[d]},e.node=function(a){return m(a).value},e.hasNode=function(b){return b in a},e.addEdge=function(a,g,h,i){m(g),m(h);if(a===null)a="_ANON-"+ ++f;else if(e.hasEdge(a))throw new Error("Graph already has edge '"+a+"':\n"+e.toString());d[a]={id:a,source:g,target:h,value:i},k(b[h],g,a),k(c[g],h,a)},e.delEdge=function(a){var e=n(a);l(b[e.target],e.source,a),l(c[e.source],e.target,a),delete d[a]},e.edge=function(a){return n(a).value},e.source=function(a){return n(a).source},e.target=function(a){return n(a).target},e.hasEdge=function(a){return a in d},e.successors=function(b){return m(b),h(c[b]).map(function(b){return a[b].id})},e.predecessors=function(c){return m(c),h(b[c]).map(function(b){return a[b].id})},e.neighbors=function(d){m(d);var e={};return h(c[d]).map(function(a){e[a]=!0}),h(b[d]).map(function(a){e[a]=!0}),h(e).map(function(b){return a[b].id})},e.nodes=function(){var a=[];return e.eachNode(function(b,c){a.push(b)}),a},e.eachNode=function(b){for(var c in a){var d=a[c];b(d.id,d.value)}},e.edges=function(a,b){var f,g;if(!arguments.length)return f=[],e.eachEdge(function(a){f.push(a)}),f;if(arguments.length===1)return j([e.inEdges(a),e.outEdges(a)]);if(arguments.length===2)return m(a),m(b),g=c[a],f=b in g?h(g[b].edges):[],f.map(function(a){return d[a].id})},e.eachEdge=function(a){for(var b in d){var c=d[b];a(c.id,c.source,c.target,c.value)}},e.inEdges=function(a){return m(a),g(i(b[a]).map(function(a){return h(a.edges)}))},e.outEdges=function(a){return m(a),g(i(c[a]).map(function(a){return h(a.edges)}))},e.subgraph=function(a){var b=dagre.graph();return a.forEach(function(a){b.addNode(a,e.node(a))}),i(d).forEach(function(a){b.hasNode(a.source)&&b.hasNode(a.target)&&b.addEdge(a.id,a.source,a.target,e.edge(a.id))}),b},e.toString=function(){var b="GRAPH:\n";return b+=" Nodes:\n",h(a).forEach(function(c){b+=" "+c+": "+JSON.stringify(a[c].value)+"\n"}),b+=" Edges:\n",h(d).forEach(function(a){var c=d[a];b+=" "+a+" ("+c.source+" -> "+c.target+"): "+JSON.stringify(d[a].value)+"\n"}),b},e},dagre.layout=function(){function h(){var b=dagre.graph(),c=0;return a.nodes.forEach(function(a){var d="id"in a?a.id:"_N"+c++;a.dagre={id:d,width:a.width,height:a.height},b.addNode(d,a.dagre)}),a.edges.forEach(function(a){var d=a.source.dagre.id;if(!b.hasNode(d))throw new Error("Source node for '"+a+"' not in node list");var e=a.target.dagre.id;if(!b.hasNode(e))throw new Error("Target node for '"+a+"' not in node list");a.dagre={points:[]};if(d!==e){var f="id"in a?a.id:"_E"+c++;a.dagre.id=f,a.dagre.minLen=a.minLen||1,a.dagre.width=a.width||0,a.dagre.height=a.height||0,b.addEdge(f,d,e,a.dagre)}}),b}function i(){var b=g.rankSep();try{if(!a.nodes.length)return;var i=h();i.eachEdge(function(a,b,c,d){d.minLen*=2}),g.rankSep(b/2),c.run(i),d.run(i),j(i),e.run(i),f.run(i),k(i),l(i),c.undo(i)}finally{g.rankSep(b)}return g}function j(a){var b=0;a.eachEdge(function(c,d,e,f){var g=a.node(d).rank,h=a.node(e).rank;if(g+1<h){for(var i=d,j=g+1,k=0;j<h;++j,++k){var l="_D"+ ++b,m={width:f.width,height:f.height,edge:{id:c,source:d,target:e,attrs:f},rank:j,dummy:!0};k===0?m.index=0:j+1===h&&(m.index=1),a.addNode(l,m),a.addEdge(null,i,l,{}),i=l}a.addEdge(null,i,e,{}),a.delEdge(c)}})}function k(a){var b={};a.eachNode(function(b,c){if(c.dummy&&"index"in c){var d=c.edge;a.hasEdge(d.id)||a.addEdge(d.id,d.source,d.target,d.attrs);var e=a.edge(d.id).points;e[c.index]={x:c.x,y:c.y,ul:c.ul,ur:c.ur,dl:c.dl,dr:c.dr},a.delNode(b)}})}function l(a){a.eachEdge(function(a,b,c,d){d.reversed&&d.points.reverse()})}function m(a){return function(){return arguments.length?(a.apply(null,arguments),g):a()}}var a={nodes:[],edges:[],debugLevel:0},b=o(),c=dagre.layout.acyclic(),d=dagre.layout.rank(),e=dagre.layout.order(),f=dagre.layout.position(),g={};return g.nodes=p(g,a,"nodes"),g.edges=p(g,a,"edges"),g.orderIters=m(e.iterations),g.nodeSep=m(f.nodeSep),g.edgeSep=m(f.edgeSep),g.universalSep=m(f.universalSep),g.rankSep=m(f.rankSep),g.rankDir=m(f.rankDir),g.debugAlignment=m(f.debugAlignment),g.debugLevel=p(g,a,"debugLevel",function(a){b.enabled(a),c.debugLevel(a),d.debugLevel(a),e.debugLevel(a),f.debugLevel(a)}),g.run=b.wrap("Total layout",i),g},dagre.layout.acyclic=function(){function d(b){function f(a){if(a in d)return;d[a]=c[a]=!0,b.outEdges(a).forEach(function(d){var g=b.target(d),h;g in c?(h=b.edge(d),b.delEdge(d),h.reversed=!0,++e,b.addEdge(d,g,a,h)):f(g)}),delete c[a]}var c={},d={},e=0;b.eachNode(function(a){f(a)}),a.debugLevel>=2&&console.log("Acyclic Phase: reversed "+e+" edge(s)")}var a={debugLevel:0},b=o(),c={};return c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Acyclic Phase",d),c.undo=function(a){a.eachEdge(function(b,c,d,e){e.reversed&&(delete e.reversed,a.delEdge(b),a.addEdge(b,d,c,e))})},c},dagre.layout.rank=function(){function d(a){f(a),k(a).forEach(function(b){var c=a.subgraph(b);g(c),h(c)})}function f(a){var b={},c=q();a.eachNode(function(d){c.add(d,a.inEdges(d).length),b[d]=0});while(c.size()>0){var d=c.min();if(c.priority(d)>0)throw new Error("Input graph is not acyclic: "+a.toString());c.removeMin();var e=b[d];a.node(d).rank=e,a.outEdges(d).forEach(function(d){var f=a.target(d);b[f]=Math.max(b[f],e+(a.edge(d).minLen||1)),c.decrease(f,c.priority(f)-1)})}}function g(a){function e(f,g){d[f]=!0,a.node(f).rank=g,c[f].forEach(function(c){if(!(c in d)){var h=b[i(f,c)];e(c,g+(a.edges(f,c).length?h:-h))}})}var b={};a.eachEdge(function(a,c,d,e){var f=i(c,d);b[f]=Math.max(b[f]||1,e.minLen||1)});var c=dagre.util.prim(a,function(c,d){return Math.abs(a.node(c).rank-a.node(d).rank)-b[i(c,d)]}),d={};return e(a.nodes()[0],0),c}function h(a){var b=e(a.nodes().map(function(b){return a.node(b).rank}));a.eachNode(function(a,c){c.rank-=b})}function i(a,b){return a<b?a.length+":"+a+"-"+b:b.length+":"+b+"-"+a}var a={debugLevel:0},b=o(),c={};return c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Rank Phase",d),c},dagre.layout.order=function(){function f(c){var d=g(c),e=m(d),f=a(c,d);b.debugLevel>=2&&console.log("Order phase start cross count: "+f);var h,i,k;for(i=0,k=0;k<4&&i<b.iterations;++i,++k)h=j(c,i,d),h<f&&(e=m(d),f=h,k=0),b.debugLevel>=3&&console.log("Order phase iter "+i+" cross count: "+f);return e.forEach(function(a){a.forEach(function(a,b){c.node(a).order=b})}),b.debugLevel>=2&&(console.log("Order iterations: "+i),console.log("Order phase best cross count: "+f)),e}function g(a){var b=[];return a.eachNode(function(a,c){var d=b[c.rank]||(b[c.rank]=[]);d.push(a)}),b}function h(a){return function(b){var c=[];return a.inEdges(b).forEach(function(b){c.push(a.source(b))}),c}}function i(a){return function(b){var c=[];return a.outEdges(b).forEach(function(b){c.push(a.target(b))}),c}}function j(b,c,d){if(c%2===0)for(var e=1;e<d.length;++e)k(d[e-1],d[e],h(b));else for(var e=d.length-2;e>=0;--e)k(d[e+1],d[e],i(b));return a(b,d)}function k(a,b,d){var e=c(b),f=l(a,b,d),g=b.slice(0).sort(function(a,b){return f[a]-f[b]||e[a]-e[b]});for(var h=b.length-1;h>=0;--h)f[b[h]]!==-1&&(b[h]=g.pop())}function l(a,b,d){var e=c(a),f={};return b.forEach(function(a){var b=-1,c=d(a);c.length>0&&(b=0,c.forEach(function(a){b+=e[a]}),b/=c.length),f[a]=b}),f}function m(a){return a.map(function(a){return a.slice(0)})}var b={iterations:24,debugLevel:0},d=o(),e={};return e.iterations=p(e,b,"iterations"),e.debugLevel=p(e,b,"debugLevel",function(a){d.enabled(a)}),e.run=d.wrap("Order Phase",f),e};var a=dagre.layout.order.crossCount=function(a,c){var d=0,e;return c.forEach(function(c){e&&(d+=b(a,e,c)),e=c}),d},b=dagre.layout.order.bilayerCrossCount=function(a,b,d){var e=c(d),f=[];b.forEach(function(b){var c=[];a.outEdges(b).forEach(function(b){c.push(e[a.target(b)])}),c.sort(function(a,b){return a-b}),f=f.concat(c)});var g=1;while(g<d.length)g<<=1;var h=2*g-1;g-=1;var i=[];for(var j=0;j<h;++j)i[j]=0;var k=0;return f.forEach(function(a){var b=a+g;++i[b];var c=0;while(b>0)b%2&&(k+=i[b+1]),b=b-1>>1,++i[b]}),k};dagre.layout.position=function(){function d(b){var c=[];b.eachNode(function(a,b){var d=c[b.rank]||(c[b.rank]=[]);d[b.order]=a});var d=h(b,c),g={};["u","d"].forEach(function(a){a==="d"&&c.reverse(),["l","r"].forEach(function(e){e==="r"&&r(c);var f=a+e,h=j(b,c,d,a==="u"?"predecessors":"successors");g[f]=k(b,c,h.pos,h.root,h.align),e==="r"&&q(g[f]),e==="r"&&r(c)}),a==="d"&&c.reverse()}),n(b,c,g),b.eachNode(function(a){var c=[];for(alignment in g)w(alignment,b,a,g[alignment][a]),c.push(g[alignment][a]);c.sort(function(a,b){return a-b}),v(b,a,(c[1]+c[2])/2)});var i=e(b.nodes().map(function(a){return v(b,a)-s(b,a)/2}));b.eachNode(function(a){v(b,a,v(b,a)-i)});var l=0;c.forEach(function(c){var d=f(c.map(function(a){return t(b,a)}));l+=d/2,c.forEach(function(a){x(b,a,l)}),l+=d/2+a.rankSep})}function g(a,b){return a<b?a.toString().length+":"+a+"-"+b:b.toString().length+":"+b+"-"+a}function h(a,b){var c={},d={};if(b.length<=2)return c;b[1].forEach(function(a,b){d[a]=b});for(var e=1;e<b.length-1;++e){prevLayer=b[e],currLayer=b[e+1];var f=0,h=0;for(var i=0;i<currLayer.length;++i){var j=currLayer[i];d[j]=i;var k=undefined;if(a.node(j).dummy){var l=a.predecessors(j)[0];a.node(l).dummy&&(k=d[l])}k===undefined&&i===currLayer.length-1&&(k=prevLayer.length-1);if(k!==undefined){for(;h<=i;++h)a.predecessors(currLayer[h]).forEach(function(a){var b=d[a];if(b<f||b>k)c[g(currLayer[h],a)]=!0});f=k}}}return c}function j(a,b,c,d){var e={},f={},h={};return b.forEach(function(a){a.forEach(function(a,b){f[a]=a,h[a]=a,e[a]=b})}),b.forEach(function(b){var i=-1;b.forEach(function(b){var j=a[d](b),k;j.length>0&&(j.sort(function(a,b){return e[a]-e[b]}),mid=(j.length-1)/2,j.slice(Math.floor(mid),Math.ceil(mid)+1).forEach(function(a){h[b]===b&&!c[g(a,b)]&&i<e[a]&&(h[a]=b,h[b]=f[b]=f[a],i=e[a])}))})}),{pos:e,root:f,align:h}}function k(a,b,c,d,e){function k(b){if(!(b in j)){j[b]=0;var i=b;do{if(c[i]>0){var l=d[h[i]];k(l),f[b]===b&&(f[b]=f[l]);var m=u(a,h[i])+u(a,i);f[b]!==f[l]?g[f[l]]=Math.min(g[f[l]]||Number.POSITIVE_INFINITY,j[b]-j[l]-m):j[b]=Math.max(j[b],j[l]+m)}i=e[i]}while(i!==b)}}var f={},g={},h={},j={};return b.forEach(function(a){a.forEach(function(b,c){f[b]=b,c>0&&(h[b]=a[c-1])})}),i(d).forEach(function(a){k(a)}),b.forEach(function(a){a.forEach(function(a){j[a]=j[d[a]];var b=g[f[a]];d[a]===a&&b<Number.POSITIVE_INFINITY&&(j[a]+=b)})}),j}function l(a,b,c){return e(b.map(function(a){var b=a[0];return c[b]}))}function m(a,b,c){return f(b.map(function(a){var b=a[a.length-1];return c[b]}))}function n(a,b,c){var d={},e={},f,g={},h=Number.POSITIVE_INFINITY;for(var i in c){var j=c[i];d[i]=l(a,b,j),e[i]=m(a,b,j);var k=e[i]-d[i];k<h&&(h=k,f=i)}["u","d"].forEach(function(a){["l","r"].forEach(function(b){var c=a+b;g[c]=b==="l"?d[f]-d[c]:e[f]-e[c]})});for(var i in c)a.eachNode(function(a){c[i][a]+=g[i]})}function q(a){for(var b in a)a[b]=-a[b]}function r(a){a.forEach(function(a){a.reverse()})}function s(b,c){switch(a.rankDir){case"LR":return b.node(c).height;default:return b.node(c).width}}function t(b,c){switch(a.rankDir){case"LR":return b.node(c).width;default:return b.node(c).height}}function u(b,c){if(a.universalSep!==null)return a.universalSep;var d=s(b,c),e=b.node(c).dummy?a.edgeSep:a.nodeSep;return(d+e)/2}function v(b,c,d){switch(a.rankDir){case"LR":if(arguments.length<3)return b.node(c).y;b.node(c).y=d;break;default:if(arguments.length<3)return b.node(c).x;b.node(c).x=d}}function w(b,c,d,e){switch(a.rankDir){case"LR":if(arguments.length<3)return c.node(d)[b];c.node(d)[b]=e;break;default:if(arguments.length<3)return c.node(d)[b];c.node(d)[b]=e}}function x(b,c,d){switch(a.rankDir){case"LR":if(arguments.length<3)return b.node(c).x;b.node(c).x=d;break;default:if(arguments.length<3)return b.node(c).y;b.node(c).y=d}}var a={nodeSep:50,edgeSep:10,universalSep:null,rankSep:30,rankDir:"TB",debugLevel:0},b=o(),c={};return c.nodeSep=p(c,a,"nodeSep"),c.edgeSep=p(c,a,"edgeSep"),c.universalSep=p(c,a,"universalSep"),c.rankSep=p(c,a,"rankSep"),c.rankDir=p(c,a,"rankDir"),c.debugLevel=p(c,a,"debugLevel",function(a){b.enabled(a)}),c.run=b.wrap("Position Phase",d),c},dagre.util={};var h=dagre.util.keys=Object.keys,k=dagre.util.components=function(a){function d(b,e){b in c||(c[b]=!0,e.push(b),a.neighbors(b).forEach(function(a){d(a,e)}))}var b=[],c={};return a.eachNode(function(a){var c=[];d(a,c),c.length>0&&b.push(c)}),b},l=dagre.util.prim=function(a,b){var c={},d={},e=q();if(a.nodes().length===0)return c;a.eachNode(function(a){e.add(a,Number.POSITIVE_INFINITY),c[a]=[]}),e.decrease(a.nodes()[0],0);var f,g=!1;while(e.size()>0){f=e.removeMin();if(f in d)c[f].push(d[f]),c[d[f]].push(f);else{if(g)throw new Error("Input graph is not connected:\n"+a.toString());g=!0}a.neighbors(f).forEach(function(a){var c=e.priority(a);if(c!==undefined){var g=b(f,a);g<c&&(d[a]=f,e.decrease(a,g))}})}return c},m=dagre.util.intersectRect=function(a,b){var c=a.x,d=a.y,e=b.x-c,f=b.y-d,g=a.width/2,h=a.height/2,i,j;return Math.abs(f)*g>Math.abs(e)*h?(f<0&&(h=-h),i=f===0?0:h*e/f,j=h):(e<0&&(g=-g),i=g,j=e===0?0:g*f/e),{x:c+i,y:d+j}},n=dagre.util.pointStr=function(a){return a.x+","+a.y},o=function(){var a={},b=!1;return a.enabled=function(c){return arguments.length?(b=c,a):b},a.wrap=function(a,c){return function(){var d=b?(new Date).getTime():null;try{return c.apply(null,arguments)}finally{d&&console.log(a+" time: "+((new Date).getTime()-d)+"ms")}}},a};dagre.dot={},dagre.dot.toGraph=function(a){function f(a,b){c.hasNode(a)||c.addNode(a,{id:a,label:a}),b&&d(b,c.node(a))}function h(a,b,e){var f=a+"-"+b,h=g[f];h||(h=g[f]=0),g[f]++;var i=e.id||f+"-"+h,j={};d(e,j),d({id:i},j),c.addEdge(i,a,b,j)}function i(a){switch(a.type){case"node":f(a.id,a.attrs);break;case"edge":var b;a.elems.forEach(function(c){i(c);switch(c.type){case"node":var d=c.id;b&&(h(b,d,a.attrs),e&&h(d,b,a.attrs)),b=d;break;default:throw new Error("Unsupported type incident on edge: "+c.type)}});break;case"attr":break;default:throw new Error("Unsupported statement type: "+a.type)}}var b=dot_parser.parse(a),c=dagre.graph(),e=b.type==="graph",g={};return b.stmts&&b.stmts.forEach(function(a){i(a)}),c},dagre.dot.toObjects=function(a){var b=dagre.dot.toGraph(a),c=b.nodes().map(function(a){return b.node(a)}),d=b.edges().map(function(a){var c=b.edge(a);return c.source=b.node(b.source(a)),c.target=b.node(b.target(a)),c});return{nodes:c,edges:d}},dot_parser=function(){function a(a){return'"'+a.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\x08/g,"\\b").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\f/g,"\\f").replace(/\r/g,"\\r").replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g,escape)+'"'}var b={parse:function(b,c){function i(a,b,c){var d=a,e=c-a.length;for(var f=0;f<e;f++)d=b+d;return d}function j(a){var b=a.charCodeAt(0),c,d;return b<=255?(c="x",d=2):(c="u",d=4),"\\"+c+i(b.toString(16).toUpperCase(),"0",d)}function k(a){if(e<g)return;e>g&&(g=e,h=[]),h.push(a)}function l(){var a,c,d,g,h,i,j,l,n,o,p,q,r,s,t,u;s=e,t=e,a=[],c=M();while(c!==null)a.push(c),c=M();if(a!==null){u=e,c=I(),c!==null?(d=M(),d!==null?c=[c,d]:(c=null,e=u)):(c=null,e=u),c=c!==null?c:"";if(c!==null){d=J();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();if(g!==null){h=C(),h=h!==null?h:"";if(h!==null){i=[],j=M();while(j!==null)i.push(j),j=M();if(i!==null){b.charCodeAt(e)===123?(j="{",e++):(j=null,f===0&&k('"{"'));if(j!==null){l=[],n=M();while(n!==null)l.push(n),n=M();if(l!==null){n=m(),n=n!==null?n:"";if(n!==null){o=[],p=M();while(p!==null)o.push(p),p=M();if(o!==null){b.charCodeAt(e)===125?(p="}",e++):(p=null,f===0&&k('"}"'));if(p!==null){q=[],r=M();while(r!==null)q.push(r),r=M();q!==null?a=[a,c,d,g,h,i,j,l,n,o,p,q]:(a=null,e=t)}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t}else a=null,e=t;return a!==null&&(a=function(a,b,c,d){return{type:b,id:c,stmts:d}}(s,a[2],a[4],a[8])),a===null&&(e=s),a}function m(){var a,c,d,g,h,i,j,l,m,o,p;m=e,o=e,a=n();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===59?(d=";",e++):(d=null,f===0&&k('";"')),d=d!==null?d:"";if(d!==null){g=[],p=e,h=[],i=M();while(i!==null)h.push(i),i=M();if(h!==null){i=n();if(i!==null){j=[],l=M();while(l!==null)j.push(l),l=M();j!==null?(b.charCodeAt(e)===59?(l=";",e++):(l=null,f===0&&k('";"')),l=l!==null?l:"",l!==null?h=[h,i,j,l]:(h=null,e=p)):(h=null,e=p)}else h=null,e=p}else h=null,e=p;while(h!==null){g.push(h),p=e,h=[],i=M();while(i!==null)h.push(i),i=M();if(h!==null){i=n();if(i!==null){j=[],l=M();while(l!==null)j.push(l),l=M();j!==null?(b.charCodeAt(e)===59?(l=";",e++):(l=null,f===0&&k('";"')),l=l!==null?l:"",l!==null?h=[h,i,j,l]:(h=null,e=p)):(h=null,e=p)}else h=null,e=p}else h=null,e=p}g!==null?a=[a,c,d,g]:(a=null,e=o)}else a=null,e=o}else a=null,e=o}else a=null,e=o;return a!==null&&(a=function(a,b,c){var d=[b];for(var e=0;e<c.length;++e)d.push(c[e][1]);return d}(m,a[0],a[3])),a===null&&(e=m),a}function n(){var a;return a=o(),a===null&&(a=s(),a===null&&(a=p(),a===null&&(a=r(),a===null&&(a=q())))),a}function o(){var a,b,c,d,f;d=e,f=e,a=F(),a===null&&(a=D(),a===null&&(a=E()));if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=t(),c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b,c){return{type:"attr",attrType:b,attrs:c||{}}}(d,a[0],a[2])),a===null&&(e=d),a}function p(){var a,c,d,g,h,i,j;i=e,j=e,a=C();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===61?(d="=",e++):(d=null,f===0&&k('"="'));if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=C(),h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d={};return d[b]=c,{type:"inlineAttr",attrs:d}}(i,a[0],a[4])),a===null&&(e=i),a}function q(){var a,b,c,d,f;d=e,f=e,a=z();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=t(),c=c!==null?c:"",c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b,c){return{type:"node",id:b,attrs:c||{}}}(d,a[0],a[2])),a===null&&(e=d),a}function r(){var a,b,c,d,f,g,h;g=e,h=e,a=y();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();if(b!==null){c=w();if(c!==null){d=[],f=M();while(f!==null)d.push(f),f=M();d!==null?(f=t(),f=f!==null?f:"",f!==null?a=[a,b,c,d,f]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h}else a=null,e=h}else a=null,e=h;return a!==null&&(a=function(a,b,c,d){var e=[b];for(var f=0;f<c.length;++f)e.push(c[f]);return{type:"edge",elems:e,attrs:d||{}}}(g,a[0],a[2],a[4])),a===null&&(e=g),a}function s(){var a,c,d,g,h,i,j,l,n,o;j=e,l=e,n=e,a=H();if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){o=e,d=C();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?d=[d,g]:(d=null,e=o)}else d=null,e=o;d=d!==null?d:"",d!==null?a=[a,c,d]:(a=null,e=n)}else a=null,e=n}else a=null,e=n;a=a!==null?a:"";if(a!==null){b.charCodeAt(e)===123?(c="{",e++):(c=null,f===0&&k('"{"'));if(c!==null){d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){g=m();if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(b.charCodeAt(e)===125?(i="}",e++):(i=null,f===0&&k('"}"')),i!==null?a=[a,c,d,g,h,i]:(a=null,e=l)):(a=null,e=l)}else a=null,e=l}else a=null,e=l}else a=null,e=l}else a=null,e=l;return a!==null&&(a=function(a,b,c){return b=b[2]||[],{type:"subgraph",id:b[0],stmts:c}}(j,a[0],a[3])),a===null&&(e=j),a}function t(){var a,b,c,d,f,g,h;f=e,g=e,a=u();if(a!==null){b=[],h=e,c=[],d=M();while(d!==null)c.push(d),d=M();c!==null?(d=u(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h);while(c!==null){b.push(c),h=e,c=[],d=M();while(d!==null)c.push(d),d=M();c!==null?(d=u(),d!==null?c=[c,d]:(c=null,e=h)):(c=null,e=h)}b!==null?a=[a,b]:(a=null,e=g)}else a=null,e=g;return a!==null&&(a=function(a,b,c){var d=b;for(var e=0;e<c.length;++e)d=Q(d,c[e][1]);return d}(f,a[0],a[1])),a===null&&(e=f),a}function u(){var a,c,d,g,h,i,j;i=e,j=e,b.charCodeAt(e)===91?(a="[",e++):(a=null,f===0&&k('"["'));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=v(),d=d!==null?d:"";if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(b.charCodeAt(e)===93?(h="]",e++):(h=null,f===0&&k('"]"')),h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b){return b}(i,a[2])),a===null&&(e=i),a}function v(){var a,c,d,g,h,i,j,l,m;j=e,l=e,a=x();if(a!==null){c=[],m=e,d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){b.charCodeAt(e)===44?(g=",",e++):(g=null,f===0&&k('","')),g=g!==null?g:"";if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(i=x(),i!==null?d=[d,g,h,i]:(d=null,e=m)):(d=null,e=m)}else d=null,e=m}else d=null,e=m;while(d!==null){c.push(d),m=e,d=[],g=M();while(g!==null)d.push(g),g=M();if(d!==null){b.charCodeAt(e)===44?(g=",",e++):(g=null,f===0&&k('","')),g=g!==null?g:"";if(g!==null){h=[],i=M();while(i!==null)h.push(i),i=M();h!==null?(i=x(),i!==null?d=[d,g,h,i]:(d=null,e=m)):(d=null,e=m)}else d=null,e=m}else d=null,e=m}c!==null?a=[a,c]:(a=null,e=l)}else a=null,e=l;return a!==null&&(a=function(a,b,c){var d=b;for(var e=0;e<c.length;++e)d=Q(d,c[e][3]);return d}(j,a[0],a[1])),a===null&&(e=j),a}function w(){var a,c,d,g,h,i,j,l;i=e,j=e,l=e,b.substr(e,2)==="--"?(a="--",e+=2):(a=null,f===0&&k('"--"')),a!==null?(c=function(a){return P}(e)?null:"",c!==null?a=[a,c]:(a=null,e=l)):(a=null,e=l),a===null&&(l=e,b.substr(e,2)==="->"?(a="->",e+=2):(a=null,f===0&&k('"->"')),a!==null?(c=function(a){return P}(e)?"":null,c!==null?a=[a,c]:(a=null,e=l)):(a=null,e=l));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=y();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=w(),h=h!==null?h:"",h!==null?a=[a,c,d,g,h]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j}else a=null,e=j}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d=[b];for(var e=0;e<c.length;++e)d.push(c[e]);return d}(i,a[2],a[4])),a===null&&(e=i),a}function x(){var a,c,d,g,h,i,j,l;i=e,j=e,a=C();if(a!==null){l=e,c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){b.charCodeAt(e)===61?(d="=",e++):(d=null,f===0&&k('"="'));if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();g!==null?(h=C(),h!==null?c=[c,d,g,h]:(c=null,e=l)):(c=null,e=l)}else c=null,e=l}else c=null,e=l;c=c!==null?c:"",c!==null?a=[a,c]:(a=null,e=j)}else a=null,e=j;return a!==null&&(a=function(a,b,c){var d={};return d[b]=c[3],d}(i,a[0],a[1])),a===null&&(e=i),a}function y(){var a,b;return a=s(),a===null&&(b=e,a=z(),a!==null&&(a=function(a,b){return{type:"node",id:b,attrs:{}}}(b,a)),a===null&&(e=b)),a}function z(){var a,b,c,d,f;d=e,f=e,a=C();if(a!==null){b=[],c=M();while(c!==null)b.push(c),c=M();b!==null?(c=A(),c=c!==null?c:"",c!==null?a=[a,b,c]:(a=null,e=f)):(a=null,e=f)}else a=null,e=f;return a!==null&&(a=function(a,b){return b}(d,a[0])),a===null&&(e=d),a}function A(){var a,c,d,g,h,i,j,l,m;l=e,b.charCodeAt(e)===58?(a=":",e++):(a=null,f===0&&k('":"'));if(a!==null){c=[],d=M();while(d!==null)c.push(d),d=M();if(c!==null){d=C();if(d!==null){g=[],h=M();while(h!==null)g.push(h),h=M();if(g!==null){m=e,b.charCodeAt(e)===58?(h=":",e++):(h=null,f===0&&k('":"'));if(h!==null){i=[],j=M();while(j!==null)i.push(j),j=M();i!==null?(j=B(),j!==null?h=[h,i,j]:(h=null,e=m)):(h=null,e=m)}else h=null,e=m;h=h!==null?h:"",h!==null?a=[a,c,d,g,h]:(a=null,e=l)}else a=null,e=l}else a=null,e=l}else a=null,e=l}else a=null,e=l;return a}function B(){var a;return b.charCodeAt(e)===110?(a="n",e++):(a=null,f===0&&k('"n"')),a===null&&(b.substr(e,2)==="ne"?(a="ne",e+=2):(a=null,f===0&&k('"ne"')),a===null&&(b.charCodeAt(e)===101?(a="e",e++):(a=null,f===0&&k('"e"')),a===null&&(b.substr(e,2)==="se"?(a="se",e+=2):(a=null,f===0&&k('"se"')),a===null&&(b.charCodeAt(e)===115?(a="s",e++):(a=null,f===0&&k('"s"')),a===null&&(b.substr(e,2)==="sw"?(a="sw",e+=2):(a=null,f===0&&k('"sw"')),a===null&&(b.charCodeAt(e)===119?(a="w",e++):(a=null,f===0&&k('"w"')),a===null&&(b.substr(e,2)==="nw"?(a="nw",e+=2):(a=null,f===0&&k('"nw"')),a===null&&(b.charCodeAt(e)===99?(a="c",e++):(a=null,f===0&&k('"c"')),a===null&&(b.charCodeAt(e)===95?(a="_",e++):(a=null,f===0&&k('"_"'))))))))))),a}function C(){var a,c,d,g,h,i,j,l,m;f++,i=e,j=e,/^[a-zA-Z\u0200-\u0377_]/.test(b.charAt(e))?(a=b.charAt(e),e++):(a=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_]"));if(a!==null){c=[],/^[a-zA-Z\u0200-\u0377_0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_0-9]"));while(d!==null)c.push(d),/^[a-zA-Z\u0200-\u0377_0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[a-zA-Z\\u0200-\\u0377_0-9]"));c!==null?a=[a,c]:(a=null,e=j)}else a=null,e=j;a!==null&&(a=function(a,b,c){return b+c.join("")}(i,a[0],a[1])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===45?(a="-",e++):(a=null,f===0&&k('"-"')),a=a!==null?a:"";if(a!==null){b.charCodeAt(e)===46?(c=".",e++):(c=null,f===0&&k('"."'));if(c!==null){/^[0-9]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k("[0-9]"));if(g!==null){d=[];while(g!==null)d.push(g),/^[0-9]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k("[0-9]"))}else d=null;d!==null?a=[a,c,d]:(a=null,e=j)}else a=null,e=j}else a=null,e=j;a!==null&&(a=function(a,b,c,d){return b+c+d.join("")}(i,a[0],a[1],a[2])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===45?(a="-",e++):(a=null,f===0&&k('"-"')),a=a!==null?a:"";if(a!==null){/^[0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[0-9]"));if(d!==null){c=[];while(d!==null)c.push(d),/^[0-9]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[0-9]"))}else c=null;if(c!==null){l=e,b.charCodeAt(e)===46?(d=".",e++):(d=null,f===0&&k('"."'));if(d!==null){g=[],/^[0-9]/.test(b.charAt(e))?(h=b.charAt(e),e++):(h=null,f===0&&k("[0-9]"));while(h!==null)g.push(h),/^[0-9]/.test(b.charAt(e))?(h=b.charAt(e),e++):(h=null,f===0&&k("[0-9]"));g!==null?d=[d,g]:(d=null,e=l)}else d=null,e=l;d=d!==null?d:"",d!==null?a=[a,c,d]:(a=null,e=j)}else a=null,e=j}else a=null,e=j;a!==null&&(a=function(a,b,c,d){return b+c.join("")+(d[0]||"")+(d[1]||[]).join("")}(i,a[0],a[1],a[2])),a===null&&(e=i);if(a===null){i=e,j=e,b.charCodeAt(e)===34?(a='"',e++):(a=null,f===0&&k('"\\""'));if(a!==null){c=[],l=e,b.substr(e,2)==='\\"'?(d='\\"',e+=2):(d=null,f===0&&k('"\\\\\\""')),d!==null&&(d=function(a){return'"'}(l)),d===null&&(e=l),d===null&&(l=e,m=e,b.charCodeAt(e)===92?(d="\\",e++):(d=null,f===0&&k('"\\\\"')),d!==null?(/^[^"]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k('[^"]')),g!==null?d=[d,g]:(d=null,e=m)):(d=null,e=m),d!==null&&(d=function(a,b){return"\\"+b}(l,d[1])),d===null&&(e=l),d===null&&(/^[^"]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k('[^"]'))));while(d!==null)c.push(d),l=e,b.substr(e,2)==='\\"'?(d='\\"',e+=2):(d=null,f===0&&k('"\\\\\\""')),d!==null&&(d=function(a){return'"'}(l)),d===null&&(e=l),d===null&&(l=e,m=e,b.charCodeAt(e)===92?(d="\\",e++):(d=null,f===0&&k('"\\\\"')),d!==null?(/^[^"]/.test(b.charAt(e))?(g=b.charAt(e),e++):(g=null,f===0&&k('[^"]')),g!==null?d=[d,g]:(d=null,e=m)):(d=null,e=m),d!==null&&(d=function(a,b){return"\\"+b}(l,d[1])),d===null&&(e=l),d===null&&(/^[^"]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k('[^"]'))));c!==null?(b.charCodeAt(e)===34?(d='"',e++):(d=null,f===0&&k('"\\""')),d!==null?a=[a,c,d]:(a=null,e=j)):(a=null,e=j)}else a=null,e=j;a!==null&&(a=function(a,b){return b.join("")}(i,a[1])),a===null&&(e=i)}}}return f--,f===0&&a===null&&k("identifier"),a}function D(){var a,c;return c=e,b.substr(e,4).toLowerCase()==="node"?(a=b.substr(e,4),e+=4):(a=null,f===0&&k('"node"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function E(){var a,c;return c=e,b.substr(e,4).toLowerCase()==="edge"?(a=b.substr(e,4),e+=4):(a=null,f===0&&k('"edge"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function F(){var a,c;return c=e,b.substr(e,5).toLowerCase()==="graph"?(a=b.substr(e,5),e+=5):(a=null,f===0&&k('"graph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function G(){var a,c;return c=e,b.substr(e,7).toLowerCase()==="digraph"?(a=b.substr(e,7),e+=7):(a=null,f===0&&k('"digraph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function H(){var a,c;return c=e,b.substr(e,8).toLowerCase()==="subgraph"?(a=b.substr(e,8),e+=8):(a=null,f===0&&k('"subgraph"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function I(){var a,c;return c=e,b.substr(e,6).toLowerCase()==="strict"?(a=b.substr(e,6),e+=6):(a=null,f===0&&k('"strict"')),a!==null&&(a=function(a,b){return b.toLowerCase()}(c,a)),a===null&&(e=c),a}function J(){var a,b;return a=F(),a===null&&(b=e,a=G(),a!==null&&(a=function(a,b){return P=b==="digraph",b}(b,a)),a===null&&(e=b)),a}function K(){var a,c;f++,/^[ \t\r\n]/.test(b.charAt(e))?(c=b.charAt(e),e++):(c=null,f===0&&k("[ \\t\\r\\n]"));if(c!==null){a=[];while(c!==null)a.push(c),/^[ \t\r\n]/.test(b.charAt(e))?(c=b.charAt(e),e++):(c=null,f===0&&k("[ \\t\\r\\n]"))}else a=null;return f--,f===0&&a===null&&k("whitespace"),a}function L(){var a,c,d,g,h,i,j;f++,h=e,b.substr(e,2)==="//"?(a="//",e+=2):(a=null,f===0&&k('"//"'));if(a!==null){c=[],/^[^\n]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[^\\n]"));while(d!==null)c.push(d),/^[^\n]/.test(b.charAt(e))?(d=b.charAt(e),e++):(d=null,f===0&&k("[^\\n]"));c!==null?a=[a,c]:(a=null,e=h)}else a=null,e=h;if(a===null){h=e,b.substr(e,2)==="/*"?(a="/*",e+=2):(a=null,f===0&&k('"/*"'));if(a!==null){c=[],i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null -,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);while(d!==null)c.push(d),i=e,j=e,f++,b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),f--,d===null?d="":(d=null,e=j),d!==null?(b.length>e?(g=b.charAt(e),e++):(g=null,f===0&&k("any character")),g!==null?d=[d,g]:(d=null,e=i)):(d=null,e=i);c!==null?(b.substr(e,2)==="*/"?(d="*/",e+=2):(d=null,f===0&&k('"*/"')),d!==null?a=[a,c,d]:(a=null,e=h)):(a=null,e=h)}else a=null,e=h}return f--,f===0&&a===null&&k("comment"),a}function M(){var a;return a=K(),a===null&&(a=L()),a}function N(a){a.sort();var b=null,c=[];for(var d=0;d<a.length;d++)a[d]!==b&&(c.push(a[d]),b=a[d]);return c}function O(){var a=1,c=1,d=!1;for(var f=0;f<Math.max(e,g);f++){var h=b.charAt(f);h==="\n"?(d||a++,c=1,d=!1):h==="\r"||h==="\u2028"||h==="\u2029"?(a++,c=1,d=!0):(c++,d=!1)}return{line:a,column:c}}function Q(a,b){var c={};for(var d in a)c[d]=a[d];for(var d in b)c[d]=b[d];return c}var d={start:l,stmtList:m,stmt:n,attrStmt:o,inlineAttrStmt:p,nodeStmt:q,edgeStmt:r,subgraphStmt:s,attrList:t,attrListBlock:u,aList:v,edgeRHS:w,idDef:x,nodeIdOrSubgraph:y,nodeId:z,port:A,compassPt:B,id:C,node:D,edge:E,graph:F,digraph:G,subgraph:H,strict:I,graphType:J,whitespace:K,comment:L,_:M};if(c!==undefined){if(d[c]===undefined)throw new Error("Invalid rule name: "+a(c)+".")}else c="start";var e=0,f=0,g=0,h=[],P,R=d[c]();if(R===null||e!==b.length){var S=Math.max(e,g),T=S<b.length?b.charAt(S):null,U=O();throw new this.SyntaxError(N(h),T,S,U.line,U.column)}return R},toSource:function(){return this._source}};return b.SyntaxError=function(b,c,d,e,f){function g(b,c){var d,e;switch(b.length){case 0:d="end of input";break;case 1:d=b[0];break;default:d=b.slice(0,b.length-1).join(", ")+" or "+b[b.length-1]}return e=c?a(c):"end of input","Expected "+d+" but "+e+" found."}this.name="SyntaxError",this.expected=b,this.found=c,this.message=g(b,c),this.offset=d,this.line=e,this.column=f},b.SyntaxError.prototype=Error.prototype,b}()})(); \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css deleted file mode 100644 index aedd8d1a915..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.css +++ /dev/null @@ -1,30 +0,0 @@ -.com { color: #93a1a1; } -.lit { color: #195f91; } -.pun, .opn, .clo { color: #93a1a1; } -.fun { color: #dc322f; } -.str, .atv { color: #D14; } -.kwd, .linenums .tag { color: #1e347b; } -.typ, .atn, .dec, .var { color: teal; } -.pln { color: #48484c; } - -.prettyprint { - padding: 8px; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -.prettyprint.linenums { - -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; - box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; -} - -/* Specify class=linenums on a pre to get line numbering */ -ol.linenums { - margin: 0 0 0 33px; /* IE indents via margin-left */ -} -ol.linenums li { - padding-left: 12px; - color: #bebec5; - line-height: 18px; - text-shadow: 0 1px 0 #fff; -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js deleted file mode 100644 index eef5ad7e6a0..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/assets/js/google-code-prettify/prettify.js +++ /dev/null @@ -1,28 +0,0 @@ -var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; -(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= -[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c< -f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&& -(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r= -{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length, -t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b=== -"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), -l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, -q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, -q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, -"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), -a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} -for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value", -m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m= -a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue= -j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], -"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], -H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], -J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ -I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), -["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", -/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), -["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", -hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b= -!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m, -250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit", -PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})(); diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html deleted file mode 100644 index 1d4dbb27a8e..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/index.html +++ /dev/null @@ -1,92 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <title>Sample Graph</title> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content="Displays NGS sample graphs"> - <meta name="author" content="ETH | CISD"> - - <!-- openBIS --> - <link href="assets/css/openbis.css" rel="stylesheet"> - <script src="/openbis/resources/js/jquery.js"></script> - <script src="/openbis/resources/js/openbis.js"></script> - <script src="/openbis/resources/js/openbis-login.js"></script> - <script src="assets/js/d3/d3.js"></script> - <script src="assets/js/dagre/dagre.js"></script> - <script src="webapp.js"></script> - <script type="text/javascript"> - // If this is being shown, we are logged in, so just enter the app. - $(document).ready(function() { - enterApp(); - }); - </script> - - <!-- Le styles --> - <link href="assets/css/bootstrap.css" rel="stylesheet"> - <style> - body { - padding-top: 60px; /* 60px to make the container go all the way to the bottom of the topbar */ - } - </style> - <link href="assets/css/bootstrap-responsive.css" rel="stylesheet"> - - <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> - <!--[if lt IE 9]> - <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script> - <![endif]--> - - <!-- Le fav and touch icons --> - <link rel="shortcut icon" href="assets/ico/favicon.ico"> - <link rel="apple-touch-icon-precomposed" sizes="144x144" href="assets/ico/apple-touch-icon-144-precomposed.png"> - <link rel="apple-touch-icon-precomposed" sizes="114x114" href="assets/ico/apple-touch-icon-114-precomposed.png"> - <link rel="apple-touch-icon-precomposed" sizes="72x72" href="assets/ico/apple-touch-icon-72-precomposed.png"> - <link rel="apple-touch-icon-precomposed" href="assets/ico/apple-touch-icon-57-precomposed.png"> - </head> - - <body> - <div id="main"> - <div class="navbar navbar-fixed-top"> - <div class="navbar-inner"> - <div class="container-fluid"> - <a class="brand">Sample Graph</a> - <ul class="nav"> - <li class="active"><a id="bottom-up">Bottom Up</a></li> - <li><a id="top-down">Top Down</a></li> - </ul> - <ul class="nav"> - <li class="active"><a id="with-colors">Colors</a></li> - <li><a id="no-colors">B&W</a></li> - </ul> - <ul class="nav"> - <li class="active"><a id="space-saving">Space Saving</a></li> - <li><a id="space-filling">Space Filling</a></li> - </ul> - </div> - </div> - </div> - - <div class="container-fluid"> - <h1 id="root-label"></h1> - </div> <!-- /container --> - </div> <!-- /main --> - <div id="root" style="padding-left: 25px"></div> - - <!-- Le javascript - ================================================== --> - <!-- Placed at the end of the document so the pages load faster --> - <script src="assets/js/bootstrap-transition.js"></script> - <script src="assets/js/bootstrap-alert.js"></script> - <script src="assets/js/bootstrap-modal.js"></script> - <script src="assets/js/bootstrap-dropdown.js"></script> - <script src="assets/js/bootstrap-scrollspy.js"></script> - <script src="assets/js/bootstrap-tab.js"></script> - <script src="assets/js/bootstrap-tooltip.js"></script> - <script src="assets/js/bootstrap-popover.js"></script> - <script src="assets/js/bootstrap-button.js"></script> - <script src="assets/js/bootstrap-collapse.js"></script> - <script src="assets/js/bootstrap-carousel.js"></script> - <script src="assets/js/bootstrap-typeahead.js"></script> - - </body> -</html> diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js deleted file mode 100644 index f70bf771b60..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/html/webapp.js +++ /dev/null @@ -1,1064 +0,0 @@ -/** - * Sample-Relationship Bottom Up Webapp - * - * This webapp draws a graph emanating from a flowcell and terminating at the biological sample. - * - * Because the structure is rigid, it draws each sample type in its own column. - */ - -// -// BEGIN CONFIGURATION PARAMTERS -// -// The following parameters must be configured for the webapp - -var FLOWCELL_SAMPLE_TYPE = "FLOWCELL"; -var FLOWLANE_SAMPLE_TYPE = "FLOWLANE"; - -// The view is organized in columns that correspond to a sample type. The columns are defined here. -// The order of the sample types here matches the bottom-up order of the sample types. -var COLUMNS = [ - { type : FLOWCELL_SAMPLE_TYPE, label : "Flowcell", width : 200 }, - { type : FLOWLANE_SAMPLE_TYPE, label : "Flowlane", width : 200 }, - { type : "MULTIPLEX", label : "Multiplex", width : 300 }, - { type : "LIBRARY", label : "Library", width : 240 }, - { type : "ALIQUOT", label : "Aliquot", width : 400 }, - { type : "SAMPLE", label : "Sample", width : 400 } -]; - -// The height of each line in the display -var LINE_HEIGHT = 20; - -// The first N columns are shown expanded when the webapp is started. The next are initially collapsed. -// N probably should not be less than 2 and certainly should not be less than 1. -var FIRST_COLLAPSED_COLUMN = 2; - -// The colors used for the different samples. The colors are used when one sample has multiple parents or children to disambiguate. -var sampleColors = d3.scale.category10(); -//var sampleColors = d3.scale.ordinal().range(['#999']); - -// The color used when the connection between two samples is unambiguous -var oneToOneColor = "#999" - -// END CONFIGURATION PARAMTERS - -/// The openbisServer we use for our data -var webappContext = new openbisWebAppContext(); - -// openbisServer is global -- index.html needs to refer to it. -openbisServer = new openbis('/openbis/openbis', '/datastore_server'); -openbisServer.useSession(webappContext.getSessionId()); - -function parseJson(jsonString) { return eval('(' + jsonString + ')'); } - -function flowcellIdFromFlowlaneId(flowlaneId) { return flowlaneId.split(":")[0]; } - -/** - * The node stores the information necessary for presenting the sample data in the graph. - */ -function SampleGraphNode(sample) { - this.identifier = sample.identifier; - this.properties = sample.properties; - this.permId = sample.permId; - this.nodeId = sample["@id"]; - this.sampleType = sample.sampleTypeCode; - this.children = []; - this.parents = []; - this.serverSample = sample; - this.arrayIndex = -1; -} - -SampleGraphNode.prototype.toString = function() { - return "[" + this.sampleType + ", " + this.identifier + ", " + this.permId + "]"; -}; - -/** - * The link stores the information necessary for drawing connections between nodes - */ -function SampleGraphEdge(source, target) { - this.source = source; - this.target = target; -} - -/** Break an identifier into a code and space */ -function codeAndSpaceFromIdentifier(identifier) { - var identifierTokens = identifier.split("/"); - var space, code; - if (identifierTokens.length > 2) { - space = identifierTokens[1]; - code = identifierTokens[2]; - } else { - space = null; - code = identifierTokens[1]; - } - return {space : space, code : code}; -} - - -/** - * The model that manages state and implements the operations for the sample graph. - */ -function SampleGraphModel() { - this.initializeModel(); -} - -SampleGraphModel.prototype.initializeModel = function() { - this.sampleIdentifier = webappContext.getEntityIdentifier(); - var codeAndSpace = codeAndSpaceFromIdentifier(this.sampleIdentifier); - this.sampleSpace = codeAndSpace.space; - this.sampleCode = codeAndSpace.code; - this.samplePermId = webappContext.getEntityPermId(); - this.sampleType = webappContext.getEntityType(); - var samplesByType = {}; - COLUMNS.forEach(function(column) { samplesByType[column.type] = [] }); - this.samplesByType = samplesByType; - this.flowcellsByIdentifier = {}; -} - -/** - * Request the data necessary to display the graph. - */ -SampleGraphModel.prototype.requestGraphData = function(callback) -{ - var matchClauses = [ {"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : (FLOWCELL_SAMPLE_TYPE == this.sampleType) ? this.sampleCode + "*" : this.sampleCode - }]; - - if (this.sampleSpace) { - matchClauses.push({"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "SPACE", - desiredValue : this.sampleSpace - }) - } - - - var sampleCriteria = { - matchClauses : matchClauses, - operator : "MATCH_ALL_CLAUSES" - }; - - var lexicalParent = this; - function coalesceResult(data) { - lexicalParent.coalesceGraphData(data); - lexicalParent.requestFlowcellData(callback) - } - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES", "ANCESTORS", "DESCENDANTS"], coalesceResult); -} - -/** - * In most cases, we need an additional server request to get the flowcell data. Make that call here. - */ -SampleGraphModel.prototype.requestFlowcellData = function(callback) { - if (FLOWCELL_SAMPLE_TYPE == this.sampleType) { - callback(); - return; - } - - // Collect the Flowcell code and spaces - var flowlaneIds = []; - this.samplesByType[FLOWLANE_SAMPLE_TYPE].forEach(function(flowlane) { - var flowcellId = flowcellIdFromFlowlaneId(flowlane.identifier); - var codeAndSpace = codeAndSpaceFromIdentifier(flowcellId); - flowlaneIds.push(codeAndSpace); - }); - - var matchClauses = []; - flowlaneIds.forEach(function(cs) { - matchClauses.push({"@type" : "AttributeMatchClause", - fieldType : "ATTRIBUTE", - attribute : "CODE", - desiredValue : cs.code - }) - }) - - var sampleCriteria = { - matchClauses : matchClauses, - operator : "MATCH_ANY_CLAUSES" - }; - - var lexicalParent = this; - function coalesceResult(data) { - lexicalParent.coalesceGraphData(data); - callback(); - } - - openbisServer.searchForSamplesWithFetchOptions(sampleCriteria, ["PROPERTIES"], coalesceResult); - -}; - - -/** - * Request the data necessary to display the graph. - */ -SampleGraphModel.prototype.coalesceGraphData = function(data, callback) { - var samples = data.result; - var nodesById = {}; - - function isPureId(sample) { return null == sample["@id"]; } - - function nodeForSample(sample) { return isPureId(sample) ? nodesById[sample] : nodesById[sample["@id"]]; } - - var lexicalParent = this; - function convertSampleToNode(sample) { - // This is just a nodeId, it will be converted elsewhere - if (isPureId(sample)) return; - // This has already been converted - if (nodesById[sample.nodeId]) return; - - var node = new SampleGraphNode(sample); - nodesById[node.nodeId] = node; - sampleTypeArray = lexicalParent.samplesByType[node.sampleType] - if (sampleTypeArray) { - node.arrayIndex = sampleTypeArray.length; - sampleTypeArray.push(node); - } - if (FLOWCELL_SAMPLE_TYPE == node.sampleType) { - lexicalParent.flowcellsByIdentifier[node.identifier] = node; - } - - if (sample.parents) sample.parents.forEach(convertSampleToNode); - if (sample.children) sample.children.forEach(convertSampleToNode); - } - - function resolveParents(sample) { - // This is just a nodeId, it will be resolved elsewhere - if (isPureId(sample)) return; - if (!sample.parents) return; - - sample.parents.forEach(resolveParents); - - var node = nodeForSample(sample); - node.parents = sample.parents.map(nodeForSample); - node.parents.forEach(function(p) { p.children ? p.children.push(node) : p.children = [node]}); - node.parents.sort(function(a, b) { return a.identifier < b.identifier; }); - } - - function resolveChildren(sample) { - // This is just a nodeId, it will be resolved elsewhere - if (isPureId(sample)) return; - if (!sample.children) return; - - sample.children.forEach(resolveChildren); - - var node = nodeForSample(sample); - node.children = sample.children.map(nodeForSample); - node.children.forEach(function(p) { p.parents ? p.parents.push(node) : p.parents = [node]}); - node.children.sort(function(a, b) { return a.identifier < b.identifier; }) - } - - samples.forEach(convertSampleToNode); - samples.forEach(resolveParents); - samples.forEach(resolveChildren); - - // The parents of the flowlanes should become the parents of the flowcell and the - // flowcell should become the parent of the flowlanes. - var flowcellsByIdentifier = this.flowcellsByIdentifier; - this.samplesByType[FLOWLANE_SAMPLE_TYPE].forEach(function(flowlane) { - var flowcellId = flowcellIdFromFlowlaneId(flowlane.identifier); - var flowcell = flowcellsByIdentifier[flowcellId]; - if (flowcell) { - flowcell.parents.push(flowlane); - flowlane.children.push(flowcell); - } - }); -} - - -/** - * The presenter that shows the model. - */ -function SampleGraphPresenter(model) { - this.model = model; - this.selectedNode = null; - this.didCreateVis = false; - this.useSpaceSavingRenderer(); - this.useBottomUpMode(); - this.useWithColorsMode(); - this.initializePresenter(); -} - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -SampleGraphPresenter.prototype.initializePresenter = function() -{ - if (this.didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - this.root = d3.select("#root"); - this.rootLabel = d3.select("#root-label"); - this.rootLabel.text(this.model.sampleIdentifier); - this.didCreateVis = true; -} - -SampleGraphPresenter.prototype.useSpaceSavingRenderer = function() { - this.renderer = new SimpleGraphRenderer(); -} - -SampleGraphPresenter.prototype.useSpaceFillingRenderer = function() { - this.renderer = new DagreGraphRenderer(); -} - -SampleGraphPresenter.prototype.isSpaceSavingMode = function() { - return this.renderer instanceof SimpleGraphRenderer; -} - -SampleGraphPresenter.prototype.isSpaceFillingMode = function() { - return this.renderer instanceof DagreGraphRenderer; -} - -SampleGraphPresenter.prototype.clear = function() { - this.root.selectAll("svg").remove(); -}; - -SampleGraphPresenter.prototype.calcuateVisibleColumnOffsets = function() { - // Calculate the offsets for the columns -- only need to do this once - var xOffset = 0; - - // Depending on whether or not we are viewing top down or bottom up, the visible columns are those - // before and including the selected sample type, or those after and including the sample type, respectively. - var querySampleType = model.sampleType; - var seenQuerySampleType = false; - var bottomUpMode = this.bottomUpMode; - var visibleColumns = []; - COLUMNS.forEach(function(col, i) { - var atQuerySampleType = col.type == querySampleType; - if (atQuerySampleType) { - visibleColumns.push(col); - } else { - var includeCol = seenQuerySampleType && bottomUpMode; - includeCol = includeCol || !seenQuerySampleType && !bottomUpMode; - if (includeCol) visibleColumns.push(col) - } - seenQuerySampleType = seenQuerySampleType || atQuerySampleType; - }) - - if (!bottomUpMode) visibleColumns = visibleColumns.reverse(); - this.visibleColumns = visibleColumns; - this.visibleColumns.forEach(function(column) { column.xOffset = xOffset; xOffset += column.width }); -}; - -/** - * Put the presenter in the bottom-up display mode (compared to top-down) - */ -SampleGraphPresenter.prototype.useBottomUpMode = function() { - this.bottomUpMode = true; - this.calcuateVisibleColumnOffsets(); -}; - -/** - * Put the presenter in the top-down display mode (compared to bottom-up) - */ -SampleGraphPresenter.prototype.useTopDownMode = function() { - this.bottomUpMode = false; - this.calcuateVisibleColumnOffsets(); -}; - -SampleGraphPresenter.prototype.useWithColorsMode = function() { - this.withColorsMode = true; - sampleColors = d3.scale.category10(); -}; - -SampleGraphPresenter.prototype.useNoColorsMode = function() { - this.withColorsMode = false; - sampleColors = d3.scale.ordinal().range(['#999']); -}; - -/** - * Return a function that gives the outgoing edges for a sample. - * - * The outgoing edges depends on whether the view is top-down or bottom-up - */ -SampleGraphPresenter.prototype.outEdgesFunction = function() { - var bottomUpMode = this.bottomUpMode; - return function(samp) { return bottomUpMode ? samp.parents : samp.children } -} - -/** - * Return a function that gives the incoming edges for a sample. - * - * The incoming edges depends on whether the view is top-down or bottom-up - */ -SampleGraphPresenter.prototype.inEdgesFunction = function() { - var bottomUpMode = this.bottomUpMode; - return function(samp) { return bottomUpMode ? samp.children : samp.parents } -} - -/** - * Initialize the sample nodes - */ -SampleGraphPresenter.prototype.initializeGraphSamples = function() -{ - var colors = sampleColors; - var nodes = this.visibleColumns.map(function(c) { return model.samplesByType[c.type] }); - var outEdgesGetter = this.outEdgesFunction(); - var inEdgesGetter = this.inEdgesFunction(); - // Compute the x/y coordinates for each sample - for (var col = 0; col < nodes.length; ++col) { - var colData = nodes[col]; - var xOffset = this.visibleColumns[col].xOffset; - var width = this.visibleColumns[col].width; - for (row = 0; row < colData.length; ++row) { - var sampleData = colData[row]; - sampleData.col = col; - sampleData.row = row; - sampleData.colOffset = xOffset; - var outEdges = outEdgesGetter(sampleData); - var oneEdgeOrLess = outEdges.length < 2; - var connectedNodesWithMultipleInEdges = outEdges.filter(function(c) { return inEdgesGetter(c).length > 1 }); - var oneToOne = oneEdgeOrLess && connectedNodesWithMultipleInEdges.length == 0; - sampleData.color = (!oneToOne) ? colors(row) : oneToOneColor; - sampleData.userEdgesVisible = null; - sampleData.edgesVisible = col + 1 < FIRST_COLLAPSED_COLUMN; - } - } - this.allNodes = nodes; -} - -SampleGraphPresenter.prototype.updateVisibility = function() { - // Turn off visibility on all nodes except the root node - this.allNodes.forEach(function(samps) { - samps.forEach(function(s) { s.visible = s.identifier == model.sampleIdentifier; }) - }); - var outEdgesGetter = this.outEdgesFunction(); - // Figure out if the nodes should be visible - this.allNodes.forEach(function(samps) { - samps.forEach(function(sample) { - if (null != sample.userEdgesVisible) sample.edgesVisible = sample.userEdgesVisible; - var showChildren = sample.visible && sample.edgesVisible; - if (!showChildren) return; - outEdgesGetter(sample).forEach(function(c) { - c.visible = true; - // Nodes with only one outgoing edge should show their connected node as well, unless the user requests otherwise - if (outEdgesGetter(c).length == 1) { - c.edgesVisible = (null == c.userEdgesVisible) ? true : c.userEdgesVisible; - } - }); - }) - }); -} - -SampleGraphPresenter.prototype.updateEdges = function() { - var edges = []; - var outEdgesGetter = this.outEdgesFunction(); - this.allNodes.forEach(function(samps) { - samps.forEach(function(d) { - if (!d.visible) return; - outEdgesGetter(d).forEach(function(c) { if (c.visible) edges.push(new SampleGraphEdge(d, c))}); - }) - }); - - this.edges = edges; -} - -SampleGraphPresenter.prototype.updateNodes = function() { - var nodes = this.allNodes.map(function(d) { return d.filter(function(n) { return n.visible })}); - nodes.forEach(function(samps) { samps.forEach(function(s, i) { s.visibleIndex = i })}); - this.nodes = nodes; -} - -SampleGraphPresenter.prototype.updateState = function() -{ - // These need to be done in this order - this.updateVisibility(); - this.updateNodes(); - this.updateEdges(); -} - -/** - * Display the sample nodes. - */ -SampleGraphPresenter.prototype.draw = function() -{ - this.renderer.draw(); -} - -SampleGraphPresenter.prototype.toggleExpand = function(svgNode, d) { - // toggle visiblity - d.userEdgesVisible = (null == d.userEdgesVisible) ? !d.edgesVisible :!d.userEdgesVisible; - this.selectedNode = svgNode.parentNode; - this.draw(); -} - -SampleGraphPresenter.prototype.openSample = function(svgNode, d) { - var url = "/openbis/index.html?viewMode=SIMPLE#entity=SAMPLE&permId=" + d.permId; - window.open(url, '_blank'); -} - -function displayActiveMode(active, inactive) { - active.parent().addClass("active"); - inactive.parent().removeClass("active"); -} - -function clickedBottomUp() { - if (presenter.bottomUpMode) return; - - displayActiveMode($('#bottom-up'), $('#top-down')); - presenter.useBottomUpMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedTopDown() { - if (!presenter.bottomUpMode) return; - - displayActiveMode($('#top-down'), $('#bottom-up')); - presenter.useTopDownMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedWithColors() { - if (presenter.withColorsMode) return; - - displayActiveMode($('#with-colors'), $('#no-colors')); - presenter.useWithColorsMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedNoColors() { - if (!presenter.withColorsMode) return; - - displayActiveMode($('#no-colors'), $('#with-colors')); - presenter.useNoColorsMode(); - presenter.initializeGraphSamples(); - presenter.draw(); -} - -function clickedSpaceSaving() { - if (presenter.isSpaceSavingMode()) return; - - displayActiveMode($('#space-saving'), $('#space-filling')); - presenter.useSpaceSavingRenderer(); - presenter.initializeGraphSamples(); - presenter.clear(); - presenter.draw(); -} - -function clickedSpaceFilling() { - if (presenter.isSpaceFillingMode()) return; - - displayActiveMode($('#space-filling'), $('#space-saving')); - presenter.useSpaceFillingRenderer(); - presenter.initializeGraphSamples(); - presenter.clear(); - presenter.draw(); -} - -function textBBoxForGraphNode(node) { - var element = presenter.renderer.columns.selectAll("text.sample")[node.col][node.visibleIndex]; - if (!element) return {x: node.colOffset, y: 0, width : 0, height : 0 }; - var bbox = element.getBBox(); - // Correct for the column - bbox.x += node.colOffset; - return bbox; -} - -function textBBoxForDomNode(node) { - var bbox = node.parentNode.childNodes[0].getBBox(); - return bbox; -} - -function translate(x, y) { - return "translate(" + x + "," + y + ")"; -} - -function countInLinksOfSameType(d) { - var type = d.sampleType; - var count = 0; - var outEdges = presenter.inEdgesFunction(); - outEdges(d).forEach(function(edge) { - if (edge.sampleType == type) count++; - }); - return count; -} - -var yLinkOffset = LINE_HEIGHT * 0.33; - - -/** - * A class that renders the graph - */ -function SimpleGraphRenderer() { - // Function used to draw paths between elements - function end(d) { - // Find the associated text node in the DOM and use that as a basis for creating the edges - var bbox = textBBoxForGraphNode(d); - return { x : bbox.x + bbox.width + 7, y : bbox.y + yLinkOffset }; - } - function start(d) { - var bbox = textBBoxForGraphNode(d); - return { x : bbox.x, y : bbox.y + yLinkOffset } - } - - this.useLineLinkPath(start, end); -} - -/** - * Draw edges using the diagonal function - */ -SimpleGraphRenderer.prototype.useDiagonalLinkPath = function(start, end) { - var diagonal = d3.svg.diagonal(); - diagonal.source(function(d) { return (countInLinksOfSameType(d.target) > 0) ? start(d.source) : end(d.source)}); - diagonal.target(function(d) { return start(d.target)}); - this.path = diagonal; -} - -/** - * Draw edges using the line function - */ -SimpleGraphRenderer.prototype.useLineLinkPath = function(start, end) { - var line = d3.svg.line(); - this.path = function(d) { - var src = (countInLinksOfSameType(d.target) > 0) ? start(d.source) : end(d.source); - var dst = start(d.target); - return line([[src.x, src.y], [dst.x, dst.y]]); - } -} - -SimpleGraphRenderer.prototype.updateNodeOffsets = function() -{ - var nodes = presenter.nodes; - function initializeOffsetsAtLevel(level) { - level.forEach(function(d) { d.xOffset = countInLinksOfSameType(d) * 20; }); - } - nodes.forEach(initializeOffsetsAtLevel) -}; - -/** - * Display the sample nodes. - */ -SimpleGraphRenderer.prototype.draw = function() -{ - presenter.updateState(); - this.updateNodeOffsets(); - var nodes = presenter.nodes; - - // Display the graph in an SVG element - this.viz = presenter.root.selectAll("svg").data([nodes]); - // Code under enter is run if there is no HTML element for a data element - this.viz.enter().append("svg:svg").attr("class", "viz"); - - // Columns - this.columns = this.viz.selectAll("g").data(function(d) { return d }); - this.columns.enter().append("svg:g").attr("class", "column"); - this.columns.exit().remove(); - this.columns.attr("transform", function(d, i) { return "translate(" + presenter.visibleColumns[i].xOffset + ", 0)"}); - this.drawHeaders(); - this.drawNodes(); - this.drawEdges(); - - - var vizHeight = (d3.max(nodes, function(d) { return d.length}) + 1) * LINE_HEIGHT + 5; - var vizWidth = d3.sum(presenter.visibleColumns, function(column) { return column.width }); - this.viz.attr("width", vizWidth); - this.viz.attr("height", vizHeight); -} - -/** - * Draw the headers - */ -SimpleGraphRenderer.prototype.drawHeaders = function() -{ - var header = this.columns.selectAll("text.header").data(function(d, i) { return [presenter.visibleColumns[i]] }); - header.enter().append("svg:text") - .attr("class", "header") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("font-weight", "bold"); - header - .text(function(d) { return d.label }); -} - -/** - * Draw the nodes - */ -SimpleGraphRenderer.prototype.drawNodes = function() -{ - var outEdgesGetter = presenter.outEdgesFunction(); - var sample = this.columns.selectAll("text.sample").data(function(d) { return d }); - sample.enter().append("svg:text") - .attr("class", "sample") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("cursor", "pointer") - .on("click", function(d) { presenter.openSample(this, d) }) - .transition() - .style("opacity", 1); - sample.exit() - .transition() - .style("opacity", 0).remove(); - sample - .attr("x", function(d, i) { return d.xOffset; }) - .attr("y", function(d, i) { return LINE_HEIGHT * (i+2)}) - - .text(function(d) { return d.identifier }); - - var ring = this.columns.selectAll("circle.ring").data(function(d) { return d }); - ring.enter().append("svg:circle") - .attr("class", "ring") - .attr("pointer-events", "all") - .attr("r", 0) - .style("cursor", "pointer") - .style("stroke-width", "2px") - ring.exit() - .transition() - .style("opacity", 0).remove(); - ring - .attr("cx", function(d) { return textBBoxForGraphNode(d).width + d.xOffset + 7 }) - .attr("cy", function(d, i) { return LINE_HEIGHT * (i+2) - yLinkOffset}) - .style("fill", function(d) { return d.edgesVisible ? "none" : d.color}) - .style("stroke", function(d) { return d.color}) - .on("click", function(d) { presenter.toggleExpand(this, d) }); - ring - .transition() - .style("opacity", function(d) { return outEdgesGetter(d).length > 0 ? 1 : 0 }) - .attr("r", 5); -} - -/** - * Draw the edges - */ -SimpleGraphRenderer.prototype.drawEdges = function() -{ - var link = this.viz.selectAll("path.link").data(presenter.edges); - link.enter().append("svg:path") - .attr("class", "link") - .attr("pointer-events", "none") - .style("fill", "none") - .style("stroke-width", "1.5px") - .transition() - .style("opacity", 1); - link.exit() - .transition() - .style("opacity", 0).remove(); - link - .style("stroke", function(d) { return d.source.color}) - .attr("d", this.path); -} - -/** - * A class that renders the graph using dagre. - */ -function DagreGraphRenderer() { - // Function used to draw paths between elements - function source(d) { - var dagre = d.source.dagre; - return { x : dagre.x + dagre.width + 9, y : dagre.y + (dagre.height / 2) + 5 }; - } - function target(d) { - var dagre = d.target.dagre; - return { x : dagre.x, y : dagre.y + (dagre.height / 2) + 5}; - } - - this.useLineLinkPath(source, target); -} - -/** - * Draw edges using the diagonal function - */ -DagreGraphRenderer.prototype.useDiagonalLinkPath = function(source, target) { - var diagonal = d3.svg.diagonal(); - diagonal.source(source); - diagonal.target(target); - this.path = diagonal; -} - -/** - * Draw edges using the line function - */ -DagreGraphRenderer.prototype.useLineLinkPath = function(source, target) { - var line = d3.svg.line(); - this.path = function(d) { - var src = source(d); - var dst = target(d); - return line([[src.x, src.y], [dst.x, dst.y]]); } -} - -var RANK_SEPARATION = 50; - -DagreGraphRenderer.prototype.normalizeNodeYPos = function() -{ - var nodes = presenter.nodes; - function dagrey(node) { return node.dagre.y } - // Look at all the nodes and the edges and fix the height so that nodes of the same type form a row - minmaxy = nodes.map(function(d) { return [ d3.min(d, dagrey), d3.max(d, dagrey) ]}); - miny = [minmaxy[0][0]]; - // Look the levels as pairs and ensure that the min of level i+1 is > min of level i - minmaxy.reduce(function(a,b) { - var bcopy = b.slice(0); - if (bcopy[0] < a[1] + RANK_SEPARATION) { - bcopy[0] = a[1] + RANK_SEPARATION; - if (bcopy[1] < bcopy[0]) bcopy[1] = bcopy[0] + RANK_SEPARATION; - } - miny.push(bcopy[0]); - return bcopy; - }); - nodes.forEach(function(group, i) { group.forEach(function(node) { - // look at the nodes in this group. Leave the ones that have parents/children within the group alone. - // Change the y position for the other ones - if (node.dagre.y < miny[i]) node.dagre.y = miny[i]; - })}); -} - -DagreGraphRenderer.prototype.normalizeNodeXPos = function() -{ - var nodes = presenter.nodes; - function computeMinX() { - function dagrex(node) { return node.dagre.x } - function dagrexwidth(node) { return node.dagre.x + node.dagre.width } - // Look at all the nodes and the edges and fix the x pos so that nodes of the same type form a column - minmaxx = nodes.map(function(d) { return [ d3.min(d, dagrex), d3.max(d, dagrexwidth) ]}); - minx = [minmaxx[0][0]]; - // Look the levels as pairs and ensure that the min of level i+1 is > min of level i - minmaxx.reduce(function(a,b) { - var bcopy = b.slice(0); - if (bcopy[0] < a[1] + RANK_SEPARATION) { - bcopy[0] = a[1] + RANK_SEPARATION; - if (bcopy[1] < bcopy[0]) bcopy[1] = bcopy[0] + RANK_SEPARATION; - } - minx.push(bcopy[0]); - return bcopy; - }); - return minx; - } - - var minx = computeMinX(); - nodes.forEach(function(group, i) { group.forEach(function(node) { - // look at the nodes in this group. Leave the ones that have parents/children within the group alone. - // Change the y position for the other ones - if (node.dagre.x < minx[i]) { - node.dagre.x = minx[i]; - minx = computeMinX(); - } - })}); -} - -/** - * Display the sample nodes. - */ -DagreGraphRenderer.prototype.draw = function() -{ - presenter.updateState(); - var nodes = presenter.nodes; - - var viz; - // Display the graph in an SVG element - viz = presenter.root.selectAll("svg").data([nodes]); - this.viz = viz; - // Code under enter is run if there is no HTML element for a data element - viz.enter().append("svg:svg") - .attr("class", "viz") - // Create an arrowhead to put to the lines - .append("svg:defs").append("svg:marker") - .attr("id", "arrowhead") - .attr("viewBox", "0 0 10 10") - .attr("refX", "8") - .attr("refY", "5") - .attr("markerUnits", "strokeWidth") - .attr("markerHeight", "5") - .attr("orient", "auto") - .style("fill", "#333") - .append("svg:path").attr("d", "M 0 0 L 10 5 L 0 10 z"); - - // Edges -- this has to come before the nodes so that the edges are under the nodes - this.edges = this.viz.selectAll("g.edge").data([0]); - this.edges.enter().append("svg:g").attr("class", "edge"); - this.edges.exit().remove(); - - // Columns - this.columns = this.viz.selectAll("g.column").data(function(d) { return d }); - this.columns.enter().append("svg:g").attr("class", "column"); - this.columns.exit().remove(); - - // Draw the nodes so we get the bounding boxes for the nodes - this.initialDrawNodes(); - - var dagreNodes = [] - presenter.nodes.forEach(function(nodeGroup) { nodeGroup.forEach(function(d) { dagreNodes = dagreNodes.concat(d) }) }); - - dagre.layout() - .nodeSep(RANK_SEPARATION) - .edgeSep(10) - .rankSep(RANK_SEPARATION) - .rankDir("LR") - .nodes(dagreNodes) - .edges(presenter.edges) - .run(); - this.normalizeNodeXPos(); - this.redrawNodes(); - this.drawHeaders(); - this.drawEdges(); - - var vizWidth = d3.max(dagreNodes, function(d) { return d.dagre.x + d.dagre.width; }) - var vizHeight = d3.max(dagreNodes, function(d) { return d.dagre.y + d.dagre.height; }) - - // Resize the visualization - viz.attr("width", vizWidth + 20); // add space for the ring at the end - viz.attr("height", vizHeight + LINE_HEIGHT); // add a space to make it look less cramped - - // If the user clicked on a node, scroll to make it visible - if (presenter.selectedNode) { - // Figure out which element we need to scroll - var scrollWindow = (d3.select("#root").style("overflow") == "visible") - if (scrollWindow) { - var scrolledElt = $(window); - var left = $(presenter.selectedNode).position().left - 50; - scrolledElt.scrollLeft(left); - } else { - var scrolledElt = $("#root"); - var left = $(presenter.selectedNode).position().left + scrolledElt.scrollLeft() - 50; - scrolledElt.scrollLeft(left); - } - - // WebKit only - // presenter.selectedNode.scrollIntoViewIfNeeded(true); - - } -} - -/** - * Draw the headers - */ -DagreGraphRenderer.prototype.drawHeaders = function() -{ - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - var header = this.viz.selectAll("text.header").data(function(d, i) { return presenter.visibleColumns }); - header.enter().append("svg:text") - .attr("class", "header") - .attr("y", LINE_HEIGHT - 10) - .attr("text-anchor", "begin") - .style("font-weight", "bold"); - header.exit().remove(); - header - .attr("x", function(d, i) { - var nodesAtLevel = sampleNodeGroup[i]; - if (nodesAtLevel.length < 1) return 0; - if (!nodesAtLevel[0]) return 0; - var dagre = nodesAtLevel.filter(function(d) { return d != null }).map(function(d) { return d.__data__.dagre }); - - return d3.mean(dagre, function(d) { return d.x + (d.width * 0.5) }) - 1; - }) - .attr("opacity", function(d, i) { - var nodesAtLevel = sampleNodeGroup[i]; - if (nodesAtLevel.length < 1) return 0; - if (!nodesAtLevel[0]) return 0; - return 1; - }) - .text(function(d) { return d.label }); -} - -/** - * Draw the nodes - */ -DagreGraphRenderer.prototype.initialDrawNodes = function() -{ - var outEdgesGetter = presenter.outEdgesFunction(); - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - sampleNodeGroup.enter().append("svg:g") - .attr("class", "sample") - sampleNodeGroup - sampleNodeGroup.attr("transform", function(d, i) { return translate(0, LINE_HEIGHT * (i+1)) }); - sampleNodeGroup.exit() - .transition() - .style("opacity", 0).remove(); - - var sample = sampleNodeGroup.selectAll("text.sample").data(function(d) { return [d] }); - sample.enter().append("svg:text") - .attr("class", "sample") - .attr("x", "0") - .attr("y", LINE_HEIGHT) - .attr("text-anchor", "begin") - .style("cursor", "pointer") - .on("click", function(d) { presenter.openSample(this, d) }) - .transition() - .style("opacity", 1); - sample - .text(function(d) { return d.identifier }); - - var ring = sampleNodeGroup.selectAll("circle.ring").data(function(d) { return [d] }); - ring.enter().append("svg:circle") - .attr("class", "ring") - .attr("pointer-events", "all") - .attr("r", 0) - .style("cursor", "pointer") - .style("stroke-width", "2px") - ring - .attr("cx", function(d, i) { return textBBoxForDomNode(this).width + 7 }) - .attr("cy", function(d, i) { return textBBoxForDomNode(this).height - 1 }) - .style("fill", function(d) { return d.edgesVisible ? "none" : d.color}) - .style("stroke", function(d) { return d.color}) - .on("click", function(d) { presenter.toggleExpand(this, d) }); - ring - .transition() - .style("opacity", function(d) { return outEdgesGetter(d).length > 0 ? 1 : 0 }) - .attr("r", 5); - - // Update the bounding boxes - sampleNodeGroup.each(function(d) { - var bbox = this.getBBox(); - d.width = bbox.width; - d.height = bbox.height; - }); -} - -/** - * Move the nodes in their new positions. - */ -DagreGraphRenderer.prototype.redrawNodes = function() -{ - var sampleNodeGroup = this.columns.selectAll("g.sample").data(function(d) { return d }); - sampleNodeGroup - sampleNodeGroup.attr("transform", function(d, i) { return translate(d.dagre.x, d.dagre.y) }); -} - -/** - * Draw the edges - */ -DagreGraphRenderer.prototype.drawEdges = function() -{ - var link = this.edges.selectAll("path.link").data(presenter.edges); - link.enter().append("svg:path") - .attr("class", "link") - .attr("pointer-events", "none") - .style("fill", "none") - .style("stroke-width", "1.5px") - .attr("marker-end", "url(#arrowhead)") - .transition() - .style("opacity", 1); - link.exit() - .transition() - .style("opacity", 0).remove(); - link - .style("stroke", function(d) { return d.source.color}) - .attr("d", this.path); -} - - - -/// The model that manages state and implements the operations -var model; -model = new SampleGraphModel(); - -// The presenter tranlsates the model into visual elements -var presenter; - - -function enterApp(data) -{ - $('#bottom-up').click(clickedBottomUp); - $('#top-down').click(clickedTopDown); - $('#with-colors').click(clickedWithColors); - $('#no-colors').click(clickedNoColors); - $('#space-saving').click(clickedSpaceSaving); - $('#space-filling').click(clickedSpaceFilling); - presenter = new SampleGraphPresenter(model); - presenter.useBottomUpMode() - model.requestGraphData(function() { presenter.initializeGraphSamples(); presenter.draw() }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties deleted file mode 100644 index 8a3ed6bc2ae..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/as/webapps/sample-graph/plugin.properties +++ /dev/null @@ -1,7 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -label = Sample Graph -sorting = 1 -openbisui-contexts = sample-details-view -sample-entity-types = FLOWCELL, FLOWLANE, MULTIPLEX, LIBRARY, ALIQUOT, SAMPLE diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties deleted file mode 100644 index 4420c9f866f..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Sample Bottom Up Data -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService -script-path = sample-bottom-up.py \ No newline at end of file diff --git a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py b/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py deleted file mode 100644 index a698d3c98f5..00000000000 --- a/deep_sequencing_unit/source/core-plugins/ngs-sample-overview-graph/1/dss/reporting-plugins/sample-bottom-up-data/sample-bottom-up.py +++ /dev/null @@ -1,8 +0,0 @@ -"""An aggregation service that aggregates data for the sample-bottom-up display""" - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def aggregate(parameters, table_builder): - table_builder.addHeader("TEST") - row = table_builder.addRow() - row.setCell("TEST", "TEST") diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java deleted file mode 100644 index 8c1525261d5..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractor.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; - -/** - * Extension of {@link DefaultDataSetInfoExtractor} for DSU which tries to get version information from the content and store it into the data set - * property <code>ILLUMINA_GA_OUTPUT</code>. The path to the configuration file inside a flow cell folder is specified by the property - * <code>path-to-config-file</code>. Its default value is <code>Data/Intensities/config.xml</code>. - * <p> - * If version information couldn't be fetched a warning is logged. - * - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractor implements IDataSetInfoExtractor -{ - static final String VERSION_KEY = "ILLUMINA_PIPELINE_VERSION"; - - static final String PATH_TO_CONFIG_FILE_KEY = "path-to-config-file"; - - static final String DEFAULT_PATH_TO_CONFIG_FILE = "Data/Intensities/config.xml"; - - private final static Logger operationLog = - LogFactory.getLogger(LogCategory.OPERATION, DataSetInfoExtractor.class); - - private final IDataSetInfoExtractor dataSetInfoExtractor; - - private final String pathToConfigFile; - - private final Pattern pattern; - - public DataSetInfoExtractor(Properties properties) - { - dataSetInfoExtractor = new DefaultDataSetInfoExtractor(properties); - pathToConfigFile = properties.getProperty(PATH_TO_CONFIG_FILE_KEY, DEFAULT_PATH_TO_CONFIG_FILE); - pattern = Pattern.compile(".*<Software.*Version=('|\")(.*)('|\").*"); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - DataSetInformation info = - dataSetInfoExtractor.getDataSetInformation(incomingDataSetPath, openbisService); - File configFile = new File(incomingDataSetPath, pathToConfigFile); - if (configFile.isFile()) - { - String version = tryToExtractVersion(configFile); - if (version != null) - { - NewProperty property = new NewProperty(); - property.setPropertyCode(VERSION_KEY); - property.setValue(version); - info.setDataSetProperties(Arrays.asList(property)); - } else - { - operationLog.warn("No version found in config file '" + pathToConfigFile + "'."); - } - } else - { - operationLog.warn("Config file '" + pathToConfigFile - + "' does not exists or is a directory."); - } - return info; - } - - private String tryToExtractVersion(File configFile) - { - List<String> configFileContent = FileUtilities.loadToStringList(configFile); - for (String line : configFileContent) - { - Matcher matcher = pattern.matcher(line); - if (matcher.matches()) - { - return matcher.group(2); - } - } - return null; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java deleted file mode 100644 index 8c7cce90d6e..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneDataSetInfoExtractor.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.etlserver.DefaultDataSetInfoExtractor; -import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; - -/** - * @author Franz-Josef Elmer - */ -public class FlowLaneDataSetInfoExtractor implements IDataSetInfoExtractor -{ - static final String FLOW_LANE_NUMBER_SEPARATOR = "."; - - private final IDataSetInfoExtractor dataSetInfoExtractor; - - public FlowLaneDataSetInfoExtractor(Properties properties) - { - dataSetInfoExtractor = new DefaultDataSetInfoExtractor(properties); - } - - @Override - public DataSetInformation getDataSetInformation(File incomingDataSetPath, - IEncapsulatedOpenBISService openbisService) throws UserFailureException, - EnvironmentFailureException - { - DataSetInformation dataSetInformation = - dataSetInfoExtractor.getDataSetInformation(incomingDataSetPath, openbisService); - String sampleCode = dataSetInformation.getSampleCode(); - if (sampleCode != null) - { - dataSetInformation.setSampleCode(sampleCode.replace(FLOW_LANE_NUMBER_SEPARATOR, - SampleIdentifier.CONTAINED_SAMPLE_CODE_SEPARARTOR_STRING)); - } - return dataSetInformation; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java deleted file mode 100644 index 99234754d47..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeeder.java +++ /dev/null @@ -1,493 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.io.FileFilter; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.Set; - -import org.apache.commons.io.FilenameUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.DateFormatUtils; -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.concurrent.ConcurrencyUtilities; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FastRecursiveHardLinkMaker; -import ch.systemsx.cisd.common.filesystem.FileConstants; -import ch.systemsx.cisd.common.filesystem.FileOperations; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.filesystem.IImmutableCopier; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.process.ProcessExecutionHelper; -import ch.systemsx.cisd.common.process.ProcessIOStrategy; -import ch.systemsx.cisd.common.process.ProcessResult; -import ch.systemsx.cisd.common.properties.ExtendedProperties; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.common.time.TimingParameters; -import ch.systemsx.cisd.etlserver.AbstractPostRegistrationDataSetHandlerForFileBasedUndo; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.dss.generic.shared.utils.RSyncConfig; -import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * Post registration data set handler which makes a hard-link copy of all flow-lane files to associated drop boxes. - * - * @author Franz-Josef Elmer - */ -class FlowLaneFeeder extends AbstractPostRegistrationDataSetHandlerForFileBasedUndo -{ - static final String META_DATA_FILE_TYPE = ".tsv"; - - static final String META_DATA_FILE_PREFIX = "meta-data-file-prefix"; - - static final String TRANSFER_PREFIX = "transfer."; - - static final String AFFILIATION_KEY = "AFFILIATION"; - - static final String DATA_TRANSFERRED = "DATA_TRANSFERRED"; - - static final String EXTERNAL_SAMPLE_NAME_KEY = "EXTERNAL_SAMPLE_NAME"; - - static final String FLOW_LANE_DROP_BOX_TEMPLATE = "flow-lane-drop-box-template"; - - static final String SRF_INFO_PATH = "srf-info-path"; - - static final String ENTITY_SEPARATOR_KEY = "entity-separator"; - - static final String DEFAULT_ENTITY_SEPARATOR = "_"; - - static final String SRF_FILE_EXTENSION = "srf"; - - private final static Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - FlowLaneFeeder.class); - - private final IEncapsulatedOpenBISService service; - - private final MessageFormat flowLaneDropBoxTemplate; - - private final String metaDataFilePrefix; - - private final String entitySepaparator; - - private final IImmutableCopier copier; - - private final Map<String, File> transferDropBoxes = new HashMap<String, File>(); - - private final String srfInfoPathOrNull; - - private boolean updateDataTransferredProperty = true; - - FlowLaneFeeder(Properties properties, IEncapsulatedOpenBISService service) - { - super(FileOperations.getInstance()); - this.service = service; - flowLaneDropBoxTemplate = - new MessageFormat(PropertyUtils.getMandatoryProperty(properties, - FLOW_LANE_DROP_BOX_TEMPLATE)); - metaDataFilePrefix = PropertyUtils.getMandatoryProperty(properties, META_DATA_FILE_PREFIX); - entitySepaparator = properties.getProperty(ENTITY_SEPARATOR_KEY, DEFAULT_ENTITY_SEPARATOR); - srfInfoPathOrNull = properties.getProperty(SRF_INFO_PATH); - if (srfInfoPathOrNull != null) - { - File srfInfo = new File(srfInfoPathOrNull); - if (srfInfo.isFile() == false) - { - throw new ConfigurationFailureException("File '" + srfInfo.getAbsolutePath() - + "' does not exists or is a folder."); - } - } - copier = FastRecursiveHardLinkMaker.tryCreate(TimingParameters.getDefaultParameters(), - RSyncConfig.getInstance().getAdditionalCommandLineOptions()); - Properties transferDropBoxMapping = - ExtendedProperties.getSubset(properties, TRANSFER_PREFIX, true); - Set<Entry<Object, Object>> entries = transferDropBoxMapping.entrySet(); - for (Entry<Object, Object> entry : entries) - { - String affiliation = entry.getKey().toString(); - String dropBoxPath = entry.getValue().toString(); - File dropBox = new File(dropBoxPath); - if (dropBox.isDirectory() == false) - { - throw new EnvironmentFailureException("Transfer drop box for " + affiliation - + " doen't exist or isn't a folder: " + dropBox.getAbsolutePath()); - } - transferDropBoxes.put(affiliation, dropBox); - } - } - - void setUpdateDataTransferredProperty(boolean updateDataTransferredProperty) - { - this.updateDataTransferredProperty = updateDataTransferredProperty; - } - - @Override - public Status handle(File originalData, DataSetInformation dataSetInformation, - Map<String, String> parameterBindings) - { - Map<String, Sample> flowLaneSampleMap = createFlowLaneSampleMap(dataSetInformation); - String flowcellID = originalData.getName(); - List<File> srfFiles = new ArrayList<File>(); - FileUtilities.findFiles(originalData, srfFiles, createSrfFileFilter()); - if (srfFiles.size() < flowLaneSampleMap.size()) - { - throw new EnvironmentFailureException("Only " + srfFiles.size() - + " flow lane files found instead of " + flowLaneSampleMap.size() + "."); - } - Set<String> processedFlowLanes = new LinkedHashSet<String>(); - for (File srfFile : srfFiles) - { - List<String> srfInfo = getSRFInfo(srfFile); - String flowLane = extractFlowLane(srfFile); - if (processedFlowLanes.contains(flowLane)) - { - throw new UserFailureException("Flow lane " + flowLane + " already registered."); - } - Sample flowLaneSample = flowLaneSampleMap.get(flowLane); - if (flowLaneSample == null) - { - throw new UserFailureException("No flow lane sample for flow lane " + flowLane - + " found."); - } - File flowLaneDropBox = createDropBoxFile(flowLane); - String fileName = - flowLaneSample.getSpace().getCode() + entitySepaparator + flowcellID - + FlowLaneDataSetInfoExtractor.FLOW_LANE_NUMBER_SEPARATOR + flowLane; - File flowLaneDataSet = new File(flowLaneDropBox, fileName); - if (flowLaneDataSet.exists()) - { - throw new EnvironmentFailureException("There is already a data set for flow lane " - + flowLane + "."); - } - addFileForUndo(flowLaneDataSet); - boolean success = flowLaneDataSet.mkdir(); - if (success == false) - { - throw new EnvironmentFailureException("Couldn't create folder '" - + flowLaneDataSet.getAbsolutePath() + "'."); - } - - createHardLink(srfFile, flowLaneDataSet); - createMetaDataFileAndHardLinkInTransferDropBox(flowLaneDataSet, flowLaneSample, - flowLane, srfInfo); - - // store additional flow lane files - List<File> flowLaneFiles = new ArrayList<File>(); - FileUtilities.findFiles(originalData, flowLaneFiles, - createPrefixFileFilter(FilenameUtils.getBaseName(srfFile.getName()))); - for (File file : flowLaneFiles) - { - if (FilenameUtils.getExtension(file.getName()).equals(SRF_FILE_EXTENSION) == false) - { - createHardLink(file, flowLaneDataSet); - } - } - - if (updateDataTransferredProperty) - { - service.updateSample(createUpdates(flowLaneSample, - createDataTransferredProperty(flowLaneSample))); - } - - File markerFile = - new File(flowLaneDropBox, FileConstants.IS_FINISHED_PREFIX + fileName); - addFileForUndo(markerFile); - FileUtilities.writeToFile(markerFile, ""); - if (operationLog.isInfoEnabled()) - { - operationLog.info("Flow lane file '" + srfFile - + "' successfully dropped into drop box '" + flowLaneDropBox + "' as '" - + flowLaneDataSet.getName() + "'."); - } - processedFlowLanes.add(flowLane); - } - return Status.OK; - } - - private List<String> getSRFInfo(File file) - { - if (srfInfoPathOrNull == null) - { - return Collections.emptyList(); - } - List<String> command = Arrays.asList(srfInfoPathOrNull, "-l1", file.getAbsolutePath()); - ProcessResult result = - ProcessExecutionHelper.run(command, operationLog, operationLog, - ConcurrencyUtilities.NO_TIMEOUT, ProcessIOStrategy.DEFAULT_IO_STRATEGY, - true); - List<String> output = result.getOutput(); - if (result.isOK() == false) - { - StringBuilder builder = new StringBuilder(); - String startupFailureMessage = result.getStartupFailureMessage(); - if (StringUtils.isNotBlank(startupFailureMessage)) - { - builder.append("\nStartup failure message:").append(startupFailureMessage); - } - builder.append("\nStandard out and error:"); - for (String outputLine : output) - { - builder.append("\n").append(outputLine); - } - throw new UserFailureException("Invalid SRF file '" + file.getAbsolutePath() + "':" - + builder); - } - return output; - } - - private Map<String, Sample> createFlowLaneSampleMap(DataSetInformation dataSetInformation) - { - SampleIdentifier sampleIdentifier = dataSetInformation.getSampleIdentifier(); - Sample flowCell = service.tryGetSampleWithExperiment(sampleIdentifier); - if (flowCell == null) - { - throw new UserFailureException("Unkown flow cell sample: " + sampleIdentifier); - } - TechId flowCellID = new TechId(flowCell.getId()); - ListSampleCriteria criteria = ListSampleCriteria.createForContainer(flowCellID); - List<Sample> flowLaneSamples = service.listSamples(criteria); - Map<String, Sample> flowLaneSampleMap = new LinkedHashMap<String, Sample>(); - for (Sample flowLaneSample : flowLaneSamples) - { - flowLaneSampleMap.put(flowLaneSample.getSubCode(), flowLaneSample); - } - return flowLaneSampleMap; - } - - private void createMetaDataFileAndHardLinkInTransferDropBox(File flowLaneDataSet, - Sample flowLaneSample, String flowLane, List<String> srfInfo) - { - if (flowLaneSample == null) - { - throw new UserFailureException("No flow lane sample for flow lane " + flowLane - + " exists"); - } - StringBuilder builder = new StringBuilder(); - addLine(builder, "Parent", flowLaneSample.getGeneratedFrom().getIdentifier()); - addLine(builder, "Code", flowLaneSample.getCode()); - addLine(builder, "Contact Person Email", flowLaneSample.getRegistrator().getEmail()); - SampleIdentifier identifier = SampleIdentifierFactory.parse(flowLaneSample.getIdentifier()); - IEntityProperty[] propertiesOrNull = - service.tryGetPropertiesOfTopSample(identifier); - File dropBox = null; - if (propertiesOrNull != null) - { - for (IEntityProperty property : propertiesOrNull) - { - PropertyType propertyType = property.getPropertyType(); - String value = property.tryGetAsString(); - addLine(builder, propertyType.getCode(), value); - String code = propertyType.getCode(); - if (code.equals(AFFILIATION_KEY)) - { - dropBox = transferDropBoxes.get(value); - } - } - } - if (srfInfo.isEmpty() == false) - { - builder.append("\n==== SRF Info ====\t\n"); - for (String line : srfInfo) - { - builder.append(line).append("\t\n"); - } - } - String sampleCode = flowLaneSample.getCode(); - String metaFileName = - metaDataFilePrefix + escapeSampleCode(sampleCode) + META_DATA_FILE_TYPE; - FileUtilities.writeToFile(new File(flowLaneDataSet, metaFileName), builder.toString()); - copyToDropBox(dropBox, flowLaneDataSet); - } - - private IEntityProperty createDataTransferredProperty(Sample flowLaneSample) - { - final PropertyType propertyType = extractDataTransferredProperty(flowLaneSample); - final String currentDate = - DateFormatUtils.format(new Date(), BasicConstant.CANONICAL_DATE_FORMAT_PATTERN); - - final IEntityProperty result = new EntityProperty(); - result.setPropertyType(propertyType); - result.setValue(currentDate); - return result; - } - - private PropertyType extractDataTransferredProperty(Sample flowLaneSample) - { - SampleType flowLaneType = service.getSampleType(flowLaneSample.getSampleType().getCode()); - PropertyType propertyType = null; - for (EntityTypePropertyType<SampleType> entityTypePropertyType : flowLaneType - .getAssignedPropertyTypes()) - { - if (entityTypePropertyType.getPropertyType().getCode().equals(DATA_TRANSFERRED)) - { - propertyType = entityTypePropertyType.getPropertyType(); - } - } - if (propertyType == null) - { - throw new UserFailureException(DATA_TRANSFERRED - + " property type doesn't exist or is not assigned to Flow Lane samples"); - } - return propertyType; - } - - public static SampleUpdatesDTO createUpdates(Sample sample, IEntityProperty newEntityProperty) - { - final TechId sampleId = TechId.create(sample); - final List<IEntityProperty> properties = - new ArrayList<IEntityProperty>(sample.getProperties()); - properties.add(newEntityProperty); - final ExperimentIdentifier experimentIdentifierOrNull = - (sample.getExperiment() != null) ? new ExperimentIdentifier(sample.getExperiment()) - : null; - final Collection<NewAttachment> attachments = new ArrayList<NewAttachment>(); - final int version = sample.getVersion(); - final SampleIdentifier sampleIdentifier = - SampleIdentifierFactory.parse(sample.getIdentifier()); - final String containerIdentifierOrNull = - (sample.getContainer() != null) ? sample.getContainer().getIdentifier() : null; - final String[] modifiedParentCodesOrNull = null; - return new SampleUpdatesDTO(sampleId, properties, experimentIdentifierOrNull, null, attachments, - version, sampleIdentifier, containerIdentifierOrNull, modifiedParentCodesOrNull); - } - - private void copyToDropBox(File dropBoxOrNull, File flowLaneDataSet) - { - if (dropBoxOrNull != null) - { - File[] files = flowLaneDataSet.listFiles(); - for (File file : files) - { - createHardLink(file, dropBoxOrNull); - addFileForUndo(new File(dropBoxOrNull, file.getName())); - } - if (operationLog.isInfoEnabled()) - { - operationLog.info("Flow lane data set '" + flowLaneDataSet.getName() - + "' successfully transfered to drop box '" + dropBoxOrNull + "'"); - } - } - } - - static String escapeSampleCode(String sampleCode) - { - return sampleCode == null ? null : sampleCode.replace( - SampleIdentifier.CONTAINED_SAMPLE_CODE_SEPARARTOR_STRING, "_"); - } - - private void addLine(StringBuilder builder, String key, String value) - { - builder.append(key).append('\t').append(value).append('\n'); - } - - private void createHardLink(File file, File folder) - { - final Status status = copier.copyImmutably(file, folder, null); - if (status.isError()) - { - throw new EnvironmentFailureException("Couldn't create a hard-link copy of '" - + file.getAbsolutePath() + "' in folder '" + folder.getAbsolutePath() + "'. [" - + status + "]"); - } - } - - private File createDropBoxFile(String flowLane) - { - File dropBox = new File(flowLaneDropBoxTemplate.format(new Object[] { flowLane })); - if (dropBox.exists() == false) - { - throw new ConfigurationFailureException("Drop box '" + dropBox + "' does not exist."); - } - if (dropBox.isDirectory() == false) - { - throw new ConfigurationFailureException("Drop box '" + dropBox - + "' is not a directory."); - } - return dropBox; - } - - private String extractFlowLane(File file) - { - String name = file.getName(); - String nameWithoutType = name.substring(0, name.lastIndexOf('.')); - int lastIndexOfUnderScore = nameWithoutType.lastIndexOf('_'); - String flowLane = nameWithoutType; - if (lastIndexOfUnderScore >= 0) - { - flowLane = nameWithoutType.substring(lastIndexOfUnderScore + 1); - } - return flowLane; - } - - private FileFilter createSrfFileFilter() - { - return new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.isFile() - && FilenameUtils.getExtension(file.getName()) - .equals(SRF_FILE_EXTENSION); - } - }; - } - - private FileFilter createPrefixFileFilter(final String prefix) - { - return new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.getName().startsWith(prefix); - } - }; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java deleted file mode 100644 index 5391e9990f9..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/StorageProcessor.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.util.Properties; - -import ch.systemsx.cisd.etlserver.DelegatingStorageProcessorWithDropbox; -import ch.systemsx.cisd.openbis.dss.generic.shared.IPostRegistrationDatasetHandler; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; - -/** - * Storage processor which feeds flow-line drop boxes. Needs the property <code>flow-line-drop-box-template</code>. A <code>{0}</code> is the place - * holder for the flow-line number. - * - * @author Franz-Josef Elmer - */ -public class StorageProcessor extends DelegatingStorageProcessorWithDropbox -{ - public StorageProcessor(Properties properties) - { - super(properties); - } - - @Override - public IPostRegistrationDatasetHandler createPostRegistrationDataSetHandler() - { - return new FlowLaneFeeder(properties, ServiceProvider.getOpenBISService()); - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java deleted file mode 100644 index eadc082e447..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipResultsSummary.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ChipResultsSummary> - * <clusterCountPF>98792458</clusterCountPF> - * <clusterCountRaw>158466917</clusterCountRaw> - * <densityRatio>3556528488</densityRatio> - * <yield>3556528488</yield> - * </ChipResultsSummary> - * <Software>CASAVA-1.7.0</Software> - * </pre> - * - * @author Manuel Kohler - */ - -class ChipResultsSummary -{ - private Long clusterCountPF = 0L; - - private Long clusterCountRaw = 0L; - - private Long yield = 0L; - - private Double densityRatio = 0.0; - - @XmlElement(name = "clusterCountPF") - public Long getClusterCountPF() - { - return clusterCountPF; - } - - public void setClusterCountPF(Long clusterCountPF) - { - this.clusterCountPF = clusterCountPF; - } - - @XmlElement(name = "clusterCountRaw") - public Long getClusterCountRaw() - { - return clusterCountRaw; - } - - public void setClusterCountRaw(Long clusterCountRaw) - { - this.clusterCountRaw = clusterCountRaw; - } - - @XmlElement(name = "yield") - public Long getYield() - { - return yield; - } - - public void setYield(Long yield) - { - this.yield = yield; - } - - @XmlElement(name = "densityRatio") - public Double getDensityRatio() - { - return densityRatio; - } - - public void setDensityRatio(Double densityRatio) - { - this.densityRatio = densityRatio; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java deleted file mode 100644 index f749f17e926..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/ChipSummary.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ChipSummary> - * <ChipID>708KLAAXX</ChipID> - * <Machine>BS-DSU_ELLAC</Machine> - * <RunFolder>101006_708KLAAXX</RunFolder> - * </ChipSummary> - * </pre> - * - * @author Manuel Kohler - */ -class ChipSummary -{ - private String chipID = ""; - - private String machine = ""; - - private String runFolder = ""; - - @XmlElement(name = "ChipID") - public String getChipID() - { - return chipID; - } - - public void setChipID(String chipID) - { - this.chipID = chipID; - } - - @XmlElement(name = "Machine") - public String getMachine() - { - return machine; - } - - public void setMachine(String machine) - { - this.machine = machine; - } - - @XmlElement(name = "RunFolder") - public String getRunFolder() - { - return runFolder; - } - - public void setRunFolder(String runFolder) - { - this.runFolder = runFolder; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java deleted file mode 100644 index 8ceb0a016b9..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java +++ /dev/null @@ -1,360 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; -import javax.mail.util.ByteArrayDataSource; - -import org.apache.log4j.Logger; - -import ch.rinn.restrictions.Private; -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.security.MD5ChecksumCalculator; -import ch.systemsx.cisd.common.string.Template; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.IProcessingPluginTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * Processing plugin for exporting meta data of a flow lane as a SOFT file. - * - * @author Franz-Josef Elmer - */ -public class DataSetToSOFT implements IProcessingPluginTask -{ - @Private - static final String EXTERNAL_SAMPLE_NAME_PROPERTY = "EXTERNAL_SAMPLE_NAME"; - - private static final String EMPTY = "<<<NEED_TO_BE_FILLED>>>"; - - @Private - static final Template SOFT_FILE_NAME_TEMPLATE = new Template( - "${flow-lane}_${external-sample-name}_SOFT.txt"); - - @Private - static final Template E_MAIL_SUBJECT_TEMPLATE = new Template( - "SOFT file for '${external-sample-name}'"); - - @Private - static final Template E_MAIL_CONTENT_TEMPLATE = new Template("Dear User\n\n" - + "Enclosed you will find the SOFT file for '${external-sample-name}'.\n" - + "Flow lane: ${flow-lane}\nData Set: ${data-set}"); - - private static final class SOFTBuilder - { - private final StringBuilder builder = new StringBuilder(); - - void addSample(Sample sample, String propertyTypeCode) - { - addLine('^', "SAMPLE", getProperty(sample, propertyTypeCode)); - } - - void addSampleProperty(String key, Sample sample, String propertyTypeCode, - Map<String, String> translation) - { - String property = getProperty(sample, propertyTypeCode); - String translatedProperty = translation.get(property); - addProperty(key, translatedProperty == null ? property : translatedProperty); - } - - void addSampleProperty(String key, Sample sample, String propertyTypeCode) - { - addProperty(key, getProperty(sample, propertyTypeCode)); - } - - void addProperty(String key, String property) - { - addLine('!', "Sample_" + key, property); - } - - private void addLine(char prefix, String key, String value) - { - builder.append(prefix).append(key).append(" = ").append(value).append('\n'); - } - - private String getProperty(Sample sample, String propertyTypeCode) - { - String property = tryToGetProperty(sample, propertyTypeCode); - return property == null ? EMPTY : property; - } - - @Override - public String toString() - { - return builder.toString(); - } - } - - private static final String tryToGetProperty(Sample sample, String propertyTypeCode) - { - List<IEntityProperty> properties = sample.getProperties(); - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(propertyTypeCode)) - { - return property.tryGetAsString(); - } - } - return null; - } - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - DataSetToSOFT.class); - - private static final long serialVersionUID = 1L; - - private final Map<String, String> translation; - - private transient IEncapsulatedOpenBISService service; - - public DataSetToSOFT(Properties properties, File storeRoot) - { - translation = new HashMap<String, String>(); - translation.put("GENOMIC_DNA", "genomic"); - translation.put("FRAGMENTED_GENOMIC_DNA", "genomic"); - translation.put("CHIP", "genomic"); - translation.put("BISULFITE", "genomic"); - translation.put("NON_GENOMIC", "non-genomic"); - translation.put("SYNTHETIC", "synthetic"); - translation.put("VIRAL_RNA", "viral RNA"); - translation.put("SMALL_RNA", "other"); - translation.put("TOTAL_RNA", "other"); - translation.put("MRNA", "other"); - translation.put("PROCESSED_DNA_LIBRARY", EMPTY); - } - - @Override - public ProcessingStatus process(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - EMailAddress address = new EMailAddress(context.getUserEmailOrNull()); - ProcessingStatus status = new ProcessingStatus(); - for (DatasetDescription datasetDescription : datasets) - { - try - { - String dataSetCode = datasetDescription.getDataSetCode(); - if (operationLog.isInfoEnabled()) - { - operationLog.info("Create SOFT file for data set " + dataSetCode); - } - AbstractExternalData srfDataSet = getService().tryGetDataSet(dataSetCode); - Sample flowLaneSample = getFlowLaneSample(srfDataSet); - Sample flowCellSample = getFlowCellSample(flowLaneSample); - Sample sequencingSample = getSequencingSample(flowLaneSample); - File srfFile = tryToFindSrfFile(datasetDescription, context); - if (srfFile == null) - { - status.addDatasetStatus(datasetDescription, - Status.createError("Data set " + dataSetCode + " has no srf file.")); - continue; - } - String checkSum = calculateCheckSum(srfFile); - - SOFTBuilder softBuilder = new SOFTBuilder(); - softBuilder.addSample(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - softBuilder.addProperty("type", "SRA"); - softBuilder.addSampleProperty("title", sequencingSample, - EXTERNAL_SAMPLE_NAME_PROPERTY); - softBuilder - .addSampleProperty("source_name", sequencingSample, "SAMPLE_SOURCE_NAME"); - softBuilder.addSampleProperty("organism", sequencingSample, - "NCBI_ORGANISM_TAXONOMY"); - softBuilder.addSampleProperty("characteristics", sequencingSample, - "SAMPLE_CHARACTERISTICS"); - softBuilder.addSampleProperty("biomaterial_provider", sequencingSample, - "CONTACT_PERSON_NAME"); - softBuilder.addSampleProperty("molecule", sequencingSample, "SAMPLE_MOLECULE"); - softBuilder.addSampleProperty("extract_protocol", sequencingSample, - "SAMPLE_EXTRACT_PROTOCOL"); - softBuilder.addSampleProperty("data_processing", sequencingSample, - "SAMPLE_DATA_PROCESSING"); - softBuilder.addSampleProperty("library_strategy", sequencingSample, - "SAMPLE_LIBRARY_STRATEGY"); - softBuilder.addSampleProperty("library_source", sequencingSample, "SAMPLE_KIND", - translation); - softBuilder.addSampleProperty("library_selection", sequencingSample, - "SAMPLE_LIBRARY_SELECTION"); - softBuilder - .addSampleProperty("instrument_model", flowCellSample, "GENOME_ANALYZER"); - softBuilder.addProperty("raw_file_1", srfFile.getName()); - softBuilder.addProperty("raw_file_type_1", "srf"); - softBuilder.addProperty("file_checksum_1", checkSum); - - String subject = createSubject(sequencingSample); - String content = createContent(sequencingSample, flowLaneSample, srfDataSet); - String fileName = createSoftFileName(sequencingSample, flowLaneSample); - DataSource dataSource = createDataSource(softBuilder.toString()); - context.getMailClient().sendEmailMessageWithAttachment(subject, content, fileName, - new DataHandler(dataSource), null, null, address); - status.addDatasetStatus(datasetDescription, Status.OK); - } catch (Exception ex) - { - status.addDatasetStatus(datasetDescription, - Status.createError("Exception occured: " + ex)); - operationLog.error("Exception occured while processing " + datasetDescription, ex); - } - } - return status; - } - - private String createSubject(Sample sequencingSample) - { - Template template = E_MAIL_SUBJECT_TEMPLATE.createFreshCopy(); - bindExternalSampleName(template, sequencingSample); - return template.createText(); - } - - private String createContent(Sample sequencingSample, Sample flowLaneSample, - AbstractExternalData dataSet) - { - Template template = E_MAIL_CONTENT_TEMPLATE.createFreshCopy(); - bindExternalSampleName(template, sequencingSample); - template.bind("flow-lane", flowLaneSample.getIdentifier()); - template.bind("data-set", dataSet.getCode()); - return template.createText(); - } - - private String createSoftFileName(Sample sequencingSample, Sample flowLaneSample) - { - Template template = SOFT_FILE_NAME_TEMPLATE.createFreshCopy(); - String externalSampleName = - tryToGetProperty(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - template.bind("external-sample-name", externalSampleName.replace(' ', '_')); - template.bind("flow-lane", flowLaneSample.getCode().replace(':', '-')); - return template.createText(); - } - - private void bindExternalSampleName(Template template, Sample sequencingSample) - { - String externalSampleName = - tryToGetProperty(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY); - template.bind("external-sample-name", externalSampleName); - } - - private String calculateCheckSum(File srfFile) - { - String checkSum; - try - { - checkSum = MD5ChecksumCalculator.calculate(new FileInputStream(srfFile)); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - return checkSum; - } - - private File tryToFindSrfFile(DatasetDescription datasetDescription, - DataSetProcessingContext context) - { - return tryToFindSrfFile(context.getDirectoryProvider().getDataSetDirectory( - datasetDescription)); - } - - private File tryToFindSrfFile(File file) - { - if (file.isFile() && file.getName().endsWith(".srf")) - { - return file; - } - if (file.isDirectory()) - { - File[] files = file.listFiles(); - for (File child : files) - { - File srfFile = tryToFindSrfFile(child); - if (srfFile != null) - { - return srfFile; - } - } - } - return null; - } - - private Sample getFlowLaneSample(AbstractExternalData dataSet) - { - SampleIdentifier identifier = SampleIdentifierFactory.parse(dataSet.getSampleIdentifier()); - return getService().tryGetSampleWithExperiment(identifier); - } - - private Sample getFlowCellSample(Sample flowLaneSample) - { - SampleIdentifier identifier = - SampleIdentifierFactory.parse(flowLaneSample.getContainer().getIdentifier()); - return getService().tryGetSampleWithExperiment(identifier); - } - - private Sample getSequencingSample(Sample flowLaneSample) - { - List<Sample> parents = - getService().listSamples( - ListSampleCriteria.createForChild(new TechId(flowLaneSample.getId()))); - return parents.get(0); - } - - private DataSource createDataSource(final String softData) - { - try - { - return new ByteArrayDataSource(softData, "text/plain"); - } catch (IOException ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - - private IEncapsulatedOpenBISService getService() - { - if (service == null) - { - service = ServiceProvider.getOpenBISService(); - } - return service; - } - - // for tests - void setService(IEncapsulatedOpenBISService service) - { - this.service = service; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java deleted file mode 100644 index 9dff47c8e54..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Date.java +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/* - * @author Manuel Kohler - */ -class Date -{ - private String Date; - - @XmlElement - public String getDate() - { - return Date; - } - - public void setDate(String date) - { - this.Date = date; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java deleted file mode 100644 index 9226df41972..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummary.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; - -/** - * Note: Not all XML Elements are read in - * - * <pre> - * <Summary> - * <ChipResultsSummary> - * ... - * </ChipResultsSummary> - * ... - * <ChipSummary> - * ... - * </ChipSummary> - * ... - * <Date> - * ... - * </Date> - * ... - * <ExpandedLaneSummary> - * ... - * </ExpandedLaneSummary> - * ... - * <LaneParameterSummary> - * ... - * </LaneParameterSummary> - * ... - * <LaneResultsSummary> - * ... - * </LaneResultsSummary> - * ... - * <Software>CASAVA-1.7.0</Software> - * ... - * <TileErrorsByLane> - * ... - * </TileErrorsByLane> - * ... - * <TileResultsByLane> - * ... - * </TileResultsByLane> - * ... - * <Summary> - * </pre> - * - * @author Manuel Kohler - */ - -@XmlRootElement(name = "Summary") -class IlluminaSummary -{ - private ChipResultsSummary chipResultsSummary; - - private LaneResultsSummary LaneResultsSummary; - - private ChipSummary chipSummary; - - private String Software = ""; - - private String Date = ""; - - @XmlElement(name = "ChipResultsSummary") - public ChipResultsSummary getChipResultsSummary() - { - return chipResultsSummary; - } - - public void setChipResultsSummary(ChipResultsSummary chipResultsSummary) - { - this.chipResultsSummary = chipResultsSummary; - } - - @XmlElement(name = "LaneResultsSummary") - public LaneResultsSummary getLaneResultsSummary() - { - return LaneResultsSummary; - } - - public void setLaneResultsSummary(LaneResultsSummary laneResultsSummary) - { - this.LaneResultsSummary = laneResultsSummary; - } - - @XmlElement(name = "ChipSummary") - public ChipSummary getChipSummary() - { - return chipSummary; - } - - public void setChipSummary(ChipSummary chipSummary) - { - this.chipSummary = chipSummary; - } - - @XmlElement(name = "Software") - public String getSoftware() - { - return Software; - } - - public void setSoftware(String software) - { - this.Software = software; - } - - @XmlElement(name = "Date") - public String getDate() - { - return Date; - } - - public void setDate(String date) - { - this.Date = date; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java deleted file mode 100644 index 7a5ecbf472d..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryReportingPlugin.java +++ /dev/null @@ -1,302 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.FileFilter; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.xml.JaxbXmlParser; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractTableModelReportingPlugin; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IntegerTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.util.SimpleTableModelBuilder; - -/** - * Reporting plugin which shows numbers of the Summary.xml file generated from the Illumina Sequencer. The structure of the Summary file has changed - * from Casava 1.6 to 1.7 so some XML elements are not available in the old files. - * - * @author Manuel Kohler - */ -public class IlluminaSummaryReportingPlugin extends AbstractTableModelReportingPlugin -{ - private static final String UNALIGNED_PATH = "/Unaligned_no_mismatch"; - - private static final int MEGA = 1000000; - - private static final int KILO = 1000; - - private static final long serialVersionUID = 1L; - - private static final String SUMMARY_FILE_NAME = "Summary.xml"; - - private static final String BUSTARD_SUMMARY_FILE_NAME = "BustardSummary.xml"; - - private static final String DATA_INTENSITIES_BASE_CALLS_PATH = "/Data/Intensities/BaseCalls"; - - private static final String GERALD_DIR = "GERALD"; - - private static final String BASECALL_DIR = "Basecall"; - - private static final String[] PROPERTIES = - { "GENOME_ANALYZER", "END_TYPE", "ILLUMINA_PIPELINE_VERSION", - "CYCLES_REQUESTED_BY_CUSTOMER" }; - - private static final String[] COLUMNS = - { "Sample Code", "Clusters", "Clusters (PF)", "Yield (Mbases)", "Density Ratio", - "PhiX: Clusters", "PhiX: ClustersPF", "PhiX: Yield (Mbases)", "PhiX: % Align (PF)", - "Software", "Eland finished" }; - - public IlluminaSummaryReportingPlugin(Properties properties, File storeRoot) - { - super(properties, storeRoot); - } - - private File[] findFile(DataSetProcessingContext context, DatasetDescription dataset, - final String summaryFilePath, String path) - { - - File originalData = getDataSubDir(context.getDirectoryProvider(), dataset); - - File childDirectory = new File(originalData, path); - - File[] files = childDirectory.listFiles(new FileFilter() - { - @Override - public boolean accept(File file) - { - return file.isDirectory() && file.getName().startsWith(summaryFilePath); - } - }); - return files; - } - - private static void createRows(File[] f, String fileName, SimpleTableModelBuilder b, - DatasetDescription dataset) - { - File summaryFile = new File(f[0], fileName); - describe(b, dataset, summaryFile); - - } - - @Override - public TableModel createReport(List<DatasetDescription> datasets, - DataSetProcessingContext context) - { - SimpleTableModelBuilder builder = new SimpleTableModelBuilder(); - - for (String column : COLUMNS) - { - builder.addHeader(column); - } - - for (String property : PROPERTIES) - { - builder.addHeader(property); - } - - for (DatasetDescription dataset : datasets) - { - - File[] f = - findFile(context, dataset, GERALD_DIR, dataset.getSampleCode() - + DATA_INTENSITIES_BASE_CALLS_PATH); - - if (f != null && f.length > 0) - { - createRows(f, SUMMARY_FILE_NAME, builder, dataset); - } else - { - File[] fileNewCasava = findFile(context, dataset, BASECALL_DIR, UNALIGNED_PATH); - try - { - createRows(fileNewCasava, BUSTARD_SUMMARY_FILE_NAME, builder, dataset); - } catch (RuntimeException exc) - { - List<ISerializableComparable> row = new ArrayList<ISerializableComparable>(); - row.add(new StringTableCell(dataset.getSampleCode())); - for (int i = 0; i <= COLUMNS.length + PROPERTIES.length - 2; ++i) - { - row.add(new StringTableCell("")); - } - builder.addRow(row); - } - } - - } - return builder.getTableModel(); - } - - private static void describe(SimpleTableModelBuilder builder, DatasetDescription dataset, - File summaryFile) - { - IlluminaSummary summary = IlluminaSummaryXMLLoader.readSummaryXML(summaryFile); - describeSummary(builder, dataset, summary); - } - - private static void describeSummary(SimpleTableModelBuilder builder, - DatasetDescription dataset, IlluminaSummary summary) - { - ChipResultsSummary chipResultSummary = summary.getChipResultsSummary(); - LaneResultsSummary laneResultSummary = summary.getLaneResultsSummary(); - // ChipSummary chipSummary = summary.getChipSummary(); - - List<ISerializableComparable> row = new ArrayList<ISerializableComparable>(); - row.add(new StringTableCell(dataset.getSampleCode())); - - addTableRow(chipResultSummary.getClusterCountRaw(), row); - addTableRow(chipResultSummary.getClusterCountPF(), row); - addTableRow(chipResultSummary.getYield() / MEGA, row); - addTableRow(chipResultSummary.getDensityRatio(), row); - - // PhiX Lane - addTableRow(laneResultSummary.getRead().getLanes().get(4).getClusterCountRaw().getMean(), - row); - addTableRow(laneResultSummary.getRead().getLanes().get(4).getClusterCountPF().getMean(), - row); - addTableRow(laneResultSummary.getRead().getLanes().get(4).getLaneYield() / KILO, row); - - try - { - addTableRow(laneResultSummary.getRead().getLanes().get(4).getPercentUniquelyAlignedPF() - .getMean(), row); - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - - addTableRow(summary.getSoftware(), row); - addTableRow(summary.getDate(), row); - addPropertyColumnValues(dataset, row); - - builder.addRow(row); - } - - private static void addTableRow(Long number, List<ISerializableComparable> row) - { - try - { - row.add(new IntegerTableCell(number)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addTableRow(Double number, List<ISerializableComparable> row) - { - try - { - row.add(new DoubleTableCell(number)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addTableRow(String s, List<ISerializableComparable> row) - { - try - { - row.add(new StringTableCell(s)); - - } catch (RuntimeException exc) - { - row.add(new StringTableCell("")); - - } - } - - private static void addPropertyColumnValues(DatasetDescription dataset, - List<ISerializableComparable> row) - { - Sample sample = getSample(dataset); - for (String propertyCode : PROPERTIES) - { - boolean found = false; - for (IEntityProperty property : sample.getProperties()) - { - if (property.getPropertyType().getCode().equals(propertyCode)) - { - row.add(new StringTableCell(property.tryGetAsString())); - found = true; - break; - } - } - if (found == false) - { - row.add(new StringTableCell("")); - } - } - } - - private static Sample getSample(DatasetDescription dataset) - { - String spaceCode = dataset.getSpaceCode(); - String sampleCode = dataset.getSampleCode(); - SampleIdentifier sampleIdentifier = - new SampleIdentifier(new SpaceIdentifier(spaceCode), sampleCode); - Sample sampleOrNull = - ServiceProvider.getOpenBISService().tryGetSampleWithExperiment(sampleIdentifier); - if (sampleOrNull == null) - { - throw new EnvironmentFailureException(String.format( - "Couldn't get sample %s for dataset %s.", dataset.getSampleCode(), - dataset.getDataSetCode())); - } - return sampleOrNull; - } - - /** - * Loader of Illumina summary XML file. - * <p> - * NOTE: This is not thread safe as it holds {@link JaxbXmlParser} singleton. As long as it is used only by {@link IlluminaSummaryReportingPlugin} - * it will work correctly because we only use a singleton of each reporting plugin. - * - * @author Piotr Buczek - */ - static class IlluminaSummaryXMLLoader - { - // we use one instance - private static JaxbXmlParser<IlluminaSummary> PARSER_INSTANCE = - new JaxbXmlParser<IlluminaSummary>(IlluminaSummary.class, false); - - public static IlluminaSummary readSummaryXML(File summaryXml) - { - return PARSER_INSTANCE.doParse(summaryXml); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java deleted file mode 100644 index 1f53180bae0..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Lane.java +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <Lane> - * <laneNumber>1</laneNumber> - * <averageAlignScorePF> - * ... - * </averageAlignScorePF> - * <clusterCountPF> - * ... - * </clusterCountPF> - * <clusterCountRaw> - * ... - * </clusterCountRaw> - * <errorPF> - * ... - * </errorPF> - * <laneYield>2290093</laneYield> - * <oneSig> - * ... - * </oneSig> - * <percentClustersPF> - * ... - * </percentClustersPF> - * <percentUniquelyAlignedPF> - * ... - * </percentUniquelyAlignedPF> - * <signal20AsPctOf1> - * ... - * </signal20AsPctOf1> - * </Lane> - * </pre> - * - * @author Manuel Kohler - */ - -class Lane -{ - private Long laneNumber = 0L; - - // since Casava 1.7 available - private doubleStats averageAlignScorePF; - - private stats clusterCountPF; - - private stats clusterCountRaw; - - // since Casava 1.7 available - private doubleStats errorPF; - - private Long laneYield = 0L; - - private stats oneSig; - - private doubleStats percentClustersPF; - - // since Casava 1.7 available - private doubleStats percentUniquelyAlignedPF; - - private doubleStats signal20AsPctOf1; - - @XmlElement(name = "laneNumber") - public Long getLaneNumber() - { - return laneNumber; - } - - public void setLaneNumber(Long laneNumber) - { - this.laneNumber = laneNumber; - } - - @XmlElement(name = "averageAlignScorePF") - public doubleStats getAverageAlignScorePF() - { - return averageAlignScorePF; - } - - public void setAverageAlignScorePF(doubleStats averageAlignScorePF) - { - this.averageAlignScorePF = averageAlignScorePF; - } - - @XmlElement(name = "clusterCountPF") - public stats getClusterCountPF() - { - return clusterCountPF; - } - - public void setClusterCountPF(stats clusterCountPF) - { - this.clusterCountPF = clusterCountPF; - } - - @XmlElement(name = "clusterCountRaw") - public stats getClusterCountRaw() - { - return clusterCountRaw; - } - - public void setClusterCountRaw(stats clusterCountRaw) - { - this.clusterCountRaw = clusterCountRaw; - } - - @XmlElement(name = "errorPF") - public doubleStats getErrorPF() - { - return errorPF; - } - - public void setErrorPF(doubleStats errorPF) - { - this.errorPF = errorPF; - } - - @XmlElement(name = "laneYield") - public Long getLaneYield() - { - return laneYield; - } - - public void setLaneYield(Long laneYield) - { - this.laneYield = laneYield; - } - - @XmlElement(name = "oneSig") - public stats getOneSig() - { - return oneSig; - } - - public void setOneSig(stats oneSig) - { - this.oneSig = oneSig; - } - - @XmlElement(name = "percentClustersPF") - public doubleStats getPercentClustersPF() - { - return percentClustersPF; - } - - public void setPercentClustersPF(doubleStats percentClustersPF) - { - this.percentClustersPF = percentClustersPF; - } - - @XmlElement(name = "percentUniquelyAlignedPF") - public doubleStats getPercentUniquelyAlignedPF() - { - return percentUniquelyAlignedPF; - } - - public void setPercentUniquelyAlignedPF(doubleStats percentUniquelyAlignedPF) - { - this.percentUniquelyAlignedPF = percentUniquelyAlignedPF; - } - - @XmlElement(name = "signal20AsPctOf1") - public doubleStats getSignal20AsPctOf1() - { - return signal20AsPctOf1; - } - - public void setSignal20AsPctOf1(doubleStats signal20AsPctOf1) - { - this.signal20AsPctOf1 = signal20AsPctOf1; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java deleted file mode 100644 index 50c3538b359..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/LaneResultsSummary.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <ExpandedLaneSummary> - * <Read> - * </Read> - * </ExpandedLaneSummary> - * </pre> - * - * @author Manuel Kohler - */ - -class LaneResultsSummary -{ - private Read read; - - @XmlElement(name = "Read") - public Read getRead() - { - return read; - } - - public void setRead(Read read) - { - this.read = read; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java deleted file mode 100644 index fc00524a388..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/Read.java +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.util.ArrayList; -import java.util.List; -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <Read> - * <readNumber>1</readNumber> - * <Lane> - * ... - * </Lane> - * ... - * </Read> - * </pre> - * - * @author Manuel Kohler - */ - -class Read -{ - private List<Integer> readNumber = new ArrayList<Integer>(); - - private List<Lane> lanes; - - @XmlElement(name = "readNumber") - public List<Integer> getReadNumbers() - { - return readNumber; - } - - public void setReadNumbers(List<Integer> readNumber) - { - this.readNumber = readNumber; - } - - @XmlElement(name = "Lane") - public List<Lane> getLanes() - { - return lanes; - } - - public void setLanes(List<Lane> lanes) - { - this.lanes = lanes; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java deleted file mode 100644 index 0d21e99a72c..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/doubleStats.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <mean>277736.1</mean> - * <stdev>11981.2</stdev> - * <sumsq>17.3</sumsq> - * </pre> - * - * @author kohleman - */ - -public class doubleStats -{ - private double mean = 0.0; - - private double stdev = 0.0; - - private double sumsq = 0.0; - - @XmlElement(name = "mean") - public double getMean() - { - return mean; - } - - public void setMean(double mean) - { - this.mean = mean; - } - - @XmlElement(name = "stdev") - public double getStdev() - { - return stdev; - } - - public void setStdev(double stdev) - { - this.stdev = stdev; - } - - @XmlElement(name = "sumsq") - public double getSumsq() - { - return sumsq; - } - - public void setSumsq(double sumsq) - { - this.sumsq = sumsq; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java deleted file mode 100644 index 11717aacc51..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/stats.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import javax.xml.bind.annotation.XmlElement; - -/** - * <pre> - * <mean>277736</mean> - * <stdev>11981</stdev> - * <sumsq>17224950000</sumsq> - * </pre> - * - * @author kohleman - */ - -public class stats -{ - private Long mean = 0L; - - private Long stdev = 0L; - - private Long sumsq = 0L; - - @XmlElement(name = "mean") - public Long getMean() - { - return mean; - } - - public void setMean(Long mean) - { - this.mean = mean; - } - - @XmlElement(name = "stdev") - public Long getStdev() - { - return stdev; - } - - public void setStdev(Long stdev) - { - this.stdev = stdev; - } - - @XmlElement(name = "sumsq") - public Long getSumsq() - { - return sumsq; - } - - public void setSumsq(Long sumsq) - { - this.sumsq = sumsq; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java deleted file mode 100644 index 4d5e311c91f..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/DbAccess.java +++ /dev/null @@ -1,103 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.metadata; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.HashMap; - -public class DbAccess -{ - - private static final String FASTQ_GZ_SUFFIX = ".fastq.gz"; - - /** - * Connecting to the pathinfo_DB - * - * @return Connection - */ - static Connection connectToDB(Parameters params) - { - try - { - Class.forName("org.postgresql.Driver"); - } catch (ClassNotFoundException e) - { - e.printStackTrace(); - } - Connection connection = null; - try - { - connection = DriverManager.getConnection( - params.getPathinfoDBConnectionString(), params.getPathinfoDBUser(), params.getPathinfoDBPassword()); - } catch (SQLException e) - { - e.printStackTrace(); - System.out.println("No PathinfoDB available"); - } - return connection; - } - - /** - * @return HashMap<String, Integer> of files and the corresponding checksum for the DB Uses a file as key and the checksum as value, we assume - * that a file is unique - */ - static HashMap<String, Integer> doQuery(Connection connection, String permId) - { - HashMap<String, Integer> dataSetResult = new HashMap<String, Integer>(); - Statement st = null; - try - { - st = connection.createStatement(); - } catch (SQLException e) - { - e.printStackTrace(); - } - ResultSet rs = null; - try - { - System.out.println("Found data set with permID: " + permId); - rs = st.executeQuery("select dsf.id, dsf.file_name, dsf.checksum_crc32 from data_sets ds," - + " data_set_files dsf where ds.code='" - + permId + "' and ds.id =dsf.dase_id and dsf.is_directory = FALSE;"); - while (rs.next()) - { - Integer id = rs.getInt("id"); - String fileName = rs.getString("file_name"); - Integer checksum = rs.getInt("checksum_crc32"); - - if (fileName.endsWith(FASTQ_GZ_SUFFIX)) - { - dataSetResult.put(fileName, checksum); - } - } - } catch (SQLException e) - { - e.printStackTrace(); - } - - try - { - rs.close(); - st.close(); - - } catch (SQLException e) - { - e.printStackTrace(); - } - return dataSetResult; - } - - static void closeDBConnection(Connection connection) - { - try - { - connection.close(); - } catch (SQLException e) - { - e.printStackTrace(); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java deleted file mode 100644 index 77eab96942b..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/Parameters.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.metadata; - -import static ch.systemsx.cisd.common.properties.PropertyUtils.getMandatoryProperty; - -import java.util.Properties; - -/** - * @author Manuel Kohler - */ -public class Parameters -{ - private static final String OPENBIS_USER = "openbis-user"; - - private static final String OPENBIS_PASSWORD = "openbis-password"; - - private static final String OPENBIS_SERVER_URL = "openbis-server-url"; - - private static final String PATHINFO_DB_CONNECTION_STRING = "pathinfo-db-connection-string"; - - private static final String PATHINFO_DB_USER = "pathinfo-db-user"; - - private static final String PATHINFO_DB_CONNECTION_PASSWORD = "pathinfo-db-password"; - - private final String openbisUser; - - private final String openbisPassword; - - private final String openbisServerURL; - - private final String pathinfoDBConnectionString; - - private final String pathinfoDBUser; - - private final String pathinfoDBPassword; - - public Parameters(Properties props) - { - this.openbisUser = getMandatoryProperty(props, OPENBIS_USER); - this.openbisPassword = getMandatoryProperty(props, OPENBIS_PASSWORD); - this.openbisServerURL = getMandatoryProperty(props, OPENBIS_SERVER_URL); - this.pathinfoDBConnectionString = getMandatoryProperty(props, PATHINFO_DB_CONNECTION_STRING); - this.pathinfoDBUser = getMandatoryProperty(props, PATHINFO_DB_USER); - this.pathinfoDBPassword = getMandatoryProperty(props, PATHINFO_DB_CONNECTION_PASSWORD); - } - - public String getOpenbisUser() - { - return openbisUser; - } - - public String getOpenbisPassword() - { - return openbisPassword; - } - - public String getOpenbisServerURL() - { - return openbisServerURL; - } - - public String getPathinfoDBConnectionString() - { - return pathinfoDBConnectionString; - } - - public String getPathinfoDBUser() - { - return pathinfoDBUser; - } - - public String getPathinfoDBPassword() - { - return pathinfoDBPassword; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java deleted file mode 100644 index 93eb052c65a..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/metadata/create_metadata.java +++ /dev/null @@ -1,445 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.metadata; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.sql.Connection; -import java.util.ArrayList; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.SortedMap; -import java.util.TreeMap; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; - -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.openbis.common.api.client.ServiceFinder; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleFetchOption; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; - -/** - * @author Manuel Kohler - */ - -public class create_metadata -{ - private static final String SEQUENCER = "SEQUENCER"; - - private static final String SEQUENCER_MODEL = "SEQUENCER_MODEL"; - - private static final String ILLUMINA_FLOW_LANE = "ILLUMINA_FLOW_LANE"; - - private static final String LANE_NUMBER = "LANE_NUMBER"; - - private static final String TSV_ENDING = ".tsv"; - - private static final String FLOW_CELL_PROPERTIES_NAME = "FLOW_CELL_PROPERTIES"; - - private static final String EXPERIMENT_NAME = "EXPERIMENT"; - - private static final String SAMPLE_CODE = "SAMPLE_CODE"; - - private static final String SAMPLE_TYPE_ILLUMINA_SEQUENCING = "ILLUMINA_SEQUENCING"; - - private static final String SAMPLE_TYPE = "SAMPLE_TYPE"; - - private static final String INDEX1_NOINDEX_VALUE = "NOINDEX"; - - private static final String INDEX2_NOINDEX_VALUE = "NOINDEX"; - - private static final String DATASET_TYPE_CODE_FASTQ_GZ = "FASTQ_GZ"; - - private static final String INDEX1_PROPERTY_CODE = "BARCODE"; - - private static final String INDEX2_PROPERTY_CODE = "INDEX2"; - - private static final String TSV_FLOWCELL_PROPERTIES = "FLOWCELL PROPERTIES"; - - private static final String TSV_FASTQ_FILES = "FASTQ_FILES"; - - private static final String CL_PARAMETER_OUTPUT_FOLDER = "output"; - - private static final String CL_PARAMETER_SAMPLE_LIST = "samples"; - - private static final String SERVICE_PROPERTIES_FILE = "etc/service.properties"; - - private static final char[] HEX_CHARACTERS = - { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', }; - - private static final Map<String, String> SEQUENCER_NAMING; - - static - { - SEQUENCER_NAMING = new HashMap<String, String>(); - SEQUENCER_NAMING.put("ATTILA", "Illumina Genome Analyzer II"); - SEQUENCER_NAMING.put("ATTILAX", "Illumina Genome Analyzer IIx"); - SEQUENCER_NAMING.put("D00404", "Illumina HiSeq 2500"); - SEQUENCER_NAMING.put("ELLAC", "Illumina Genome Analyzer IIx"); - SEQUENCER_NAMING.put("M00721", "Illumina MiSeq"); - SEQUENCER_NAMING.put("SN1043", "Illumina HiSeq 2000"); - SEQUENCER_NAMING.put("D00535", "Illumina HiSeq 2500"); - SEQUENCER_NAMING.put("J00121", "Illumina HiSeq 3000"); - SEQUENCER_NAMING.put("M01761", "Illumina MiSeq"); - SEQUENCER_NAMING.put("NS500318", "Illumina NextSeq 500"); - SEQUENCER_NAMING.put("SN792", "Illumina HiSeq 2000"); - } - - public static void main(String[] args) - { - HashMap<String, String[]> commandLineMap = parseCommandLine(args); - extract(commandLineMap); - } - - private static void extract(HashMap<String, String[]> commandLineMap) - { - - Connection connection = null; - - LogInitializer.init(); - Properties props = PropertyIOUtils.loadProperties(SERVICE_PROPERTIES_FILE); - Parameters params = new Parameters(props); - - ServiceFinder serviceFinder = new ServiceFinder("openbis", IGeneralInformationService.SERVICE_URL); - IGeneralInformationService infoService = - serviceFinder.createService(IGeneralInformationService.class, params.getOpenbisServerURL()); - - String sessionToken = infoService.tryToAuthenticateForAllServices(params.getOpenbisUser(), params.getOpenbisPassword()); - if (sessionToken == null) - { - System.out.println("Wrong username/password!"); - System.exit(0); - } - ArrayList<String> sampleCodeList = new ArrayList<String>(); - - String outputFolder = commandLineMap.get(CL_PARAMETER_OUTPUT_FOLDER)[0]; - String[] clSampleCodeList = commandLineMap.get(CL_PARAMETER_SAMPLE_LIST); - for (String sampleCode : clSampleCodeList) - { - sampleCodeList.add(sampleCode); - } - - EnumSet<SampleFetchOption> fetchOptions = EnumSet.of(SampleFetchOption.CHILDREN, SampleFetchOption.PROPERTIES); - EnumSet<SampleFetchOption> flowcellFetchOptions = EnumSet.of(SampleFetchOption.PROPERTIES); - - connection = DbAccess.connectToDB(params); - - for (String sampleCode : sampleCodeList) - { - List<Sample> sampleList = searchSample(infoService, sessionToken, sampleCode, fetchOptions); - if (sampleList.size() < 1) - { - System.out.println(sampleCode + " not found!"); - } - - SortedMap<String, SortedMap<String, String>> sampleMap = getProperties(sampleList); - SortedMap<String, SortedMap<String, String>> flowcellMap = null; - String flowcellCode = ""; - - // Should be always a single sample - for (Sample sample : sampleList) - { - List<Sample> children = sample.getChildren(); - if (children.size() == 0) - { - System.out.println("Skipping..." + sample.getCode() + ". No children found for sample."); - continue; - } - HashMap<String, String> permIdMap = extractDataSets(infoService, sessionToken, children, sample); - - for (String permId : permIdMap.keySet()) - { - if (permId.equals("")) - { - System.out.println("Skipping..." + sample.getCode() + ". No Data Set found."); - continue; - } - - HashMap<String, Integer> dbResult = new HashMap<String, Integer>(); - if (connection != null) - { - dbResult = DbAccess.doQuery(connection, permId); - } - - for (Sample child : children) - { - String sampleConnectedToDataset = permIdMap.get(permId).split("/")[2]; - if (child.getSampleTypeCode().equals(ILLUMINA_FLOW_LANE) && - child.getCode().equals(sampleConnectedToDataset)) - { - flowcellCode = child.getCode().split(":")[0]; - String flowlaneCode = child.getCode().split(":")[1]; - SortedMap<String, String> sampleProps = sampleMap.get(sampleCode); - sampleProps.put(LANE_NUMBER, flowlaneCode); - sampleMap.put(sampleCode, sampleProps); - - List<Sample> flowcellList = searchSample(infoService, sessionToken, flowcellCode, flowcellFetchOptions); - flowcellMap = getProperties(flowcellList); - - writeTSVFile(sampleMap, flowcellMap, dbResult, outputFolder); - } - } - } - } - } - DbAccess.closeDBConnection(connection); - } - - private static SortedMap<String, SortedMap<String, String>> getProperties(List<Sample> sampleList) - { - SortedMap<String, String> sortedProperties = new TreeMap<String, String>(); - SortedMap<String, SortedMap<String, String>> sampleMap = new TreeMap<String, SortedMap<String, String>>(); - - for (Sample sample : sampleList) - { - Map<String, String> sampleProperties = sample.getProperties(); - for (String key : sampleProperties.keySet()) - { - if (!key.equals(FLOW_CELL_PROPERTIES_NAME)) - { - sortedProperties.put(key, cleanString(sampleProperties.get(key).toString())); - } - if (key.equals(SEQUENCER)) - { - sortedProperties.put(SEQUENCER_MODEL, SEQUENCER_NAMING.get(sampleProperties.get(key))); - } - } - if (sample.getSampleTypeCode().equals(SAMPLE_TYPE_ILLUMINA_SEQUENCING)) - { - sortedProperties.put(EXPERIMENT_NAME, sample.getExperimentIdentifierOrNull()); - } - sortedProperties.put(SAMPLE_CODE, sample.getCode()); - sortedProperties.put(SAMPLE_TYPE, sample.getSampleTypeCode()); - - sampleMap.put(sample.getCode(), sortedProperties); - } - return sampleMap; - } - - private static void writeTSVFile(SortedMap<String, SortedMap<String, String>> sampleMap, - SortedMap<String, SortedMap<String, String>> flowcellMap, HashMap<String, Integer> dbResult, - String outputFolder) - { - if (flowcellMap != null && flowcellMap.size() == 1) - { - SortedMap<String, String> flowcellProperties = flowcellMap.get(flowcellMap.firstKey()); - - for (String key : sampleMap.keySet()) - { - SortedMap<String, String> currentSample = sampleMap.get(key); - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(key.replace("-", "_")); - stringBuilder.append("_"); - stringBuilder.append(flowcellProperties.get("RUN_NAME_FOLDER")); - stringBuilder.append("_metadata"); - stringBuilder.append(TSV_ENDING); - - Path path = Paths.get(outputFolder, stringBuilder.toString()); - File metaDataFile = new File(path.toUri()); - metaDataFile.getParentFile().mkdirs(); - try - { - metaDataFile.createNewFile(); - } catch (IOException e1) - { - e1.printStackTrace(); - } - - try - { - BufferedWriter fOut = new BufferedWriter(new FileWriter(metaDataFile)); - for (String propertyKey : currentSample.keySet()) - { - fOut.write(propertyKey + "\t" + currentSample.get(propertyKey) + "\n"); - } - fOut.write("\n" + TSV_FLOWCELL_PROPERTIES + "\n"); - - for (String flowcellPropertyKey : flowcellProperties.keySet()) - { - fOut.write(flowcellPropertyKey + "\t" + flowcellProperties.get(flowcellPropertyKey) + "\n"); - } - fOut.write("\n" + TSV_FASTQ_FILES + "\n"); - - for (String fileName : dbResult.keySet()) - { - fOut.write(fileName + "\t" + crc32ToString(dbResult.get(fileName)) + "\n"); - } - - fOut.close(); - System.out.println("Written " + metaDataFile); - - } catch (IOException e) - { - e.printStackTrace(); - } - } - } - } - - private static List<Sample> searchSample(IGeneralInformationService infoService, String sessionToken, - String sampleCode, EnumSet<SampleFetchOption> fetchOptions) - { - SearchCriteria sc = new SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - List<Sample> sampleList = infoService.searchForSamples(sessionToken, sc, fetchOptions); - return sampleList; - } - - private static HashMap<String, String> extractDataSets(IGeneralInformationService infoService, String sessionToken, - List<Sample> children, Sample sample) - { - HashMap<String, String> permIdMap = new HashMap<String, String>(); - List<DataSet> flowLaneDatasets = infoService.listDataSets(sessionToken, children); - String permId = ""; - Map<String, String> sampleProperties = sample.getProperties(); - String sample_index1 = sampleProperties.get(INDEX1_PROPERTY_CODE); - if (sample_index1 == null) - { - sample_index1 = INDEX1_NOINDEX_VALUE; - } - String sample_index2 = sampleProperties.get(INDEX2_PROPERTY_CODE); - if (sample_index2 == null) - { - sample_index2 = INDEX2_NOINDEX_VALUE; - } - - for (DataSet ds : flowLaneDatasets) - { - HashMap<String, String> dsProperties = ds.getProperties(); - String datasetIndex1 = dsProperties.get(INDEX1_PROPERTY_CODE); - String datasetIndex2 = dsProperties.get(INDEX2_PROPERTY_CODE); - if (datasetIndex1 == null) - { - System.out.println("No index found for dataset " + ds.getCode() + ". Set the indices properly for the data sets and try again."); - } else - { - - if (ds.getDataSetTypeCode().equals(DATASET_TYPE_CODE_FASTQ_GZ) && - datasetIndex1.equals(sample_index1) && datasetIndex2.equals(sample_index2)) - { - permId = ds.getCode(); - permIdMap.put(permId, ds.getSampleIdentifierOrNull()); - } - } - } - if (permIdMap.size() == 0) - { - System.out.println("No data set found which matched the properties of " + sample.getCode() + - ". Check the Indices of the Samples and the Data Sets."); - } - return permIdMap; - } - - private static String cleanString(String s) - { - return s.replaceAll("\n", " "); - } - - /** - * Converts a CRC32 checksum to a string representation. - */ - public static String crc32ToString(final int checksum) - { - final char buf[] = new char[8]; - int w = checksum; - for (int i = 0, x = 7; i < 4; i++) - { - buf[x--] = HEX_CHARACTERS[w & 0xf]; - buf[x--] = HEX_CHARACTERS[(w >>> 4) & 0xf]; - w >>= 8; - } - return new String(buf); - } - - private static HashMap<String, String[]> parseCommandLine(String[] args) - { - HashMap<String, String[]> commandLineMap = new HashMap<String, String[]>(); - CommandLineParser parser = new GnuParser(); - - Options options = new Options(); - - OptionBuilder.withArgName(CL_PARAMETER_SAMPLE_LIST); - OptionBuilder.hasArgs(); - OptionBuilder.withDescription("list of samples"); - Option samples = OptionBuilder.create(CL_PARAMETER_SAMPLE_LIST); - samples.setArgs(Option.UNLIMITED_VALUES); - samples.isRequired(); - options.addOption(samples); - - OptionBuilder.withArgName(CL_PARAMETER_OUTPUT_FOLDER); - OptionBuilder.hasArg(); - OptionBuilder.withDescription("output folder"); - - Option outputFolder = OptionBuilder.create(CL_PARAMETER_OUTPUT_FOLDER); - outputFolder.setArgs(1); - options.addOption(outputFolder); - - // automatically generate the help statement - HelpFormatter formatter = new HelpFormatter(); - if (args.length < 2) - { - formatter.printHelp("help", options); - System.exit(0); - } - - try - { - CommandLine line = parser.parse(options, args); - if (line.hasOption(CL_PARAMETER_SAMPLE_LIST)) - { - String[] sampleArray = line.getOptionValues(CL_PARAMETER_SAMPLE_LIST); - commandLineMap.put(CL_PARAMETER_SAMPLE_LIST, sampleArray); - } - if (line.hasOption(CL_PARAMETER_OUTPUT_FOLDER)) - { - String[] outputArray = line.getOptionValues(CL_PARAMETER_OUTPUT_FOLDER); - commandLineMap.put(CL_PARAMETER_OUTPUT_FOLDER, outputArray); - } else - { - String cwd = System.getProperty("user.dir"); - String[] arrayCwd = cwd.split("@"); // just use a split with a not valid char to convert the String into String [] - System.out.println("No output folder specified! Will use: " + cwd); - commandLineMap.put(CL_PARAMETER_OUTPUT_FOLDER, arrayCwd); - } - } catch (ParseException exp) - { - System.out.println("Parsing of command line parameters failed.\n" + exp.getMessage()); - formatter.printHelp("help", options); - System.exit(0); - } - return commandLineMap; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java deleted file mode 100644 index 3919ad6a06b..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.dto; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Simple encapsulation of list of entities that are tracked. - * - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class TrackedEntities -{ - - private final List<Sample> sequencingSamplesToBeProcessed; - - private final List<Sample> sequencingSamplesProcessed; - - private final List<AbstractExternalData> dataSets; - - private final HashMap<String, ArrayList<Long>> changedTrackingMap; - - public TrackedEntities(List<Sample> sequencingSamplesToBeProcessed, - List<Sample> sequencingSamplesProcessed, List<AbstractExternalData> dataSets, - HashMap<String, ArrayList<Long>> changedTrackingMap) - { - this.sequencingSamplesToBeProcessed = sequencingSamplesToBeProcessed; - this.sequencingSamplesProcessed = sequencingSamplesProcessed; - this.dataSets = dataSets; - this.changedTrackingMap = changedTrackingMap; - } - - public List<Sample> getSequencingSamplesToBeProcessed() - { - return sequencingSamplesToBeProcessed; - } - - public List<Sample> getSequencingSamplesProcessed() - { - return sequencingSamplesProcessed; - } - - public List<AbstractExternalData> getDataSets() - { - return dataSets; - } - - public HashMap<String, ArrayList<Long>> getChangedTrackingMap() - { - return changedTrackingMap; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java deleted file mode 100644 index f3376b413f6..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackingStateDTO.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.dto; - -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; - -/** - * Tracking state DTO - * - * @author Piotr Buczek - * @author Manuel Kohler - */ - -public class TrackingStateDTO -{ - private Set<Long> alreadyTrackedSampleIdsToBeProcessed; - - private Set<Long> alreadyTrackedSampleIdsProcessed; - - private long lastSeenDatasetId; - - private Properties lastSeenProperties; - - private TreeMap<String, Long> lastSeenDataSetIdMap; - - public TreeMap<String, Long> getLastSeenDataSetIdMap() - { - return lastSeenDataSetIdMap; - } - - public void setLastSeenDataSetIdMap(TreeMap<String, Long> lastSeenDataSetIdMap) - { - this.lastSeenDataSetIdMap = lastSeenDataSetIdMap; - } - - public long getLastSeenDatasetId() - { - return lastSeenDatasetId; - } - - public void setLastSeenDatasetId(long lastSeenDatasetId) - { - this.lastSeenDatasetId = lastSeenDatasetId; - } - - public Set<Long> getAlreadyTrackedSampleIdsToBeProcessed() - { - return alreadyTrackedSampleIdsToBeProcessed; - } - - public void setAlreadyTrackedSampleIdsToBeProcessed( - Set<Long> alreadyTrackedSampleIdsToBeProcessed) - { - this.alreadyTrackedSampleIdsToBeProcessed = alreadyTrackedSampleIdsToBeProcessed; - } - - public Set<Long> getAlreadyTrackedSampleIdsProcessed() - { - return alreadyTrackedSampleIdsProcessed; - } - - public void setAlreadyTrackedSampleIdsProcessed(Set<Long> alreadyTrackedSampleIdsProcessed) - { - this.alreadyTrackedSampleIdsProcessed = alreadyTrackedSampleIdsProcessed; - } - - public Properties getLastSeenProperties() - { - return lastSeenProperties; - } - - public void setLastSeenProperties(Properties lastSeenProperties) - { - this.lastSeenProperties = lastSeenProperties; - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java deleted file mode 100644 index 2d4b6fc9c6c..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/Email.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.From; -import ch.systemsx.cisd.common.mail.IMailClient; - -/** - * Simple encapsulation of {@link IMailClient#sendMessage(String, String, String, From, String...)} method parameters. - * - * @author Piotr Buczek - */ -public class Email -{ - private final String subject; - - private final String content; - - private final EMailAddress replyToOrNull; - - private final EMailAddress fromOrNull; - - private final EMailAddress[] recipients; - - public Email(String subject, String content, EMailAddress replyToOrNull, EMailAddress fromOrNull, - EMailAddress... recipients) - { - super(); - this.subject = subject; - this.content = content; - this.replyToOrNull = replyToOrNull; - this.fromOrNull = fromOrNull; - this.recipients = recipients; - } - - public Email(String subject, String content, EMailAddress replyToOrNull, String fromOrNull, - EMailAddress... recipients) - { - this(subject, content, replyToOrNull, new EMailAddress(fromOrNull), recipients); - } - - public String getSubject() - { - return subject; - } - - public String getContent() - { - return content; - } - - public EMailAddress getReplyToOrNull() - { - return replyToOrNull; - } - - public EMailAddress getFromOrNull() - { - return fromOrNull; - } - - public EMailAddress[] getRecipients() - { - return recipients; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java deleted file mode 100644 index ae91239a0c7..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EmailWithSummary.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -/** - * Encapsulation of {@link Email} with a short summary of its content. - * - * @author Piotr Buczek - */ -public class EmailWithSummary -{ - private final Email email; - - private final String summary; - - public EmailWithSummary(Email email, String summary) - { - this.email = email; - this.summary = summary; - } - - public Email getEmail() - { - return email; - } - - public String getSummary() - { - return summary; - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java deleted file mode 100644 index 08c7d402190..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Structure containing all data about tracked entities that will be used in a single email to an recipient. Its purpose is to group data that will be - * used to generate content of an email containing merged information about all events that the recipient should be notified about. - * - * @author Piotr Buczek - */ -public class EntityTrackingEmailData -{ - private List<Sample> sequencingSamplesToBeProcessed = new ArrayList<Sample>(0); - - private List<Sample> sequencingSamplesProcessed = new ArrayList<Sample>(0); - - private final List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>(0); - - private final EMailAddress recipient; - - /** creates email data for given <var>recipient</var> */ - public EntityTrackingEmailData(EMailAddress recipient) - { - this.recipient = recipient; - } - - public EMailAddress getRecipient() - { - return recipient; - } - - public List<Sample> getSequencingSamplesToBeProcessed() - { - return sequencingSamplesToBeProcessed; - } - - public List<Sample> getSequencingSamplesProcessed() - { - return sequencingSamplesProcessed; - } - - public List<AbstractExternalData> getDataSets() - { - return dataSets; - } - - /** adds info about newly tracked sequencing sample to be processed */ - public void addSequencingSampleToBeProcessed(Sample sequencingSample) - { - sequencingSamplesToBeProcessed.add(sequencingSample); - } - - /** adds info about newly tracked sequencing sample successfully processed */ - public void addSequencingSampleProcessed(Sample sequencingSample) - { - sequencingSamplesProcessed.add(sequencingSample); - } - - /** adds info about newly tracked data set */ - public void addDataSet(AbstractExternalData dataSet) - { - dataSets.add(dataSet); - } - - /** short description of data kept in the structure */ - public String getDescription() - { - final StringBuilder sb = new StringBuilder(); - appendSamplesInfo(sb, sequencingSamplesToBeProcessed, "possible for processing"); - appendSamplesInfo(sb, sequencingSamplesProcessed, "successfully processed"); - appendDataSetsInfo(sb); - return sb.toString(); - } - - private void appendSamplesInfo(final StringBuilder sb, final List<Sample> samples, - final String actionDescription) - { - if (samples.isEmpty()) - { - sb.append(String.format("no new samples are %s\n", actionDescription)); - } else - { - for (Sample seqencingSample : samples) - { - final String sequencingSampleIdentifier = seqencingSample.getIdentifier(); - sb.append(String.format("Sequencing sample: '%s' is %s", - sequencingSampleIdentifier, actionDescription)); - sb.append("\n"); - } - } - } - - private void appendDataSetsInfo(final StringBuilder sb) - { - if (getDataSets().isEmpty()) - { - sb.append("no new data sets tracked"); - } else - { - sb.append(getDataSets().size() + " new data set(s) tracked: "); - for (AbstractExternalData dataSet : getDataSets()) - { - sb.append(dataSet.getIdentifier() + ", "); - } - } - sb.append("\n"); - } - - // - // Object - // - - @Override - public String toString() - { - return getDescription(); - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java deleted file mode 100644 index 3ddb5aacfbf..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * Manager that groups data about tracked entities into {@link EntityTrackingEmailData} objects. - * - * @author Piotr Buczek - * @author Manuel Kohler - */ -class EntityTrackingEmailDataManager -{ - private final static String CONTACT_PERSON_EMAIL = "CONTACT_PERSON_EMAIL"; - - private final static String PRINCIPAL_INVESTIGATOR_EMAIL = "PRINCIPAL_INVESTIGATOR_EMAIL"; - - private final static String CONTACT_DATA_MANAGER_EMAIL = "CONTACT_DATA_MANAGER_EMAIL"; - - private static Map<String, String> recipientsBySpace; - - public static void initialize(final Map<String, String> recipients) - { - recipientsBySpace = recipients; - } - - public static Collection<EntityTrackingEmailData> groupByRecipient( - TrackedEntities trackedEntities) - { - assert recipientsBySpace != null : "recipientsBySpace not initialized"; - // <recipients email, email data> - final Map<EMailAddress, EntityTrackingEmailData> dataByRecipient = - new HashMap<EMailAddress, EntityTrackingEmailData>(); - groupSequencingSamplesToBeProcessed(dataByRecipient, trackedEntities); - groupSequencingSamplesProcessed(dataByRecipient, trackedEntities); - groupDataSetSamples(dataByRecipient, trackedEntities); - return dataByRecipient.values(); - } - - public static Collection<EntityTrackingEmailData> groupByRecipientDataSets( - TrackedEntities trackedEntities) - { - assert recipientsBySpace != null : "recipientsBySpace not initialized"; - // <recipients email, email data> - final Map<EMailAddress, EntityTrackingEmailData> dataByRecipient = - new HashMap<EMailAddress, EntityTrackingEmailData>(); - groupDataSetSamples(dataByRecipient, trackedEntities); - return dataByRecipient.values(); - } - - /** Puts tracked sequencing samples to be processed grouped by recipient into <var>result</var>. */ - private static void groupSequencingSamplesToBeProcessed( - Map<EMailAddress, EntityTrackingEmailData> result, TrackedEntities trackedEntities) - { - for (Sample sequencingSample : trackedEntities.getSequencingSamplesToBeProcessed()) - { - for (EMailAddress recipient : getSequencingSampleTrackingRecipients(Collections - .singleton(sequencingSample))) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addSequencingSampleToBeProcessed(sequencingSample); - } - } - } - - /** Puts tracked processed sequencing samples grouped by recipient into <var>result</var>. */ - private static void groupSequencingSamplesProcessed( - Map<EMailAddress, EntityTrackingEmailData> result, TrackedEntities trackedEntities) - { - for (Sample sequencingSample : trackedEntities.getSequencingSamplesProcessed()) - { - for (EMailAddress recipient : getSequencingSampleTrackingRecipients(Collections - .singleton(sequencingSample))) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addSequencingSampleProcessed(sequencingSample); - } - } - } - - /** Puts tracked data sets grouped by recipient into <var>result</var>. */ - private static void groupDataSetSamples(Map<EMailAddress, EntityTrackingEmailData> result, - TrackedEntities trackedEntities) - { - for (AbstractExternalData dataSet : trackedEntities.getDataSets()) - { - for (EMailAddress recipient : getDataSetTrackingRecipients(dataSet)) - { - final EntityTrackingEmailData emailData = - getOrCreateRecipientEmailData(result, recipient); - emailData.addDataSet(dataSet); - } - } - } - - private static EntityTrackingEmailData getOrCreateRecipientEmailData( - Map<EMailAddress, EntityTrackingEmailData> dataByRecipient, EMailAddress recipient) - { - EntityTrackingEmailData emailDataOrNull = dataByRecipient.get(recipient); - if (emailDataOrNull == null) - { - emailDataOrNull = new EntityTrackingEmailData(recipient); - dataByRecipient.put(recipient, emailDataOrNull); - } - return emailDataOrNull; - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>sequencingSample</var>.<br> - */ - // NOTE: Set is needed because one recipient can occur in many roles for one sample - private static Set<EMailAddress> getSequencingSampleTrackingRecipients( - Collection<Sample> sequencingSamples) - { - assert sequencingSamples != null; - - final Set<EMailAddress> recipients = new HashSet<EMailAddress>(); - - // Recipients are taken from properties of the sequencing sample. - final Set<String> recipientPropertyTypeCodes = new HashSet<String>(); - recipientPropertyTypeCodes.add(CONTACT_PERSON_EMAIL); - recipientPropertyTypeCodes.add(PRINCIPAL_INVESTIGATOR_EMAIL); - recipientPropertyTypeCodes.add(CONTACT_DATA_MANAGER_EMAIL); - - for (Sample sequencingSample : sequencingSamples) - { - for (Map.Entry<String, String> space : recipientsBySpace.entrySet()) - { - if (sequencingSample.getIdentifier().split("/")[1].equals(space.getKey())) // 20.10 Bugfix to get Space Code - { - String spaceRecipientOrNull = - recipientsBySpace.get(space.getKey()); - if (spaceRecipientOrNull != null) - { - EMailAddress myEmail = new EMailAddress(spaceRecipientOrNull); - recipients.add(myEmail); - } - } - } - - for (IEntityProperty property : sequencingSample.getProperties()) - { - final String propertyCode = property.getPropertyType().getCode(); - final String propertyValue = property.tryGetAsString(); - if (recipientPropertyTypeCodes.contains(propertyCode)) - { - EMailAddress myEmail = new EMailAddress(propertyValue); - recipients.add(myEmail); - } - } - } - - return recipients; - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>flowLaneSample</var>. - */ - private static Set<EMailAddress> getFlowLaneSampleTrackingRecipients(Sample flowLaneSample) - { - // Recipients are taken from properties of sequencing sample - // that is a parent of the flow lane sample. - assert flowLaneSample != null; - return getSequencingSampleTrackingRecipients(flowLaneSample.getParents()); - } - - /** - * Returns a set of emails of recipients that should get a tracking information about given <var>dataSet</var>. - */ - private static Set<EMailAddress> getDataSetTrackingRecipients(AbstractExternalData dataSet) - { - // Recipients are taken from properties of sequencing sample - // that is a parent of a flow lane sample connected directly with the data set. - assert dataSet != null; - return getFlowLaneSampleTrackingRecipients(dataSet.getSample()); - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java deleted file mode 100644 index d00978e6287..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java +++ /dev/null @@ -1,586 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.TreeMap; - -import org.apache.commons.lang3.time.DateUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.main.Parameters; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.properties.PropertyUtils; -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerator -{ - private static final String DB_INSTANCE = "BSSE"; - - private static final String NOTIFICATION_EMAIL_FROM = "mail.from"; - - private static final String NOTIFICATION_EMAIL_REPLY_TO = "notification-email-reply-to"; - - private static final String NOTIFICATION_EMAIL_SUBJECT = "notification-email-subject"; - - private static final String AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX = - "-affiliation-notification-email-contact"; - - private static final String SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX = "-space-notification-email-contact"; - - private final EMailAddress from; - - private final EMailAddress replyTo; - - private final String subject; - - private final String template; - - public EntityTrackingEmailGenerator(Properties properties, String template, SessionContextDTO session) - { - this.from = new EMailAddress(PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_FROM)); - this.replyTo = new EMailAddress(PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_REPLY_TO)); - this.subject = PropertyUtils.getMandatoryProperty(properties, NOTIFICATION_EMAIL_SUBJECT); - this.template = template; - - final Map<String, String> recipientsBySpace = - retrieveRecipientsBySpace(properties, session); - EntityTrackingEmailDataManager.initialize(recipientsBySpace); - - } - - // <affiliation, recipient email> - @Deprecated - private Map<String, String> retrieveRecipientsByAffiliation(Properties properties) - { - final Map<String, String> result = new HashMap<String, String>(); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - if (propertyKey.endsWith(AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX)) - { - final String affiliation = - propertyKey.substring(0, propertyKey.length() - - AFFILIATION_NOTIFICATION_EMAIL_CONTACT_SUFFIX.length()); - final String affiliationRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(affiliation, affiliationRecipient); - } - } - return result; - } - - /** - * Builds a Map of <spaces, email addresses> - * - * @author Manuel Kohler - */ - private Map<String, String> retrieveRecipientsBySpace(Properties properties, SessionContextDTO session) - { - final Map<String, String> result = new HashMap<String, String>(); - - Parameters params = new Parameters(properties); - String serviceURL = params.getOpenbisServerURL() + IGeneralInformationService.SERVICE_URL; - IGeneralInformationService gis = HttpInvokerUtils.createServiceStub(IGeneralInformationService.class, serviceURL, - 5 * DateUtils.MILLIS_PER_MINUTE); - - List<SpaceWithProjectsAndRoleAssignments> spacesList = - gis.listSpacesWithProjectsAndRoleAssignments(session.getSessionToken(), DB_INSTANCE); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - - if (propertyKey.endsWith(SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX)) - { - if (propertyKey.contains("*")) - { - String spacePreffix = propertyKey.substring(0, propertyKey.lastIndexOf("*")); - for (SpaceWithProjectsAndRoleAssignments space : spacesList) - { - if (space.getCode().startsWith(spacePreffix)) - { - final String spaceRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(space.getCode(), spaceRecipient); - } - } - } else - { - final String space = - propertyKey.substring(0, propertyKey.length() - - SPACE_NOTIFICATION_EMAIL_CONTACT_SUFFIX.length()); - final String spaceRecipient = - PropertyUtils.getMandatoryProperty(properties, propertyKey); - result.put(space, spaceRecipient); - } - } - } - return result; - } - - @Override - public List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities) - { - final Collection<EntityTrackingEmailData> emailDataGroupedByRecipient = - EntityTrackingEmailDataManager.groupByRecipient(trackedEntities); - - final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>(); - for (EntityTrackingEmailData emailData : emailDataGroupedByRecipient) - { - results.add(createEmailWithSummary(emailData)); - } - return results; - } - - public List<EmailWithSummary> generateDataSetsEmails(TrackedEntities trackedEntities) - { - final Collection<EntityTrackingEmailData> emailDataGroupedByRecipientDataSets = - EntityTrackingEmailDataManager.groupByRecipientDataSets(trackedEntities); - - final List<EmailWithSummary> results = new ArrayList<EmailWithSummary>(); - for (EntityTrackingEmailData emailData : emailDataGroupedByRecipientDataSets) - { - results.add(createEmailWithSummary(emailData)); - } - return results; - } - - private EmailWithSummary createEmailWithSummary(EntityTrackingEmailData emailData) - { - return new EmailWithSummary(createEmail(emailData), emailData.getDescription()); - } - - private Email createEmail(EntityTrackingEmailData emailData) - { - String content = EmailContentGenerator.fillTemplateWithData(template, emailData); - EMailAddress recipients = emailData.getRecipient(); - - String[] mailStringArray = filterBlanks(recipients.tryGetEmailAddress().split(",|;| ")); - EMailAddress[] recipientsArray = new EMailAddress[mailStringArray.length]; - - for (int i = 0; i < mailStringArray.length; ++i) - { - EMailAddress e = new EMailAddress(mailStringArray[i]); - recipientsArray[i] = e; - } - - return new Email(subject, content, replyTo, from, recipientsArray); - - } - - private static String[] filterBlanks(String[] arr) - { - ArrayList<String> result = new ArrayList<String>(); - - for (String s : arr) - { - if (false == StringUtils.isBlank(s)) - { - result.add(s.trim()); - } - } - - return result.toArray(new String[0]); - } - - /** - * Helper class for generation of email content. - * - * @author Piotr Buczek - */ - private static final class EmailContentGenerator - { - private static final char NEW_LINE = '\n'; - - private static final int SEPARATOR_LINE_WIDTH = 100; - - private static final char SECTION_SEPARATOR_CHAR = '#'; - - private static final char SUBSECTION_SEPARATOR_CHAR = '-'; - - private static final String SECTION_SEPARATOR_LINE = - createSeparatorLine(SECTION_SEPARATOR_CHAR); - - private static final String SUBSECTION_SEPARATOR_LINE = - createSeparatorLine(SUBSECTION_SEPARATOR_CHAR); - - private final static String EXTERNAL_SAMPLE_NAME_PROPERTY_CODE = "EXTERNAL_SAMPLE_NAME"; - - private final static String CONTACT_PERSON_NAME_PROPERTY_CODE = "CONTACT_PERSON_NAME"; - - private final static String INDEX1_PROPERTY_CODE = "BARCODE"; - - private final static String INDEX2_PROPERTY_CODE = "INDEX2"; - - private static final String PERMLINK_LABEL = "See details in openBIS"; - - private static final String GENARATED_CONTENT_TARGET = "{generated-content}"; - - public static String fillTemplateWithData(String template, EntityTrackingEmailData emailData) - { - return template.replace(GENARATED_CONTENT_TARGET, generateContent(emailData)); - } - - private static String generateContent(EntityTrackingEmailData emailData) - { - StringBuilder sb = new StringBuilder(); - appendDataSetsData(sb, emailData.getDataSets()); - appendSequencingSamplesData(sb, emailData.getSequencingSamplesToBeProcessed(), false); - appendSequencingSamplesData(sb, emailData.getSequencingSamplesProcessed(), true); - return sb.toString(); - } - - private static void appendSequencingSamplesData(StringBuilder sb, - Collection<Sample> sequencingSamples, boolean processed) - { - for (Sample sequencingSample : sequencingSamples) - { - final String externalSampleName = getExternalSampleName(sequencingSample); - - appendln(sb, SECTION_SEPARATOR_LINE); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - - // append Sequencing sample details - if (processed) - { - appendSampleDetails(sb, - String.format("Library processing of sample '%s' was successful.", - externalSampleName), sequencingSample); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } else - { - appendSampleDetails(sb, String.format( - "Library processing of sample '%s' is possible.", externalSampleName), - sequencingSample); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } - } - } - - private static void appendSampleDetails(StringBuilder sb, String heading, Sample sample) - { - appendln(sb, heading); - - // basic sample info - appendAttribute(sb, PERMLINK_LABEL, sample.getSearchlink()); - appendAttribute(sb, "Sample identifier", sample.getIdentifier()); - appendNewline(sb); - - // sample properties - appendProperties(sb, sample.getProperties()); - } - - private static void appendDataSetsData(StringBuilder sb, List<AbstractExternalData> dataSets) - { - if (dataSets.isEmpty()) - { - return; - } - appendln(sb, SECTION_SEPARATOR_LINE); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - appendln(sb, "There are new sequencing results available to you."); - appendln(sb, SUBSECTION_SEPARATOR_LINE); - - // Using a TreeMap, so the keys are sorted - TreeMap<String, List<AbstractExternalData>> sampleMap = new TreeMap<String, List<AbstractExternalData>>(); - List<AbstractExternalData> dsList = new ArrayList<AbstractExternalData>(); - - // we just loop over the data sets and write the connected samples as keys - // and the data sets as values in a map, so that we can group together as - // data sets per lane - for (AbstractExternalData dataSet : dataSets) - { - Sample s = dataSet.getSample(); - if (sampleMap.containsKey(s.getIdentifier())) - { - dsList = sampleMap.get(s.getIdentifier()); - } - dsList.add(dataSet); - sampleMap.put(s.getIdentifier(), dsList); - dsList = new ArrayList<AbstractExternalData>(); - } - - // now we can write out this per sample - Iterator<Entry<String, List<AbstractExternalData>>> it = sampleMap.entrySet().iterator(); - while (it.hasNext()) - { - Map.Entry pairs = (Map.Entry) it.next(); - appendln(sb, String.format("Results for %s", pairs.getKey())); - dsList = (List<AbstractExternalData>) pairs.getValue(); - for (AbstractExternalData ed : dsList) - { - appendDataSetDetails(sb, ed); - } - it.remove(); // avoids a ConcurrentModificationException - appendln(sb, SUBSECTION_SEPARATOR_LINE); - } - } - - private static void appendDataSetDetails(StringBuilder sb, AbstractExternalData dataSet) - { - Collection<Sample> sequencingSamples; - - Sample flowLaneSample = dataSet.getSample(); - assert flowLaneSample != null; - sequencingSamples = flowLaneSample.getParents(); - assert sequencingSamples != null; - - String Index1 = getIndex1(dataSet); - String Index2 = getIndex2(dataSet); - - HashMap<String, String> parentProperties = propertiesFromParentSample(dataSet, sequencingSamples, Index1, Index2); - - String externalSampleName = getExternalSampleNamefromDataSet(dataSet); - String contactPersonName = parentProperties.get(CONTACT_PERSON_NAME_PROPERTY_CODE); - - String Index = null; - - if (Index1 != null) - { - Index = Index1; - } - if (Index2 != null) - { - Index = Index + "-" + Index2; - } - - if (Index != null && externalSampleName != null) - { - appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString() + - " Index: " + Index + ", External Sample Name: " + externalSampleName + - ", Contact Person: " + contactPersonName); - } - else - { - appendln(sb, "Data Set Type: " + dataSet.getDataSetType().toString() + ", No Meta Data"); - } - appendln(sb, dataSet.getPermlink()); - } - - private static String getExternalSampleName(Sample sequencingSample) - { - String externalSampleName = - tryGetSamplePropertyValue(sequencingSample, EXTERNAL_SAMPLE_NAME_PROPERTY_CODE); - assert externalSampleName != null; - return externalSampleName; - } - - private static String getContactPersonName(Sample sequencingSample) - { - String contactPersonName = tryGetSamplePropertyValue(sequencingSample, CONTACT_PERSON_NAME_PROPERTY_CODE); - assert contactPersonName != null; - return contactPersonName; - } - - private static String getIndex1(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) - { - Index = p.getVocabularyTerm().getCode(); - if (!Index.equals("NOINDEX")) - { - return Index; - } - } - } - return null; - } - - private static String getIndex2(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String Index = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) - { - Index = p.getVocabularyTerm().getCode(); - if (!Index.equals("NOINDEX")) - { - return Index; - } - } - } - return null; - } - - private static String getExternalSampleNamefromDataSet(AbstractExternalData dataSet) - { - List<IEntityProperty> properties = dataSet.getProperties(); - - String externalSampleName = null; - for (IEntityProperty p : properties) - { - if (p.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE)) - { - externalSampleName = p.getValue(); - return externalSampleName; - } - } - return null; - } - - private static HashMap<String, String> propertiesFromParentSample(AbstractExternalData dataSet, - Collection<Sample> sequencingSamples, String dsIndex1, String dsIndex2) - { - HashMap<String, String> parentPropertiesMap = new HashMap<String, String>(); - if (dsIndex1 == null) - { - return parentPropertiesMap; - } - if (dsIndex2 == null) - { - dsIndex2 = ""; - } - - for (Sample parent : sequencingSamples) - { - String parentIndex1 = ""; - String parentIndex2 = ""; - String externalSampleName = ""; - String contactPersonName = ""; - - List<IEntityProperty> parentSampleProperties = parent.getProperties(); - for (IEntityProperty pp : parentSampleProperties) - { - if (pp.getPropertyType().getCode().equals(INDEX1_PROPERTY_CODE)) - { - parentIndex1 = pp.getVocabularyTerm().getCode(); - } - - if (pp.getPropertyType().getCode().equals(INDEX2_PROPERTY_CODE)) - { - parentIndex2 = pp.getVocabularyTerm().getCode(); - if (parentIndex2.equals(null)) - { - parentIndex2 = ""; - } - } - - if (pp.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE)) - { - externalSampleName = pp.getValue(); - } - - if (pp.getPropertyType().getCode().equals(CONTACT_PERSON_NAME_PROPERTY_CODE)) - { - contactPersonName = pp.getValue(); - } - - // //if(index1 == parentIndex1 && (!index2 || !parentIndex2 || index2 == parentIndex2)){ - if (parentIndex1.equals(dsIndex1) && (!(dsIndex2.isEmpty()) || !(parentIndex2.isEmpty()) || parentIndex2.equals(dsIndex2))) - { - - parentIndex1 = ""; - parentIndex2 = ""; - - // System.out.println("Found matching meta data for: " + dataSet.getCode() + " from " + parent.getCode()); - - parentPropertiesMap.put(EXTERNAL_SAMPLE_NAME_PROPERTY_CODE, externalSampleName); - parentPropertiesMap.put(CONTACT_PERSON_NAME_PROPERTY_CODE, contactPersonName); - } - - } - - } - return parentPropertiesMap; - } - - private static String tryGetSamplePropertyValue(Sample sequencingSample, String propertyCode) - { - String result = null; - for (IEntityProperty property : sequencingSample.getProperties()) - { - if (property.getPropertyType().getCode().equals(propertyCode)) - { - result = StringEscapeUtils.unescapeHtml(property.getValue()); - break; - } - } - return result; - } - - // NOTE: Information about properties assigned to entity type are not loaded. - // If it would be available we could append information about all properties assigned - // to entity type, not only about properties filled for specific entity. Additionally - // we could group entities by in sections. - private static void appendProperties(StringBuilder sb, List<IEntityProperty> properties) - { - Collections.sort(properties); // sorting by property label or code if there is no label - for (IEntityProperty property : properties) - { - final String label = property.getPropertyType().getLabel(); - final String valueOrNull = property.tryGetAsString(); - appendAttribute(sb, label, valueOrNull); - } - } - - private static void appendAttribute(StringBuilder sb, String name, String valueOrNull) - { - appendln(sb, String.format("- %s:\n\t\t%s", StringEscapeUtils.unescapeHtml(name), - valueOrNull == null ? "(empty)" : StringEscapeUtils.unescapeHtml(valueOrNull))); - } - - private static void appendln(StringBuilder sb, String string) - { - sb.append(string); - appendNewline(sb); - } - - private static void appendNewline(StringBuilder sb) - { - sb.append(NEW_LINE); - } - - private static String createSeparatorLine(char separatorChar) - { - char[] line = new char[SEPARATOR_LINE_WIDTH]; - Arrays.fill(line, separatorChar); - return new String(line); - } - - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java deleted file mode 100644 index 5d898f6eec5..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/IEntityTrackingEmailGenerator.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.email; - -import java.util.List; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public interface IEntityTrackingEmailGenerator -{ - /** - * Generates all {@link EmailWithSummary}s to be send containing information about <var>trackedEntities</var>. - * - * @param trackedEntities recently tracked entities - */ - List<EmailWithSummary> generateEmails(TrackedEntities trackedEntities); - - List<EmailWithSummary> generateDataSetsEmails(TrackedEntities changedEntities); -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java deleted file mode 100644 index 309e0099db6..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAO.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.StringUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.systemsx.cisd.common.io.PropertyIOUtils; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class FileBasedTrackingDAO implements ITrackingDAO -{ - static String LAST_SEEN_DATASET_ID = "lastSeenDatasetId"; - - static String TO_BE_PROCESSED = "trackedSamplesToBeProcessed"; - - static String PROCESSED = "trackedSamplesProcessedSuccessfully"; - - static String SEPARATOR = " "; - - static String EQUAL = "="; - - private final String filePathSampleDb; - - private final String filePathDatasetDb; - - public FileBasedTrackingDAO(String filePathSampleDb, String filePathDatasetDb) - { - this.filePathSampleDb = filePathSampleDb; - this.filePathDatasetDb = filePathDatasetDb; - } - - @Override - public void saveTrackingState(TrackingStateDTO state) - { - List<String> lines = new ArrayList<String>(); - lines.add(TO_BE_PROCESSED + SEPARATOR - + sampleIdsAsString(state.getAlreadyTrackedSampleIdsToBeProcessed())); - lines.add(PROCESSED + SEPARATOR - + sampleIdsAsString(state.getAlreadyTrackedSampleIdsProcessed())); - - writeLines(new File(filePathSampleDb), lines); - - lines = new ArrayList<String>(); - for (Map.Entry<String, Long> entry : state.getLastSeenDataSetIdMap().entrySet()) - { - lines.add(entry.getKey() + EQUAL + entry.getValue()); - } - writeLines(new File(filePathDatasetDb), lines); - } - - private String sampleIdsAsString(Collection<Long> sampleIds) - { - return StringUtils.join(sampleIds, SEPARATOR); - } - - @Override - @SuppressWarnings("unchecked") - public TrackingStateDTO getTrackingState() - { - try - { - TrackingStateDTO state = new TrackingStateDTO(); - - Properties props = PropertyIOUtils.loadProperties(filePathDatasetDb); - TreeMap<String, Long> propsMap = new TreeMap<String, Long>(); - for (Object o : props.keySet()) - { - propsMap.put(o.toString(), Long.parseLong(props.get(o).toString())); - } - state.setLastSeenProperties(props); - state.setLastSeenDataSetIdMap(propsMap); - - List<String> lines = IOUtils.readLines(new FileReader(filePathSampleDb)); - String[] toBeProcessed = lines.get(0).split(SEPARATOR); - String[] processed = lines.get(1).split(SEPARATOR); - state.setAlreadyTrackedSampleIdsToBeProcessed(parseIds(toBeProcessed)); - state.setAlreadyTrackedSampleIdsProcessed(parseIds(processed)); - - return state; - } catch (Exception e) - { - throw LogUtils.environmentError("Incorrect file format", e); - } - } - - private static Set<Long> parseIds(String[] array) - { - Set<Long> ids = new TreeSet<Long>(); - for (int i = 1; i < array.length; i++) - { - ids.add(Long.parseLong(array[i])); - } - return ids; - } - - private static void writeLines(File file, List<String> lines) - { - try - { - IOUtils.writeLines(lines, "\n", new FileOutputStream(file)); - } catch (IOException ex) - { - throw LogUtils.environmentError(String.format( - "Cannot save the file %s with content: %s", file.getPath(), lines), ex); - } - } - -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java deleted file mode 100644 index 10ac486dafa..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/ITrackingDAO.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; - -/** - * @author Tomasz Pylak - */ -public interface ITrackingDAO -{ - void saveTrackingState(TrackingStateDTO state); - - TrackingStateDTO getTrackingState(); -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java deleted file mode 100644 index 2b4d58a0f67..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/Parameters.java +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright 2016 ETH Zuerich, SIS - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import static ch.systemsx.cisd.common.properties.PropertyUtils.getMandatoryProperty; - -import java.util.HashMap; -import java.util.Map; -import java.util.Properties; - -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.mail.MailClient; -import ch.systemsx.cisd.common.properties.PropertyUtils; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class Parameters -{ - private static final String OPENBIS_USER = "openbis-user"; - - private static final String OPENBIS_PASSWORD = "openbis-password"; - - private static final String OPENBIS_SERVER_URL = "openbis-server-url"; - - private static final String PERMLINK_URL = "permlink-url"; - - private static final String TRACKING_ADMIN_EMAIL = "tracking-admin-email"; - - private static final String NOTIFICATION_EMAIL_FROM = "mail.from"; - - private static final String SPACE_WHITELIST = "space-whitelist"; - - private static final String DBM_SPACE_PREFIX = "dbm-space-prefix"; - - // For Development Mode - private static final String DEBUG = "debug"; - - private static final String OLD_DATA_SET_BACKLOG_NUMBER = "old-data-set-backlog-number"; - - private static final String DATA_SET_TYPE_LIST = "dataset-type-list"; - - private static final String DESTINATION_FOLDER = "destination-folder"; - - private static final String DESTINATION_FOLDER_SUFFIX = "destination-folder"; - - private static final String RSYNC_BINARY = "rsync-binary"; - - private static final String RSYNC_FLAGS = "rsync-flags"; - - private static final String DSS_ROOT_DIR = "dss-root-dir"; - - private final String openbisUser; - - private final String openbisPassword; - - private final String openbisServerURL; - - private final String permlinkURL; - - private final IMailClient mailClient; - - private final String adminEmail; - - private final String notificationEmail; - - private final String spaceWhitelist; - - private final String dbmSpacePrefix; - - private final boolean debug; - - private final long oldDataSetBacklogNumber; - - private final String dataSetTypeList; - - private final String destinationFolder; - - private final String rsyncBinary; - - private final String rsyncFlags; - - private final String dssRootDir; - - private final Map<String, String> destinationFolderMap; - - public Parameters(Properties props) - { - this.openbisUser = getMandatoryProperty(props, OPENBIS_USER); - this.openbisPassword = getMandatoryProperty(props, OPENBIS_PASSWORD); - this.openbisServerURL = getMandatoryProperty(props, OPENBIS_SERVER_URL); - this.permlinkURL = PropertyUtils.getProperty(props, PERMLINK_URL, openbisServerURL); - this.mailClient = new MailClient(props); - this.adminEmail = PropertyUtils.getProperty(props, TRACKING_ADMIN_EMAIL); - this.notificationEmail = PropertyUtils.getProperty(props, NOTIFICATION_EMAIL_FROM); - this.spaceWhitelist = PropertyUtils.getProperty(props, SPACE_WHITELIST); - this.dbmSpacePrefix = PropertyUtils.getProperty(props, DBM_SPACE_PREFIX); - this.debug = PropertyUtils.getBoolean(props, DEBUG, false); - this.oldDataSetBacklogNumber = PropertyUtils.getInt(props, OLD_DATA_SET_BACKLOG_NUMBER, 0); - this.dataSetTypeList = PropertyUtils.getProperty(props, DATA_SET_TYPE_LIST); - this.destinationFolder= PropertyUtils.getProperty(props, DESTINATION_FOLDER); - this.rsyncBinary = PropertyUtils.getProperty(props, RSYNC_BINARY); - this.rsyncFlags = PropertyUtils.getProperty(props, RSYNC_FLAGS); - this.dssRootDir = PropertyUtils.getProperty(props, DSS_ROOT_DIR); - - this.destinationFolderMap = this.setDataDestinationFolder(props); - } - - public String getOpenbisUser() - { - return openbisUser; - } - - public String getOpenbisPassword() - { - return openbisPassword; - } - - public String getOpenbisServerURL() - { - return openbisServerURL; - } - - public IMailClient getMailClient() - { - return mailClient; - } - - public String getPermlinkURL() - { - return permlinkURL; - } - - public String getAdminEmail() - { - return adminEmail; - } - - public String getNotificationEmail() - { - return notificationEmail; - } - - public String getSpaceWhitelist() - { - return spaceWhitelist; - } - - public String getDbmSpacePrefix() - { - return dbmSpacePrefix; - } - - public boolean getDebug() - { - return debug; - } - - public long getoldDataSetBacklogNumber() - { - return oldDataSetBacklogNumber; - } - - public String getdataSetTypeList() - { - return dataSetTypeList; - } - - public String getDestinationFolder() - { - return destinationFolder; - } - - public String getRsyncBinary() - { - return rsyncBinary; - } - - public String [] getRsyncFlags() - { - return rsyncFlags.split("\\s+"); - } - - public String getDssRoot() - { - return dssRootDir; - } - - public Map<String, String> getDestinationFolderMap() { - return destinationFolderMap; - } - - private Map<String, String> setDataDestinationFolder(Properties properties) { - - final Map<String, String> destinationFolderMap = new HashMap<String, String>(); - - for (Object key : properties.keySet()) - { - final String propertyKey = (String) key; - - if (propertyKey.endsWith(DESTINATION_FOLDER_SUFFIX)) - { - String datasetTypePrefix = propertyKey.split("-")[0]; - destinationFolderMap.put(datasetTypePrefix, PropertyUtils.getMandatoryProperty(properties, propertyKey)); - } - } - return destinationFolderMap; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java deleted file mode 100644 index d96c507f08d..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java +++ /dev/null @@ -1,801 +0,0 @@ -/* - * Copyright 2015 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.*; -import java.util.Map.Entry; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.email.Email; -import ch.ethz.bsse.cisd.dsu.tracking.email.EmailWithSummary; -import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.systemsx.cisd.common.collection.CollectionUtils; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.Status; -import ch.systemsx.cisd.common.filesystem.rsync.RsyncCopier; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult; -// v3 -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria; -import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ - -public class TrackingBO -{ - private static final String HIGH_PRIORITY_DATA_SET_TYPE = "FASTQ_GZ"; - - private static final String ORIGINAL_PATH = "/original/"; - - private static final String PROPERTY_RUN_NAME_FOLDER = "RUN_NAME_FOLDER"; - - private static final String SEQUENCING_SAMPLE_TYPE = "ILLUMINA_SEQUENCING"; - - private static final String FLOW_LANE_SAMPLE_TYPE = "ILLUMINA_FLOW_LANE"; - - private static final String PROCESSING_POSSIBLE_PROPERTY_CODE = "LIBRARY_PROCESSING_POSSIBLE"; - - private static final String PROCESSING_SUCCESSFUL_PROPERTY_CODE = - "LIBRARY_PROCESSING_SUCCESSFUL"; - - private static final String PROPERTY_DATA_TRANSFERRED = "DATA_TRANSFERRED"; - - /** The default date format pattern. */ - public static final String DATE_FORMAT_PATTERN = "yyyy-MM-dd HH:mm:ss"; - - private static final String TRUE = "true"; - - private final ITrackingServer trackingServer; - - private final IEntityTrackingEmailGenerator emailGenerator; - - private final IMailClient mailClient; - - public TrackingBO(ITrackingServer trackingServer, IEntityTrackingEmailGenerator emailGenerator, - IMailClient mailClient) - { - this.trackingServer = trackingServer; - this.emailGenerator = emailGenerator; - this.mailClient = mailClient; - } - - public void trackAndNotify(ITrackingDAO trackingDAO, final HashMap<String, String[]> commandLineMap, - Parameters params, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken) - { - Boolean sendEmails = true; - TrackingStateDTO prevTrackingState = trackingDAO.getTrackingState(); - - extractCommandLineFlags(commandLineMap); - LogUtils.debug("prevTrackingState: " + prevTrackingState.getLastSeenDataSetIdMap().toString()); - - TrackedEntities changedEntities = null; - List<EmailWithSummary> emailsWithSummary = null; - - if (commandLineMap.get(TrackingClient.CL_PARAMETER_LANES) != null) - { - String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_LANES); - changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, - commandLineMap, laneCodeList, session, v3, v3SessionToken); - } - - else if (commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES) != null) - { - sendEmails = false; - String[] laneCodeList = commandLineMap.get(TrackingClient.CL_PARAMETER_REMOVE_LANES); - changedEntities = fetchChangedDataSets(prevTrackingState, trackingServer, params, - commandLineMap, laneCodeList, session, v3, v3SessionToken); - } - - else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_ALL)) - { - // changedEntities = fetchChangedEntities(prevTrackingState, trackingServer, commandLineMap, session); - System.out.println("This function is deactivated"); - } - - // just list the potential changed lanes - else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_CHANGED_LANES)) - { - Map<String, String> changed_lanes = fetchChangedLanes(prevTrackingState, trackingServer, params, session); - sendEmails = false; - - } else if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_LIST_SPACES)) - { - sendEmails = false; - String trimmedSpaceWhiteList = ""; - - String spaceWhiteList = (params.getSpaceWhitelist()); - trimmedSpaceWhiteList = spaceWhiteList.replace(" ", ""); - - // trim each list element and sort then - // String trimmedSpaceList = - // Pattern.compile(",") - // .splitAsStream(params.getSpaceWhitelist()) - // .map(String :: trim) - // .sorted() - // .collect(Collectors.joining(",")); - System.out.println(trimmedSpaceWhiteList); - } - - else - { - LogUtils.debug("Should never be reached."); - } - - if (sendEmails) - { - emailsWithSummary = emailGenerator.generateDataSetsEmails(changedEntities); - sendEmails(emailsWithSummary, mailClient); - - } else - { - LogUtils.info("Not sending out any emails."); - } - - if (!params.getDebug() && changedEntities != null) - { - LogUtils.info("Saving new state to tracking database."); - saveTrackingState(prevTrackingState, changedEntities, trackingDAO); - } else - { - LogUtils.info("Debug mode activated! Won't save anything to the tracking database."); - } - - } - - private void extractCommandLineFlags(final HashMap<String, String[]> commandLineMap) - { - StringBuilder sb = new StringBuilder(); - for (Map.Entry<String, String[]> entry : commandLineMap.entrySet()) - { - sb.append(entry.getKey() + " "); - if (entry.getValue() != null) - { - for (String value : entry.getValue()) - { - sb.append(value); - } - } - } - LogUtils.info("Got these command line flags: '" + sb + "'"); - } - - private static void sendEmails(List<EmailWithSummary> emailsWithSummary, IMailClient mailClient) - { - for (EmailWithSummary emailWithSummary : emailsWithSummary) - { - Email email = emailWithSummary.getEmail(); - try - { - logEmailSummary(emailWithSummary); - sendMessage(mailClient, email); - } catch (Exception ex) - { - sendErrorReport(mailClient, ex, email); - } - } - } - - private static void logEmailSummary(EmailWithSummary emailWithSummary) - { - LogUtils.info("Sending an email [" + emailWithSummary.getEmail().getSubject() - + "]. Summary:\n" + emailWithSummary.getSummary()); - } - - // This email could not be sent, most probably the recipient addresses were - // incorrect. - // We send the email to the administrator "replyTo' address, the admin should - // forward it to the right recipient. - private static void sendErrorReport(IMailClient mailClient, Exception exception, Email email) - { - StringBuilder errorReportContentBuilder = new StringBuilder(); - appendLine(errorReportContentBuilder, "Dear openBIS Admin,"); - appendLine(errorReportContentBuilder, - "This email has been generated automatically from the openBIS Changes Tracking system."); - appendLine(errorReportContentBuilder, "There was a failure while trying to send the email:"); - appendLine(errorReportContentBuilder, exception.getMessage() == null ? "<no details>" - : exception.getMessage()); - appendLine(errorReportContentBuilder, - "The possible reason is that the recipient address is not valid."); - appendLine(errorReportContentBuilder, - "If you know the address of the recipient please correct it and forward this email to him."); - appendLine(errorReportContentBuilder, - "!!! Note that the Tracking System will not try to send this email again !!!"); - appendLine(errorReportContentBuilder, - "Please correct the recipient email address in openBIS to avoid similar problems in future."); - appendLine(errorReportContentBuilder, ""); - appendLine(errorReportContentBuilder, "Subject: " + email.getSubject()); - appendLine(errorReportContentBuilder, "Recipients: " - + CollectionUtils.abbreviate(email.getRecipients(), -1)); - appendLine(errorReportContentBuilder, ""); - - appendLine(errorReportContentBuilder, "Original content: "); - appendLine(errorReportContentBuilder, email.getContent()); - String errorReportContent = errorReportContentBuilder.toString(); - - Email errorReportEmail = - new Email("[Tracking] Sending an email failed", errorReportContent, null, email - .getFromOrNull(), email.getReplyToOrNull()); - sendMessage(mailClient, errorReportEmail); - } - - private static void sendMessage(IMailClient mailClient, Email email) - { - String subject = email.getSubject(); - String content = email.getContent(); - EMailAddress replyToOrNull = email.getReplyToOrNull(); - EMailAddress fromOrNull = email.getFromOrNull(); - EMailAddress[] recipients = email.getRecipients(); - - mailClient.sendEmailMessage(subject, content, replyToOrNull, fromOrNull, recipients); - - // sendEmailMessage(String subject, String content, EMailAddress replyToOrNull, - // EMailAddress fromOrNull, EMailAddress... recipients) - - } - - private static void appendLine(StringBuilder sb, String msg) - { - sb.append(msg); - sb.append("\n"); - } - - private static void saveTrackingState(TrackingStateDTO prevTrackingState, - TrackedEntities changedEntities, ITrackingDAO trackingDAO) - { - TrackingStateDTO state = TrackingStateUpdateHelper.calcNewTrackingState(prevTrackingState, changedEntities); - - trackingDAO.saveTrackingState(state); - } - - // gets *all* data sets - private static TrackedEntities fetchChangedEntities(TrackingStateDTO trackingState, - ITrackingServer trackingServer, HashMap<String, String[]> clMap, SessionContextDTO session) - { - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, trackingState - .getLastSeenDatasetId()); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - HashMap<String, ArrayList<Long>> changedTrackingMap = new HashMap<String, ArrayList<Long>>(); - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - addDataSetTo(changedTrackingMap, d); - } - - return gatherTrackedEntities(trackingState, trackingServer, session, dataSets, changedTrackingMap); - } - - private static Map<String, String> fetchChangedLanes(TrackingStateDTO trackingState, - ITrackingServer trackingServer, Parameters params, SessionContextDTO session) - { - long usableDataSetId = getUsableDataSetId(trackingState, params); - LogUtils.info("Using maximum DS techId " + usableDataSetId + " for search of changed data sets"); - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, usableDataSetId); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - Map<String, String> changedLanesMap = new HashMap<String, String>(); - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - Long newDataSetID = d.getId(); - Sample lane = d.getSample(); - String lanePermId = lane.getPermId(); - String laneSpace = lane.getIdentifier().split("/")[1]; // Bugfix for 20.10.X that is not returning the space object - Long maxDatasetIdForSample = getMaxDataSetIdForSample(trackingState, lanePermId); - - // Check if the given lanes/samples have data sets which are newer than the last seen one (= maxDatasetIdForSample) - if (newDataSetID > maxDatasetIdForSample) - { - SampleIdentifier currentLaneId = new SampleIdentifier(d.getSampleCode()); - Sample flowcell = lane.getContainer(); - String runNameFolder = ""; - List<IEntityProperty> flowcellProperties = flowcell.getProperties(); - for (IEntityProperty property : flowcellProperties) - { - if (property.getPropertyType().getCode().equals(PROPERTY_RUN_NAME_FOLDER)) - { - runNameFolder = property.getValue(); - break; - } - } - String laneString = currentLaneId.toString().split(":")[1]; - changedLanesMap.put(runNameFolder + ":" + laneString, laneSpace + " " + lane.getCode()); - LogUtils.debug("DataSetID: " + newDataSetID + " of NEW data Sets > MAX DataSet id for this sample: " + maxDatasetIdForSample); - } - } - - Set<Map.Entry<String, String>> entrySet = changedLanesMap.entrySet(); - for (Entry<String, String> entry : entrySet) - { - // needed for the integration of the openBIS webapp - System.out.println(entry.getKey() + " " + entry.getValue()); - } - LogUtils.debug("changedLanesMap: " + changedLanesMap.toString()); - return changedLanesMap; - } - - private static TrackedEntities fetchChangedDataSets(TrackingStateDTO trackingState, - ITrackingServer trackingServer, Parameters params, final HashMap<String, String[]> commandLineMap, - String[] laneCodeList, SessionContextDTO session, IApplicationServerApi v3, String v3SessionToken) - { - long usableDataSetId = getUsableDataSetId(trackingState, params); - - List<String> spaceWhiteList = Arrays.asList(params.getSpaceWhitelist().split("\\s*,\\s*")); - List<String> datasetTypeList = Arrays.asList(params.getdataSetTypeList().split("\\s*,\\s*")); - - LogUtils.info("Using maximum DS techId " + usableDataSetId + " for search of changed data sets"); - - TrackingDataSetCriteria dataSetCriteria = - new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, usableDataSetId); - List<AbstractExternalData> dataSets = - trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria); - - ArrayList<SampleIdentifier> filterList = new ArrayList<SampleIdentifier>(); - ArrayList<AbstractExternalData> filteredDataSets = new ArrayList<AbstractExternalData>(); - ArrayList<AbstractExternalData> toTransferDataSets = new ArrayList<AbstractExternalData>(); - ArrayList<AbstractExternalData> toTransferDataSetsHighPriority = new ArrayList<AbstractExternalData>(); - - - // changedTrackingMap is used to report back which lanes are written back to the DB which have changed - HashMap<String, ArrayList<Long>> changedTrackingMap = new HashMap<String, ArrayList<Long>>(); - - // Loop over all lanes and create a list of relevant lanes - for (String lane : laneCodeList) - { - LogUtils.info("Searching for new data sets which belong to " + lane); - filterList.add(new SampleIdentifier(lane)); - } - - // Loop over all new data sets - for (AbstractExternalData d : dataSets) - { - Long newDataSetID = d.getId(); - SampleIdentifier currentLaneId = new SampleIdentifier(d.getSampleCode()); - String lanePermId = d.getSample().getPermId(); - Long maxDatasetIdForSample = getMaxDataSetIdForSample(trackingState, lanePermId); - - // Check if the given lanes/samples have data sets which are newer than the last seen one (= maxDatasetIdForSample) - if (filterList.contains(currentLaneId) && newDataSetID > maxDatasetIdForSample) - { - LogUtils.debug("DataSetID: " + newDataSetID + " of NEW data Sets > MAX DataSet id for this sample: " + maxDatasetIdForSample); - filteredDataSets.add(d); - addDataSetTo(changedTrackingMap, d); - - if (spaceWhiteList.contains(d.getSpace().getCode()) || d.getSpace().getCode().startsWith(params.getDbmSpacePrefix())) - { - if (datasetTypeList.contains(d.getDataSetType().getCode())) - { - if (d.tryGetAsDataSet().getStatus().equals(DataSetArchivingStatus.AVAILABLE) - || d.tryGetAsDataSet().getStatus().equals(DataSetArchivingStatus.LOCKED)) - { - // Here we distinguish between data sets types of low and high priority - if (d.getDataSetType().getCode().equals(HIGH_PRIORITY_DATA_SET_TYPE)) { - toTransferDataSetsHighPriority.add(d); - } - else { - toTransferDataSets.add(d); - } - - } else - { - LogUtils.error("Data set " + d.getCode() + " eventually archived!"); - } - } - } - } - } - - LogUtils.info("TO_TRANSFER: Found " + toTransferDataSets.size() - + " data sets which are in the list of 'space-whitelist' and could be transferred to an extra folder"); - - if (commandLineMap.containsKey(TrackingClient.CL_PARAMETER_COPY_DATA_SETS)) - { - // Data Sets with higher priority get transferred first - // extraDataSetCopy(params, toTransferDataSetsHighPriority); - // extraDataSetCopy(params, toTransferDataSets); - ArrayList<AbstractExternalData> toTransferDataSetsAll = new ArrayList<>(toTransferDataSetsHighPriority.size() + toTransferDataSets.size()); - toTransferDataSetsAll.addAll(toTransferDataSetsHighPriority); - toTransferDataSetsAll.addAll(toTransferDataSets); - if (!toTransferDataSetsAll.isEmpty()) { - extraSCICOREDataSetListCopy(params, toTransferDataSetsAll); - } - } - - - LogUtils.info("Found " + filteredDataSets.size() + " data sets which are connected to samples in " + filterList.toString()); - setLaneProperties(changedTrackingMap, v3, v3SessionToken); - - return gatherTrackedEntities(trackingState, trackingServer, session, filteredDataSets, changedTrackingMap); - } - - - private static SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> searchForSamples(String permId, String v3sessionToken, IApplicationServerApi v3) - { - SampleSearchCriteria criterion = new SampleSearchCriteria(); - criterion.withPermId().thatEquals(permId); - - SampleFetchOptions fetchOptions = new SampleFetchOptions(); - fetchOptions.withProperties(); - - return v3.searchSamples(v3sessionToken, criterion, fetchOptions); - } - - - private static void setLaneProperties(HashMap<String, ArrayList<Long>> changedTrackingMap, IApplicationServerApi v3, String v3sessionToken) { - - for (String lanePermId : changedTrackingMap.keySet()) { - SearchResult<ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample> samples = searchForSamples(lanePermId, v3sessionToken, v3); - - for (ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample sample : samples.getObjects()) - { - SampleUpdate sampleToUpdate = new SampleUpdate(); - sampleToUpdate.setSampleId(sample.getPermId()); - sampleToUpdate.setProperty(PROPERTY_DATA_TRANSFERRED, getCurrentDateTime()); - - v3.updateSamples(v3sessionToken, Arrays.asList(sampleToUpdate)); - } - } - } - - - private static String getCurrentDateTime() { - - return new SimpleDateFormat(DATE_FORMAT_PATTERN).format(Calendar.getInstance().getTime()); - } - - private static final SimpleDateFormat LIST_TIMESTAMP_FORMAT = new SimpleDateFormat("yyyyMMddHHmmssSSSS"); - - private static void extraSCICOREDataSetListCopy(Parameters params, List<AbstractExternalData> dataSets) { - LogUtils.info("SCICORE dataset listing - Start"); - String datasetListFileBytes = ""; - for (AbstractExternalData dataSet:dataSets) { - datasetListFileBytes += dataSet.getPermId() + "\n"; - } - LogUtils.info("SCICORE dataset listing - Content : " + datasetListFileBytes); - - String timestamp = LIST_TIMESTAMP_FORMAT.format(new Date()); - String tempCanonicalPath = null; - try { - tempCanonicalPath = java.nio.file.Files.createTempDirectory(timestamp + "-tracking-temp-").toFile().getCanonicalPath(); - } catch (Exception e) { - throw new RuntimeException(e); - } - LogUtils.info("SCICORE dataset listing - temp : " + tempCanonicalPath); - - String datasetTypeCode = "FASTQ_GZ"; - String datasetName = timestamp + "_LIST"; - File datasetSource = new File(tempCanonicalPath + "/" + datasetName); - datasetSource.mkdirs(); - LogUtils.info("SCICORE dataset listing - datasetSource : " + datasetSource.getPath()); - - File datasetListFile = new File(tempCanonicalPath + "/" + datasetName + "/" + timestamp + ".tsv"); - try { - java.nio.file.Files.write(datasetListFile.toPath(), datasetListFileBytes.getBytes()); - } catch (IOException e) { - throw new RuntimeException(e); - } - - LogUtils.info("SCICORE dataset listing - writing to : " + datasetListFile.getPath()); - - File datasetDestination = new File(params.getDestinationFolderMap().get(datasetTypeCode), datasetName); - datasetDestination.mkdirs(); - - LogUtils.info("SCICORE dataset listing - datasetDestination : " + datasetDestination.getPath()); - - RsyncCopier copier = null; - File rsyncBinary = new File(params.getRsyncBinary()); - if (params.getRsyncFlags() != null) - { - LogUtils.info("SCICORE dataset listing - RSYNC WITH EXTRA PARAMETERS "); - List<String> cmdLineOptions = new ArrayList<String>(params.getRsyncFlags().length); - Collections.addAll(cmdLineOptions, params.getRsyncFlags()); - copier = new RsyncCopier(rsyncBinary, null, cmdLineOptions.toArray(new String[cmdLineOptions.size()])); - } else - { - LogUtils.info("SCICORE dataset listing - RSYNC NO EXTRA PARAMETERS "); - copier = new RsyncCopier(rsyncBinary, (File) null, ""); - } - - final long start = System.currentTimeMillis(); - LogUtils.info("SCICORE dataset listing - BEFORE RSYNC"); - Status status = copier.copyContent(datasetSource, datasetDestination, null, null); - final long end = System.currentTimeMillis(); - LogUtils.info("SCICORE dataset listing - AFTER RSYNC TIME: " + (end-start) + " millis."); - LogUtils.info("SCICORE dataset listing - AFTER RSYNC STATUS: " + status.toString()); - - if (status.isError()) - { - String exceptionMsg = - (status == null) ? "" : " Unexpected exception has occured: " - + status.toString(); - - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Data transfer failed for %s. %s", - datasetName, exceptionMsg); - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("GFB Tracker: Data transfer problem", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } -// MARKER FILE CREATION FAILED -// else { -// File datasetDestinationMarkerFile = new File(params.getDestinationFolderMap().get(datasetTypeCode), ".MARKER_is_finished_" + datasetName); -// try { -// datasetDestinationMarkerFile.createNewFile(); -// } catch (IOException e) { -// throw new RuntimeException(e); -// } -// } - } - - private static void extraDataSetCopy(Parameters params, List<AbstractExternalData> dataSets) - { - RsyncCopier copier = null; - File rsyncBinary = new File(params.getRsyncBinary()); - String base_path_string = params.getDssRoot(); - if (params.getRsyncFlags() != null) - { - List<String> cmdLineOptions = new ArrayList<String>(params.getRsyncFlags().length); - Collections.addAll(cmdLineOptions, params.getRsyncFlags()); - copier = new RsyncCopier(rsyncBinary, null, cmdLineOptions.toArray(new String[cmdLineOptions.size()])); - } else - { - LogUtils.info("No extra rsync parameters found."); - copier = new RsyncCopier(rsyncBinary, (File) null, ""); - } - - for (AbstractExternalData ds : dataSets) - { - File source = new File(base_path_string, ds.tryGetAsDataSet().getFullLocation() + ORIGINAL_PATH); - File targetName = new File(ds.tryGetAsDataSet().getFullLocation()); - - String datasetTypCode = ds.getDataSetType().getCode(); - - File omittedSource = new File(base_path_string, ds.tryGetAsDataSet().getFullLocation() + ORIGINAL_PATH + source.list()[0]); - - File destination = new File(params.getDestinationFolderMap().get(datasetTypCode), targetName.getName()); - - if (!destination.exists()) - { - destination.mkdirs(); - } - - final long start = System.currentTimeMillis(); - LogUtils.info("Start rsyncing " + ds.getCode() + " from " + omittedSource.getPath() + " to " + destination.getPath()); - - // this has always an --archive flag added - // Status status = copier.copyDirectoryImmutably(source, destination, targetName.getName(), CopyModeExisting.OVERWRITE); - - Status status = copier.copyContent(omittedSource, destination, null, null); - - if (status.isError()) - { - String exceptionMsg = - (status == null) ? "" : " Unexpected exception has occured: " - + status.toString(); - - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Data transfer failed for %s. %s", - ds.getCode(), exceptionMsg); - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("GFB Tracker: Data transfer problem", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } - - LogUtils.info(String.format("Got status: " + status + " for " + ds.getCode() + ", finished after %.2f s", - (System.currentTimeMillis() - start) / 1000.0)); - } - } - - private static long getMaxDataSetId(TrackingStateDTO trackingState) - { - long maxDataSetId = 0; - for (Long id : trackingState.getLastSeenDataSetIdMap().values()) - { - maxDataSetId = Math.max(maxDataSetId, id); - } - // return 0; - return maxDataSetId; - } - - /** - * Little helper function which reduces the number of data sets we are looking at. This can be configured by value 'old-data-set-backlog-number' - * in the service.properties. Without this value the calls get slower and slower with the growing data set amount. But we can assume that older - * data sets already got triggered earlier to send out an email. If not, the sample is so old that we do not want to send an email. - */ - private static long getUsableDataSetId(TrackingStateDTO trackingState, Parameters params) - { - long maxDataSetId = getMaxDataSetId(trackingState); - long oldDataSetBacklogNumber = params.getoldDataSetBacklogNumber(); - long usableDataSetId = Math.max(maxDataSetId - oldDataSetBacklogNumber, 0); - return usableDataSetId; - } - - private static long getMaxDataSetIdForSample(TrackingStateDTO trackingState, String lanePermId) - { - long maxDataSetId = 0; - Long maxDatasetIdForSample = trackingState.getLastSeenDataSetIdMap().get(lanePermId); - if (maxDatasetIdForSample != null) - { - return maxDatasetIdForSample; - } else - return maxDataSetId; - } - - private static TrackedEntities gatherTrackedEntities(TrackingStateDTO trackingState, - ITrackingServer trackingServer, SessionContextDTO session, - List<AbstractExternalData> dataSets, HashMap<String, ArrayList<Long>> changedTrackingMap) - { - List<Sample> sequencingSamplesToBeProcessed = - listSequencingSamples(PROCESSING_POSSIBLE_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsToBeProcessed(), trackingServer, session); - List<Sample> sequencingSamplesSuccessfullyProcessed = - listSequencingSamples(PROCESSING_SUCCESSFUL_PROPERTY_CODE, trackingState - .getAlreadyTrackedSampleIdsProcessed(), trackingServer, session); - return new TrackedEntities(sequencingSamplesToBeProcessed, sequencingSamplesSuccessfullyProcessed, dataSets, - changedTrackingMap); - } - - private static void addDataSetTo(HashMap<String, ArrayList<Long>> changedTrackingMap, AbstractExternalData dataSet) - { - Sample currentLane = dataSet.getSample(); - String lanePermId = currentLane.getPermId(); - - LogUtils.debug("Found lane " + currentLane.getCode() + " with permId: " + lanePermId + " with new DS techId " + dataSet.getId() - + " and DS permId " + dataSet.getPermId()); - ArrayList<Long> existingList = changedTrackingMap.get(lanePermId); - if (existingList == null) - { - existingList = new ArrayList<Long>(); - changedTrackingMap.put(lanePermId, existingList); - } - existingList.add(dataSet.getId()); - } - - private static List<Sample> listSequencingSamples(String propertyTypeCode, - Set<Long> alreadyTrackedSampleIds, ITrackingServer trackingServer, - SessionContextDTO session) - { - return listSamples(SEQUENCING_SAMPLE_TYPE, propertyTypeCode, TRUE, alreadyTrackedSampleIds, - trackingServer, session); - } - - private static List<Sample> listSamples(String sampleType, String propertyTypeCode, - String propertyValue, Set<Long> alreadyTrackedSampleIds, - ITrackingServer trackingServer, SessionContextDTO session) - { - TrackingSampleCriteria criteria = - new TrackingSampleCriteria(sampleType, propertyTypeCode, propertyValue, - alreadyTrackedSampleIds); - return trackingServer.listSamples(session.getSessionToken(), criteria); - } - - static class TrackingStateUpdateHelper - { - - static TrackingStateDTO calcNewTrackingState(TrackingStateDTO prevState, - TrackedEntities changedEntities) - { - TrackingStateDTO state = new TrackingStateDTO(); - Set<Long> sequencingSamplesToBeProcessed = - new TreeSet<Long>(prevState.getAlreadyTrackedSampleIdsToBeProcessed()); - addNewSampleIds(sequencingSamplesToBeProcessed, changedEntities - .getSequencingSamplesToBeProcessed()); - state.setAlreadyTrackedSampleIdsToBeProcessed(sequencingSamplesToBeProcessed); - - Set<Long> sequencingSamplesProcessed = - new TreeSet<Long>(prevState.getAlreadyTrackedSampleIdsProcessed()); - addNewSampleIds(sequencingSamplesProcessed, changedEntities - .getSequencingSamplesProcessed()); - state.setAlreadyTrackedSampleIdsProcessed(sequencingSamplesProcessed); - - TreeMap<String, Long> newTrackingState = new TreeMap<String, Long>(); - - HashMap<String, ArrayList<Long>> changedTrackingMap = changedEntities.getChangedTrackingMap(); - // System.out.println(changedTrackingMap.toString()); - - for (Map.Entry<String, ArrayList<Long>> entry : changedTrackingMap.entrySet()) - { - newTrackingState.put(entry.getKey(), Collections.max(entry.getValue())); - } - // System.out.println(newTrackingState.entrySet().toString()); - - for (Map.Entry<String, Long> entry : prevState.getLastSeenDataSetIdMap().entrySet()) - { - if (!newTrackingState.containsKey(entry.getKey())) - { - newTrackingState.put(entry.getKey(), entry.getValue()); - } - } - - state.setLastSeenDataSetIdMap(newTrackingState); - return state; - } - - static TrackingStateDTO calcNewTrackingStateDataSets(HashMap<String, ArrayList<Long>> changedTrackingMap, - TrackedEntities changedEntities) - { - TrackingStateDTO state = new TrackingStateDTO(); - - TreeMap<String, Long> newTrackingState = new TreeMap<String, Long>(); - for (Map.Entry<String, ArrayList<Long>> entry : changedTrackingMap.entrySet()) - { - newTrackingState.put(entry.getKey(), Collections.max(entry.getValue())); - } - LogUtils.info(newTrackingState.toString()); - - state.setLastSeenDataSetIdMap(newTrackingState); - return state; - } - - private static void addNewSampleIds(Set<Long> alreadyTrackedSampleIdsProcessed, - List<Sample> sequencingSamplesProcessed) - { - for (Sample sample : sequencingSamplesProcessed) - { - alreadyTrackedSampleIdsProcessed.add(sample.getId()); - } - } - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java deleted file mode 100644 index 4a7ce7658c4..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingClient.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.GnuParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionBuilder; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.ParseException; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang3.time.DateUtils; - -import ch.ethz.bsse.cisd.dsu.tracking.email.EntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.email.IEntityTrackingEmailGenerator; -import ch.ethz.bsse.cisd.dsu.tracking.utils.LogUtils; -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.io.PropertyIOUtils; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.shared.basic.string.StringUtils; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer; -import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO; - -// v3 -import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi; - -/** - * @author Tomasz Pylak - * @author Manuel Kohler - */ -public class TrackingClient -{ - private static final String SERVICE_PROPERTIES_FILE = "etc/service.properties"; - - private static final String LOCAL_SAMPLE_DB = "etc/tracking-local-database"; - - private static final String LOCAL_DATASET_DB = "etc/tracking-sample-database"; - - private static final String EMAIL_TEMPLATE_FILE = "etc/email-template.txt"; - - private static final String OPENBIS_RMI_TRACKING = "/rmi-tracking"; - - public static final String CL_PARAMETER_LANES = "lanes"; - - public static final String CL_PARAMETER_ALL = "all"; - - public static final String CL_PARAMETER_CHANGED_LANES = "changed_lanes"; - - public static final String CL_PARAMETER_COPY_DATA_SETS = "copy_data_sets"; - - public static final String CL_PARAMETER_REMOVE_LANES = "remove"; - - public static final String CL_PARAMETER_LIST_SPACES = "list_spaces"; - - private static IApplicationServerApi v3; - - private static String v3SessionToken; - - public static void main(String[] args) - { - try - { - HashMap<String, String[]> commandLineMap = parseCommandLine(args); - track(commandLineMap); - } catch (EnvironmentFailureException ex) - { - LogUtils.notify(ex); - } catch (Throwable ex) - { - LogUtils.notify(ex); - } - } - - private static HashMap<String, String[]> parseCommandLine(String[] args) - { - HashMap<String, String[]> commandLineMap = new HashMap<String, String[]>(); - CommandLineParser parser = new GnuParser(); - - Options options = new Options(); - Option lanes = OptionBuilder.withArgName(CL_PARAMETER_LANES) - .hasArg() - .withDescription("list of lanes to track") - .create(CL_PARAMETER_LANES); - lanes.setArgs(Option.UNLIMITED_VALUES); - // Option all = new Option(CL_PARAMETER_ALL, "track all lanes, only for testing, never use in production!"); - - Option new_lanes = new Option(CL_PARAMETER_CHANGED_LANES, "only list lanes which have new datasets"); - - Option copy_data_sets = new Option(CL_PARAMETER_COPY_DATA_SETS, "also copy the corresponding data sets to an extra" - + " folder. Sample must be part of the space which is set in the property 'space-whitelist'. " - + " Only in combination with parameter \"" + CL_PARAMETER_LANES + "\""); - - Option remove = OptionBuilder.withArgName(CL_PARAMETER_REMOVE_LANES) - .hasArg() - .withDescription("remove lanes from tracking list and do not send an email") - .create(CL_PARAMETER_REMOVE_LANES); - remove.setArgs(Option.UNLIMITED_VALUES); - - Option list_spaces = new Option(CL_PARAMETER_LIST_SPACES, "list spaces which are configured for an extra copy"); - - options.addOption(lanes); - // options.addOption(all); - options.addOption(new_lanes); - options.addOption(copy_data_sets); - options.addOption(remove); - options.addOption(list_spaces); - - // automatically generate the help statement - HelpFormatter formatter = new HelpFormatter(); - if (args.length < 1) - { - formatter.printHelp("help", options); - System.exit(0); - } - - try - { - CommandLine line = parser.parse(options, args); - if (line.hasOption(CL_PARAMETER_LANES)) - { - String[] laneArray = line.getOptionValues(CL_PARAMETER_LANES); - commandLineMap.put(CL_PARAMETER_LANES, laneArray); - } - if (line.hasOption(CL_PARAMETER_ALL)) - { - // commandLineMap.put(CL_PARAMETER_ALL, null); - System.out.println("This option is deactivated."); - - } - if (line.hasOption(CL_PARAMETER_CHANGED_LANES)) - { - commandLineMap.put(CL_PARAMETER_CHANGED_LANES, null); - } - if (line.hasOption(CL_PARAMETER_COPY_DATA_SETS)) - { - commandLineMap.put(CL_PARAMETER_COPY_DATA_SETS, null); - } - if (line.hasOption(CL_PARAMETER_LIST_SPACES)) - { - commandLineMap.put(CL_PARAMETER_LIST_SPACES, null); - } - if (line.hasOption(CL_PARAMETER_REMOVE_LANES)) - { - commandLineMap.put(CL_PARAMETER_REMOVE_LANES, line.getOptionValues(CL_PARAMETER_REMOVE_LANES)); - } - } catch (ParseException exp) - { - LogUtils.environmentError("Parsing of command line parameters failed.", exp.getMessage()); - System.out.println("Parsing of command line parameters failed. " + exp.getMessage()); - System.exit(1); - } - return commandLineMap; - } - - private static void track(HashMap<String, String[]> commandLineMap) - { - LogInitializer.init(); - Properties props = PropertyIOUtils.loadProperties(SERVICE_PROPERTIES_FILE); - Parameters params = new Parameters(props); - - ITrackingServer trackingServer = createOpenBISTrackingServer(params); - SessionContextDTO session = authentificateInOpenBIS(params, trackingServer); - // also login to the v3 API - IApplicationServerApi v3 = initV3(params); - v3SessionToken = v3.login(params.getOpenbisUser(), params.getOpenbisPassword()); - - - IEntityTrackingEmailGenerator emailGenerator = - new EntityTrackingEmailGenerator(props, retrieveEmailTemplate(), session); - IMailClient mailClient = params.getMailClient(); - TrackingBO trackingBO = new TrackingBO(trackingServer, emailGenerator, mailClient); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(LOCAL_SAMPLE_DB, LOCAL_DATASET_DB); - - trackingBO.trackAndNotify(trackingDAO, commandLineMap, params, session, v3, v3SessionToken); - } - - private static ITrackingServer createOpenBISTrackingServer(Parameters params) - { - String serviceURL = params.getOpenbisServerURL() + OPENBIS_RMI_TRACKING; - return HttpInvokerUtils.createServiceStub(ITrackingServer.class, serviceURL, - 5 * DateUtils.MILLIS_PER_MINUTE); - } - - private static SessionContextDTO authentificateInOpenBIS(Parameters params, - ITrackingServer trackingServer) - { - try - { - String openbisUser = params.getOpenbisUser(); - SessionContextDTO session = - trackingServer.tryAuthenticate(openbisUser, params.getOpenbisPassword()); - if (session == null) - { - throw createAuthentificationException(params, null); - } - trackingServer.setBaseIndexURL(session.getSessionToken(), params.getPermlinkURL()); - return session; - } catch (Exception ex) - { - throw createAuthentificationException(params, ex); - } - } - - private static String retrieveEmailTemplate() - { - try - { - return IOUtils.toString(new FileReader(new File(EMAIL_TEMPLATE_FILE))); - } catch (FileNotFoundException ex) - { - throw LogUtils.environmentError("Couldn't find email template file '%s'.", - EMAIL_TEMPLATE_FILE); - } catch (IOException ex) - { - throw LogUtils.environmentError( - "Exception has occured while trying to read template file '%s':%s", - EMAIL_TEMPLATE_FILE, ex.getMessage()); - } - } - - private static EnvironmentFailureException createAuthentificationException(Parameters params, - Exception exOrNull) - { - String exceptionMsg = - (exOrNull == null) ? "" : " Unexpected exception has occured: " - + exOrNull.getMessage(); - - EnvironmentFailureException ret = - LogUtils.environmentError( - "Cannot authentificate in openBIS as a user '%s'. Check that the password is correct and that openBIS service URL is correct.%s", - params.getOpenbisUser(), exceptionMsg); - - if (false == StringUtils.isBlank(params.getAdminEmail())) - { - List<EMailAddress> adminEmails = new ArrayList<EMailAddress>(); - for (String adminEmail : params.getAdminEmail().split(",")) - { - adminEmails.add(new EMailAddress(adminEmail.trim())); - } - - IMailClient emailClient = params.getMailClient(); - emailClient.sendEmailMessage("[DSU Tracker] DSU Tracking client NOT working", - ret.getLocalizedMessage(), null, - new EMailAddress(params.getNotificationEmail()), - adminEmails.toArray(new EMailAddress[0])); - } - return ret; - } - - private static IApplicationServerApi initV3(Parameters params) { - int TIMEOUT = 30000; - v3 = HttpInvokerUtils - .createServiceStub(IApplicationServerApi.class, params.getOpenbisServerURL() - + IApplicationServerApi.SERVICE_URL, TIMEOUT); - return v3; - } -} diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java deleted file mode 100644 index 1121a7d570c..00000000000 --- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/utils/LogUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.utils; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; - -/** - * @author Tomasz Pylak - */ -public class LogUtils -{ - private static final Logger notificationLog = LogFactory.getLogger(LogCategory.NOTIFY, - LogUtils.class); - - private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - LogUtils.class); - - public static void notify(EnvironmentFailureException ex) - { - String causeMsg = - (ex.getCause() == null) ? "" : "Error cause: " + ex.getCause().getMessage(); - String fullMsg = - "An environment exception occured while trying to send emails with changes.\n" - + "Check and correct the configuration.\n" + "Error details: " - + ex.getMessage() + "\n" + causeMsg; - notify(ex, fullMsg); - } - - public static void notify(Throwable ex) - { - String fullMsg = - "An unexpected exception occured while trying to send emails with changes.\n" - + "Error details: " + ex.getMessage(); - notify(ex, fullMsg); - } - - private static void notify(Throwable ex, String fullMsg) - { - ex.printStackTrace(); - notificationLog.error(fullMsg); - } - - public static EnvironmentFailureException environmentError(String message, Throwable exception) - { - String fullMsg = - message + " The following exception has been thrown: " + exception.getMessage(); - return new EnvironmentFailureException(fullMsg, exception); - } - - public static EnvironmentFailureException environmentError(String msgFormat, Object... params) - { - String fullMsg = String.format(msgFormat, params); - return new EnvironmentFailureException(fullMsg); - } - - public static void info(String msg) - { - operationLog.info(msg); - } - - public static void debug(String msg) - { - operationLog.debug(msg); - } - - public static void error(String msg) - { - operationLog.error(msg); - } -} diff --git a/deep_sequencing_unit/source/java/service.properties b/deep_sequencing_unit/source/java/service.properties deleted file mode 100644 index 8d8ac56ed08..00000000000 --- a/deep_sequencing_unit/source/java/service.properties +++ /dev/null @@ -1,141 +0,0 @@ -authentication-service = dummy-authentication-service - -# The time after which an inactive session is expired by the service (in minutes). -session-timeout = 720 - -# Authorization -# Supported: 'no-authorization' and 'active-authorization' -authorization-component-factory = active-authorization - -script-folder = ./source/ - -core-plugins-folder = source/core-plugins - -# Supported: currently only 'postgresql' is supported -database.engine = postgresql -database.create-from-scratch = false -# For debugging set this value to true. -database.script-single-step-mode = false -database.url-host-part = -# database.kind = new -# database.kind = basynthec -database.kind = dev -# database.kind = basysbio -# database.kind = system_test_strict -# database.kind = system_test_plates_on_demand -# database.kind = system_test_multi_groups -database.owner = -database.owner-password = -database.admin-user = -database.admin-password = -# Max time (in seconds) to wait for a connection to become available before throwing an exception. -# Default: 60s, set to -1 to wait indefinitely. -database.max-wait-for-connection = -# Max. number of active database connections. Default: 20. -database.max-active-connections = -# Max. number of idle database connections to keep open. Default: 20. -database.max-idle-connections = -# Log interval (in seconds) between two regular log entries of the number of active database -# connections. Default: 3600. -database.active-connections-log-interval = 30 - -# User id of the user used for anonymous login -# user-for-anonymous-login = <user id> - -crowd.service.host = crowd-bsse.ethz.ch -crowd.service.port = 8443 -crowd.application.name = lims -crowd.application.password = - -# The database instance local unique identifier. Used when the new database is created. -database-instance = CISD - -trusted-cross-origin-domains= * - -# Comma-separated list of host names and IP addresses of clients on which an INSTANCE_ADMIN -# user is allowed to change identity -accepted-remote-hosts-for-identity-change = localhost - - -# Online Help -# -# Online help is broken into two sections -- generic and specific. Generic help links back to -# the CISD. Specific help is provided by the host of the installation -# -# OpenBIS needs to know the root URL for the online help and a template for the individual pages. -# The template should have on parameter, called title, and should be constructed to automatically -# create the page if it does not already exist. -# The template can be created by going to the root page, adding a new link to the page, and -# replacing the title of the new page with the ${title} -onlinehelp.generic.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp -onlinehelp.generic.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829 -#onlinehelp.specific.root-url = https://wiki-bsse.ethz.ch/display/CISDDoc/OnlineHelp -#onlinehelp.specific.page-template = https://wiki-bsse.ethz.ch/pages/createpage.action?spaceKey=CISDDoc&title=${title}&linkCreation=true&fromPageId=40633829 -# --------------------------------------------------------------------------- -# (optional) Database Configurations for Query module -# --------------------------------------------------------------------------- - -# Comma separated keys of databases configured for Query module. -# Each database should have configuration properties prefixed with its key. -# Mandatory properties for each <database> include: -# <database>.label - name shown to the openBIS user when adding or editing a customized query -# <database>.database-driver - JDBC Driver of the database (e.g. org.postgresql.Driver) -# <database>.database-url - JDBC URL to the database (e.g. jdbc:postgresql://localhost/openbis) -# Optional properties for each <database> include: -# <database>.database-user - name of the database user (default: user.name from system properties) -# <database>.database-password - password of the database user -# <database>.creator-minimal-role - minimal role required to create/edit queries on this database (default: POWER_USER) -# <database>.data-space - If NOT specified OBSERVER of any space will be allowed to perform -# queries and <creator-minimal-role> of any space will allowed -# to create/edit queries on this DB. -# - If specified only OBSERVER of the space will be allowed to perform -# queries and <creator-minimal-role> of the space will allowed -# to create/edit queries on this DB. -query-databases = 1 - -1.label = openBIS meta data -#1.data-space = CISD -#1.creator-minimal-role = SPACE_ADMIN -1.database-driver = org.postgresql.Driver -1.database-url = jdbc:postgresql://localhost/openbis_${database.kind} -#1.database-username = -#1.database-password = - -# --------------------------------------------------------------------------- -# maintenance plugins configuration -# --------------------------------------------------------------------------- - -# Comma separated names of maintenance plugins. -# Each plugin should have configuration properties prefixed with its name. -# Mandatory properties for each <plugin> include: -# <plugin>.class - Fully qualified plugin class name -# <plugin>.interval - The time between plugin executions (in seconds) -# Optional properties for each <plugin> include: -# <plugin>.start - Time of the first execution (HH:mm) -# <plugin>.execute-only-once - If true the task will be executed exactly once, -# interval will be ignored. By default set to false. -#maintenance-plugins = demo, dynamic-property-evaluator, remove-unused-ad-hoc-vocabulary-terms - -demo.class = ch.systemsx.cisd.openbis.generic.server.task.DemoMaintenanceTask -demo.interval = 60 -#demo.execute-only-once = true -demo.property_1 = some value -demo.property_2 = some value 2 - -#dynamic-property-evaluator.class = ch.systemsx.cisd.openbis.generic.server.task.DynamicPropertyEvaluationMaintenanceTask -# run daily at midnight -#dynamic-property-evaluator.interval = 86400 -#dynamic-property-evaluator.start = 00:00 -# run every 10min -#dynamic-property-evaluator.interval = 6000 - -#remove-unused-ad-hoc-vocabulary-terms.class = ch.systemsx.cisd.openbis.generic.server.task.RemoveUnusedUnofficialTermsMaintenanceTask -## run once every 12 hours -#remove-unused-ad-hoc-vocabulary-terms.interval = 43200 -## delete unused ad hoc terms older than 7 days -#remove-unused-ad-hoc-vocabulary-terms.older-than-days = 7 - -# Name of the file that stores Web Client configuration -web-client-configuration-file = etc/web-client.properties - -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties b/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties deleted file mode 100644 index 3067caffb05..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/core-plugins.properties +++ /dev/null @@ -1 +0,0 @@ -enabled-modules = dropbox-test, illumina-qgf \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py b/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py deleted file mode 100644 index 9862bad460e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/demo-dropbox.py +++ /dev/null @@ -1,14 +0,0 @@ -#! /usr/bin/env python - -def process(tr): - for file in tr.getIncoming().listFiles(): - openFile = None - - try: - openFile = open(file.getAbsolutePath()) - content = openFile.read().strip() - - experiment = tr.createNewExperiment("/BSSE_FLOWCELLS/FLOWCELLS/" + content, "HT_SEQUENCING") - finally: - if openFile: - openFile.close() diff --git a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties deleted file mode 100644 index 563f2302935..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/demo/1/dss/drop-boxes/demo-dropbox/plugin.properties +++ /dev/null @@ -1,5 +0,0 @@ -incoming-dir = ${root-dir}/incoming-demo-dropbox -incoming-data-completeness-condition = auto-detection -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = demo-dropbox.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css deleted file mode 100644 index 629f097de8b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/body-style.css +++ /dev/null @@ -1,4 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css deleted file mode 100644 index ad117356937..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.css +++ /dev/null @@ -1,384 +0,0 @@ -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn:active, -.btn.active { - background-image: none; -} - -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #e6e6e6, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #e6e6e6 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #e6e6e6 100%); - background-repeat: repeat-x; - border-color: #e0e0e0; - border-color: #ccc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); -} - -.btn-default:active, -.btn-default.active { - background-color: #e6e6e6; - border-color: #e0e0e0; -} - -.btn-primary { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - border-color: #2d6ca2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.btn-primary:active, -.btn-primary.active { - background-color: #3071a9; - border-color: #2d6ca2; -} - -.btn-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - border-color: #419641; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.btn-success:active, -.btn-success.active { - background-color: #449d44; - border-color: #419641; -} - -.btn-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - border-color: #eb9316; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.btn-warning:active, -.btn-warning.active { - background-color: #ec971f; - border-color: #eb9316; -} - -.btn-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - border-color: #c12e2a; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.btn-danger:active, -.btn-danger.active { - background-color: #c9302c; - border-color: #c12e2a; -} - -.btn-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - border-color: #2aabd2; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.btn-info:active, -.btn-info.active { - background-color: #31b0d5; - border-color: #2aabd2; -} - -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus, -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.navbar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); - background-image: -webkit-linear-gradient(top, #ffffff, 0%, #f8f8f8, 100%); - background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); - background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); - background-repeat: repeat-x; - border-radius: 4px; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); -} - -.navbar .navbar-nav > .active > a { - background-color: #f8f8f8; -} - -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); -} - -.navbar-inverse { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); - background-image: -webkit-linear-gradient(top, #3c3c3c, 0%, #222222, 100%); - background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); -} - -.navbar-inverse .navbar-nav > .active > a { - background-color: #222222; -} - -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} - -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} - -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.alert-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #c8e5bc, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - background-repeat: repeat-x; - border-color: #b2dba1; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); -} - -.alert-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #b9def0, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - background-repeat: repeat-x; - border-color: #9acfea; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); -} - -.alert-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #f8efc0, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - background-repeat: repeat-x; - border-color: #f5e79e; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); -} - -.alert-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #e7c3c3, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - background-repeat: repeat-x; - border-color: #dca7a7; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); -} - -.progress { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ebebeb, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); -} - -.progress-bar { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3071a9, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); -} - -.progress-bar-success { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); - background-image: -webkit-linear-gradient(top, #5cb85c, 0%, #449d44, 100%); - background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); -} - -.progress-bar-info { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); - background-image: -webkit-linear-gradient(top, #5bc0de, 0%, #31b0d5, 100%); - background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); -} - -.progress-bar-warning { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); - background-image: -webkit-linear-gradient(top, #f0ad4e, 0%, #ec971f, 100%); - background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); -} - -.progress-bar-danger { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); - background-image: -webkit-linear-gradient(top, #d9534f, 0%, #c9302c, 100%); - background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); -} - -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #3278b3, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - background-repeat: repeat-x; - border-color: #3278b3; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); -} - -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} - -.panel-default > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); - background-image: -webkit-linear-gradient(top, #f5f5f5, 0%, #e8e8e8, 100%); - background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); -} - -.panel-primary > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); - background-image: -webkit-linear-gradient(top, #428bca, 0%, #357ebd, 100%); - background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); -} - -.panel-success > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); - background-image: -webkit-linear-gradient(top, #dff0d8, 0%, #d0e9c6, 100%); - background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); -} - -.panel-info > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); - background-image: -webkit-linear-gradient(top, #d9edf7, 0%, #c4e3f3, 100%); - background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); -} - -.panel-warning > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); - background-image: -webkit-linear-gradient(top, #fcf8e3, 0%, #faf2cc, 100%); - background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); -} - -.panel-danger > .panel-heading { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); - background-image: -webkit-linear-gradient(top, #f2dede, 0%, #ebcccc, 100%); - background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); -} - -.well { - background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #e8e8e8, 0%, #f5f5f5, 100%); - background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - background-repeat: repeat-x; - border-color: #dcdcdc; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css deleted file mode 100644 index cad36b4e600..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap-theme.min.css +++ /dev/null @@ -1 +0,0 @@ -.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 1px rgba(0,0,0,0.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(top,#fff,0%,#e6e6e6,100%);background-image:-moz-linear-gradient(top,#fff 0,#e6e6e6 100%);background-image:linear-gradient(to bottom,#fff 0,#e6e6e6 100%);background-repeat:repeat-x;border-color:#e0e0e0;border-color:#ccc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#ffe6e6e6',GradientType=0)}.btn-default:active,.btn-default.active{background-color:#e6e6e6;border-color:#e0e0e0}.btn-primary{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;border-color:#2d6ca2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.btn-primary:active,.btn-primary.active{background-color:#3071a9;border-color:#2d6ca2}.btn-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;border-color:#419641;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.btn-success:active,.btn-success.active{background-color:#449d44;border-color:#419641}.btn-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;border-color:#eb9316;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.btn-warning:active,.btn-warning.active{background-color:#ec971f;border-color:#eb9316}.btn-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;border-color:#c12e2a;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.btn-danger:active,.btn-danger.active{background-color:#c9302c;border-color:#c12e2a}.btn-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;border-color:#2aabd2;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.btn-info:active,.btn-info.active{background-color:#31b0d5;border-color:#2aabd2}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.navbar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fff),to(#f8f8f8));background-image:-webkit-linear-gradient(top,#fff,0%,#f8f8f8,100%);background-image:-moz-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;border-radius:4px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff',endColorstr='#fff8f8f8',GradientType=0);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075);box-shadow:inset 0 1px 0 rgba(255,255,255,0.15),0 1px 5px rgba(0,0,0,0.075)}.navbar .navbar-nav>.active>a{background-color:#f8f8f8}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,0.25)}.navbar-inverse{background-image:-webkit-gradient(linear,left 0,left 100%,from(#3c3c3c),to(#222));background-image:-webkit-linear-gradient(top,#3c3c3c,0%,#222,100%);background-image:-moz-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c',endColorstr='#ff222222',GradientType=0)}.navbar-inverse .navbar-nav>.active>a{background-color:#222}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,0.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05);box-shadow:inset 0 1px 0 rgba(255,255,255,0.25),0 1px 2px rgba(0,0,0,0.05)}.alert-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#c8e5bc));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#c8e5bc,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;border-color:#b2dba1;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffc8e5bc',GradientType=0)}.alert-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#b9def0));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#b9def0,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;border-color:#9acfea;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffb9def0',GradientType=0)}.alert-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#f8efc0));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#f8efc0,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;border-color:#f5e79e;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fff8efc0',GradientType=0)}.alert-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#e7c3c3));background-image:-webkit-linear-gradient(top,#f2dede,0%,#e7c3c3,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;border-color:#dca7a7;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffe7c3c3',GradientType=0)}.progress{background-image:-webkit-gradient(linear,left 0,left 100%,from(#ebebeb),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#ebebeb,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb',endColorstr='#fff5f5f5',GradientType=0)}.progress-bar{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3071a9));background-image:-webkit-linear-gradient(top,#428bca,0%,#3071a9,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3071a9',GradientType=0)}.progress-bar-success{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5cb85c),to(#449d44));background-image:-webkit-linear-gradient(top,#5cb85c,0%,#449d44,100%);background-image:-moz-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c',endColorstr='#ff449d44',GradientType=0)}.progress-bar-info{background-image:-webkit-gradient(linear,left 0,left 100%,from(#5bc0de),to(#31b0d5));background-image:-webkit-linear-gradient(top,#5bc0de,0%,#31b0d5,100%);background-image:-moz-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de',endColorstr='#ff31b0d5',GradientType=0)}.progress-bar-warning{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f0ad4e),to(#ec971f));background-image:-webkit-linear-gradient(top,#f0ad4e,0%,#ec971f,100%);background-image:-moz-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e',endColorstr='#ffec971f',GradientType=0)}.progress-bar-danger{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9534f),to(#c9302c));background-image:-webkit-linear-gradient(top,#d9534f,0%,#c9302c,100%);background-image:-moz-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f',endColorstr='#ffc9302c',GradientType=0)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.075);box-shadow:0 1px 2px rgba(0,0,0,0.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#3278b3));background-image:-webkit-linear-gradient(top,#428bca,0%,#3278b3,100%);background-image:-moz-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;border-color:#3278b3;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff3278b3',GradientType=0)}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.05);box-shadow:0 1px 2px rgba(0,0,0,0.05)}.panel-default>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f5f5f5),to(#e8e8e8));background-image:-webkit-linear-gradient(top,#f5f5f5,0%,#e8e8e8,100%);background-image:-moz-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5',endColorstr='#ffe8e8e8',GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#428bca),to(#357ebd));background-image:-webkit-linear-gradient(top,#428bca,0%,#357ebd,100%);background-image:-moz-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca',endColorstr='#ff357ebd',GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#dff0d8),to(#d0e9c6));background-image:-webkit-linear-gradient(top,#dff0d8,0%,#d0e9c6,100%);background-image:-moz-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8',endColorstr='#ffd0e9c6',GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#d9edf7),to(#c4e3f3));background-image:-webkit-linear-gradient(top,#d9edf7,0%,#c4e3f3,100%);background-image:-moz-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7',endColorstr='#ffc4e3f3',GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#fcf8e3),to(#faf2cc));background-image:-webkit-linear-gradient(top,#fcf8e3,0%,#faf2cc,100%);background-image:-moz-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3',endColorstr='#fffaf2cc',GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-gradient(linear,left 0,left 100%,from(#f2dede),to(#ebcccc));background-image:-webkit-linear-gradient(top,#f2dede,0%,#ebcccc,100%);background-image:-moz-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede',endColorstr='#ffebcccc',GradientType=0)}.well{background-image:-webkit-gradient(linear,left 0,left 100%,from(#e8e8e8),to(#f5f5f5));background-image:-webkit-linear-gradient(top,#e8e8e8,0%,#f5f5f5,100%);background-image:-moz-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;border-color:#dcdcdc;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8',endColorstr='#fff5f5f5',GradientType=0);-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 3px rgba(0,0,0,0.05),0 1px 0 rgba(255,255,255,0.1)} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css deleted file mode 100644 index bbda4eed4af..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.css +++ /dev/null @@ -1,6805 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */ - -/*! normalize.css v2.1.0 | MIT License | git.io/normalize */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -audio, -canvas, -video { - display: inline-block; -} - -audio:not([controls]) { - display: none; - height: 0; -} - -[hidden] { - display: none; -} - -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -a:focus { - outline: thin dotted; -} - -a:active, -a:hover { - outline: 0; -} - -h1 { - margin: 0.67em 0; - font-size: 2em; -} - -abbr[title] { - border-bottom: 1px dotted; -} - -b, -strong { - font-weight: bold; -} - -dfn { - font-style: italic; -} - -hr { - height: 0; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -mark { - color: #000; - background: #ff0; -} - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - font-size: 1em; -} - -pre { - white-space: pre-wrap; -} - -q { - quotes: "\201C" "\201D" "\2018" "\2019"; -} - -small { - font-size: 80%; -} - -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -img { - border: 0; -} - -svg:not(:root) { - overflow: hidden; -} - -figure { - margin: 0; -} - -fieldset { - padding: 0.35em 0.625em 0.75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} - -legend { - padding: 0; - border: 0; -} - -button, -input, -select, -textarea { - margin: 0; - font-family: inherit; - font-size: 100%; -} - -button, -input { - line-height: normal; -} - -button, -select { - text-transform: none; -} - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} - -button[disabled], -html input[disabled] { - cursor: default; -} - -input[type="checkbox"], -input[type="radio"] { - padding: 0; - box-sizing: border-box; -} - -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} - -textarea { - overflow: auto; - vertical-align: top; -} - -table { - border-collapse: collapse; - border-spacing: 0; -} - -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - .ir a:after, - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - @page { - margin: 2cm .5cm; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} - -*, -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -html { - font-size: 62.5%; - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} - -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.428571429; - color: #333333; - background-color: #ffffff; -} - -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} - -button, -input, -select[multiple], -textarea { - background-image: none; -} - -a { - color: #428bca; - text-decoration: none; -} - -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} - -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -img { - vertical-align: middle; -} - -.img-responsive { - display: block; - height: auto; - max-width: 100%; -} - -.img-rounded { - border-radius: 6px; -} - -.img-thumbnail { - display: inline-block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.img-circle { - border-radius: 50%; -} - -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eeeeee; -} - -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0 0 0 0); - border: 0; -} - -p { - margin: 0 0 10px; -} - -.lead { - margin-bottom: 20px; - font-size: 16.099999999999998px; - font-weight: 200; - line-height: 1.4; -} - -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} - -small { - font-size: 85%; -} - -cite { - font-style: normal; -} - -.text-muted { - color: #999999; -} - -.text-primary { - color: #428bca; -} - -.text-warning { - color: #c09853; -} - -.text-danger { - color: #b94a48; -} - -.text-success { - color: #468847; -} - -.text-info { - color: #3a87ad; -} - -.text-left { - text-align: left; -} - -.text-right { - text-align: right; -} - -.text-center { - text-align: center; -} - -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-weight: 500; - line-height: 1.1; -} - -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small { - font-weight: normal; - line-height: 1; - color: #999999; -} - -h1, -h2, -h3 { - margin-top: 20px; - margin-bottom: 10px; -} - -h4, -h5, -h6 { - margin-top: 10px; - margin-bottom: 10px; -} - -h1, -.h1 { - font-size: 36px; -} - -h2, -.h2 { - font-size: 30px; -} - -h3, -.h3 { - font-size: 24px; -} - -h4, -.h4 { - font-size: 18px; -} - -h5, -.h5 { - font-size: 14px; -} - -h6, -.h6 { - font-size: 12px; -} - -h1 small, -.h1 small { - font-size: 24px; -} - -h2 small, -.h2 small { - font-size: 18px; -} - -h3 small, -.h3 small, -h4 small, -.h4 small { - font-size: 14px; -} - -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eeeeee; -} - -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} - -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} - -.list-unstyled { - padding-left: 0; - list-style: none; -} - -.list-inline { - padding-left: 0; - list-style: none; -} - -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} - -dl { - margin-bottom: 20px; -} - -dt, -dd { - line-height: 1.428571429; -} - -dt { - font-weight: bold; -} - -dd { - margin-left: 0; -} - -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } - .dl-horizontal dd:before, - .dl-horizontal dd:after { - display: table; - content: " "; - } - .dl-horizontal dd:after { - clear: both; - } -} - -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #999999; -} - -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} - -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - border-left: 5px solid #eeeeee; -} - -blockquote p { - font-size: 17.5px; - font-weight: 300; - line-height: 1.25; -} - -blockquote p:last-child { - margin-bottom: 0; -} - -blockquote small { - display: block; - line-height: 1.428571429; - color: #999999; -} - -blockquote small:before { - content: '\2014 \00A0'; -} - -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - border-right: 5px solid #eeeeee; - border-left: 0; -} - -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} - -blockquote.pull-right small:before { - content: ''; -} - -blockquote.pull-right small:after { - content: '\00A0 \2014'; -} - -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} - -address { - display: block; - margin-bottom: 20px; - font-style: normal; - line-height: 1.428571429; -} - -code, -pre { - font-family: Monaco, Menlo, Consolas, "Courier New", monospace; -} - -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - white-space: nowrap; - background-color: #f9f2f4; - border-radius: 4px; -} - -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.428571429; - color: #333333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #cccccc; - border-radius: 4px; -} - -pre.prettyprint { - margin-bottom: 20px; -} - -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border: 0; -} - -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} - -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.container:before, -.container:after { - display: table; - content: " "; -} - -.container:after { - clear: both; -} - -.row { - margin-right: -15px; - margin-left: -15px; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.row:before, -.row:after { - display: table; - content: " "; -} - -.row:after { - clear: both; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11, -.col-xs-12, -.col-sm-1, -.col-sm-2, -.col-sm-3, -.col-sm-4, -.col-sm-5, -.col-sm-6, -.col-sm-7, -.col-sm-8, -.col-sm-9, -.col-sm-10, -.col-sm-11, -.col-sm-12, -.col-md-1, -.col-md-2, -.col-md-3, -.col-md-4, -.col-md-5, -.col-md-6, -.col-md-7, -.col-md-8, -.col-md-9, -.col-md-10, -.col-md-11, -.col-md-12, -.col-lg-1, -.col-lg-2, -.col-lg-3, -.col-lg-4, -.col-lg-5, -.col-lg-6, -.col-lg-7, -.col-lg-8, -.col-lg-9, -.col-lg-10, -.col-lg-11, -.col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} - -.col-xs-1, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-10, -.col-xs-11 { - float: left; -} - -.col-xs-1 { - width: 8.333333333333332%; -} - -.col-xs-2 { - width: 16.666666666666664%; -} - -.col-xs-3 { - width: 25%; -} - -.col-xs-4 { - width: 33.33333333333333%; -} - -.col-xs-5 { - width: 41.66666666666667%; -} - -.col-xs-6 { - width: 50%; -} - -.col-xs-7 { - width: 58.333333333333336%; -} - -.col-xs-8 { - width: 66.66666666666666%; -} - -.col-xs-9 { - width: 75%; -} - -.col-xs-10 { - width: 83.33333333333334%; -} - -.col-xs-11 { - width: 91.66666666666666%; -} - -.col-xs-12 { - width: 100%; -} - -@media (min-width: 768px) { - .container { - max-width: 750px; - } - .col-sm-1, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-10, - .col-sm-11 { - float: left; - } - .col-sm-1 { - width: 8.333333333333332%; - } - .col-sm-2 { - width: 16.666666666666664%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-4 { - width: 33.33333333333333%; - } - .col-sm-5 { - width: 41.66666666666667%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-7 { - width: 58.333333333333336%; - } - .col-sm-8 { - width: 66.66666666666666%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-10 { - width: 83.33333333333334%; - } - .col-sm-11 { - width: 91.66666666666666%; - } - .col-sm-12 { - width: 100%; - } - .col-sm-push-1 { - left: 8.333333333333332%; - } - .col-sm-push-2 { - left: 16.666666666666664%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-4 { - left: 33.33333333333333%; - } - .col-sm-push-5 { - left: 41.66666666666667%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-7 { - left: 58.333333333333336%; - } - .col-sm-push-8 { - left: 66.66666666666666%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-10 { - left: 83.33333333333334%; - } - .col-sm-push-11 { - left: 91.66666666666666%; - } - .col-sm-pull-1 { - right: 8.333333333333332%; - } - .col-sm-pull-2 { - right: 16.666666666666664%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-4 { - right: 33.33333333333333%; - } - .col-sm-pull-5 { - right: 41.66666666666667%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-7 { - right: 58.333333333333336%; - } - .col-sm-pull-8 { - right: 66.66666666666666%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-10 { - right: 83.33333333333334%; - } - .col-sm-pull-11 { - right: 91.66666666666666%; - } - .col-sm-offset-1 { - margin-left: 8.333333333333332%; - } - .col-sm-offset-2 { - margin-left: 16.666666666666664%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-4 { - margin-left: 33.33333333333333%; - } - .col-sm-offset-5 { - margin-left: 41.66666666666667%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-7 { - margin-left: 58.333333333333336%; - } - .col-sm-offset-8 { - margin-left: 66.66666666666666%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-10 { - margin-left: 83.33333333333334%; - } - .col-sm-offset-11 { - margin-left: 91.66666666666666%; - } -} - -@media (min-width: 992px) { - .container { - max-width: 970px; - } - .col-md-1, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-10, - .col-md-11 { - float: left; - } - .col-md-1 { - width: 8.333333333333332%; - } - .col-md-2 { - width: 16.666666666666664%; - } - .col-md-3 { - width: 25%; - } - .col-md-4 { - width: 33.33333333333333%; - } - .col-md-5 { - width: 41.66666666666667%; - } - .col-md-6 { - width: 50%; - } - .col-md-7 { - width: 58.333333333333336%; - } - .col-md-8 { - width: 66.66666666666666%; - } - .col-md-9 { - width: 75%; - } - .col-md-10 { - width: 83.33333333333334%; - } - .col-md-11 { - width: 91.66666666666666%; - } - .col-md-12 { - width: 100%; - } - .col-md-push-0 { - left: auto; - } - .col-md-push-1 { - left: 8.333333333333332%; - } - .col-md-push-2 { - left: 16.666666666666664%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-4 { - left: 33.33333333333333%; - } - .col-md-push-5 { - left: 41.66666666666667%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-7 { - left: 58.333333333333336%; - } - .col-md-push-8 { - left: 66.66666666666666%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-10 { - left: 83.33333333333334%; - } - .col-md-push-11 { - left: 91.66666666666666%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-pull-1 { - right: 8.333333333333332%; - } - .col-md-pull-2 { - right: 16.666666666666664%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-4 { - right: 33.33333333333333%; - } - .col-md-pull-5 { - right: 41.66666666666667%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-7 { - right: 58.333333333333336%; - } - .col-md-pull-8 { - right: 66.66666666666666%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-10 { - right: 83.33333333333334%; - } - .col-md-pull-11 { - right: 91.66666666666666%; - } - .col-md-offset-0 { - margin-left: 0; - } - .col-md-offset-1 { - margin-left: 8.333333333333332%; - } - .col-md-offset-2 { - margin-left: 16.666666666666664%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-4 { - margin-left: 33.33333333333333%; - } - .col-md-offset-5 { - margin-left: 41.66666666666667%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-7 { - margin-left: 58.333333333333336%; - } - .col-md-offset-8 { - margin-left: 66.66666666666666%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-10 { - margin-left: 83.33333333333334%; - } - .col-md-offset-11 { - margin-left: 91.66666666666666%; - } -} - -@media (min-width: 1200px) { - .container { - max-width: 1170px; - } - .col-lg-1, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-10, - .col-lg-11 { - float: left; - } - .col-lg-1 { - width: 8.333333333333332%; - } - .col-lg-2 { - width: 16.666666666666664%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-4 { - width: 33.33333333333333%; - } - .col-lg-5 { - width: 41.66666666666667%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-7 { - width: 58.333333333333336%; - } - .col-lg-8 { - width: 66.66666666666666%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-10 { - width: 83.33333333333334%; - } - .col-lg-11 { - width: 91.66666666666666%; - } - .col-lg-12 { - width: 100%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-push-1 { - left: 8.333333333333332%; - } - .col-lg-push-2 { - left: 16.666666666666664%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-4 { - left: 33.33333333333333%; - } - .col-lg-push-5 { - left: 41.66666666666667%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-7 { - left: 58.333333333333336%; - } - .col-lg-push-8 { - left: 66.66666666666666%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-10 { - left: 83.33333333333334%; - } - .col-lg-push-11 { - left: 91.66666666666666%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-pull-1 { - right: 8.333333333333332%; - } - .col-lg-pull-2 { - right: 16.666666666666664%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-4 { - right: 33.33333333333333%; - } - .col-lg-pull-5 { - right: 41.66666666666667%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-7 { - right: 58.333333333333336%; - } - .col-lg-pull-8 { - right: 66.66666666666666%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-10 { - right: 83.33333333333334%; - } - .col-lg-pull-11 { - right: 91.66666666666666%; - } - .col-lg-offset-0 { - margin-left: 0; - } - .col-lg-offset-1 { - margin-left: 8.333333333333332%; - } - .col-lg-offset-2 { - margin-left: 16.666666666666664%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-4 { - margin-left: 33.33333333333333%; - } - .col-lg-offset-5 { - margin-left: 41.66666666666667%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-7 { - margin-left: 58.333333333333336%; - } - .col-lg-offset-8 { - margin-left: 66.66666666666666%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-10 { - margin-left: 83.33333333333334%; - } - .col-lg-offset-11 { - margin-left: 91.66666666666666%; - } -} - -table { - max-width: 100%; - background-color: transparent; -} - -th { - text-align: left; -} - -.table { - width: 100%; - margin-bottom: 20px; -} - -.table thead > tr > th, -.table tbody > tr > th, -.table tfoot > tr > th, -.table thead > tr > td, -.table tbody > tr > td, -.table tfoot > tr > td { - padding: 8px; - line-height: 1.428571429; - vertical-align: top; - border-top: 1px solid #dddddd; -} - -.table thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #dddddd; -} - -.table caption + thead tr:first-child th, -.table colgroup + thead tr:first-child th, -.table thead:first-child tr:first-child th, -.table caption + thead tr:first-child td, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child td { - border-top: 0; -} - -.table tbody + tbody { - border-top: 2px solid #dddddd; -} - -.table .table { - background-color: #ffffff; -} - -.table-condensed thead > tr > th, -.table-condensed tbody > tr > th, -.table-condensed tfoot > tr > th, -.table-condensed thead > tr > td, -.table-condensed tbody > tr > td, -.table-condensed tfoot > tr > td { - padding: 5px; -} - -.table-bordered { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #dddddd; -} - -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} - -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} - -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} - -table col[class*="col-"] { - display: table-column; - float: none; -} - -table td[class*="col-"], -table th[class*="col-"] { - display: table-cell; - float: none; -} - -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} - -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td { - background-color: #d0e9c6; - border-color: #c9e2b3; -} - -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; - border-color: #eed3d7; -} - -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td { - background-color: #ebcccc; - border-color: #e6c1c7; -} - -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td { - background-color: #faf2cc; - border-color: #f8e5be; -} - -@media (max-width: 768px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: scroll; - overflow-y: hidden; - border: 1px solid #dddddd; - } - .table-responsive > .table { - margin-bottom: 0; - background-color: #fff; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > thead > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > thead > tr:last-child > td, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} - -fieldset { - padding: 0; - margin: 0; - border: 0; -} - -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} - -label { - display: inline-block; - margin-bottom: 5px; - font-weight: bold; -} - -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - /* IE8-9 */ - - line-height: normal; -} - -input[type="file"] { - display: block; -} - -select[multiple], -select[size] { - height: auto; -} - -select optgroup { - font-family: inherit; - font-size: inherit; - font-style: inherit; -} - -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -input[type="number"]::-webkit-outer-spin-button, -input[type="number"]::-webkit-inner-spin-button { - height: auto; -} - -.form-control:-moz-placeholder { - color: #999999; -} - -.form-control::-moz-placeholder { - color: #999999; -} - -.form-control:-ms-input-placeholder { - color: #999999; -} - -.form-control::-webkit-input-placeholder { - color: #999999; -} - -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.428571429; - color: #555555; - vertical-align: middle; - background-color: #ffffff; - border: 1px solid #cccccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; - transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -} - -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); -} - -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eeeeee; -} - -textarea.form-control { - height: auto; -} - -.form-group { - margin-bottom: 15px; -} - -.radio, -.checkbox { - display: block; - min-height: 20px; - padding-left: 20px; - margin-top: 10px; - margin-bottom: 10px; - vertical-align: middle; -} - -.radio label, -.checkbox label { - display: inline; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} - -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - float: left; - margin-left: -20px; -} - -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} - -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} - -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} - -input[type="radio"][disabled], -input[type="checkbox"][disabled], -.radio[disabled], -.radio-inline[disabled], -.checkbox[disabled], -.checkbox-inline[disabled], -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"], -fieldset[disabled] .radio, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} - -.input-sm { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-sm { - height: 30px; - line-height: 30px; -} - -textarea.input-sm { - height: auto; -} - -.input-lg { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-lg { - height: 45px; - line-height: 45px; -} - -textarea.input-lg { - height: auto; -} - -.has-warning .help-block, -.has-warning .control-label { - color: #c09853; -} - -.has-warning .form-control { - border-color: #c09853; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-warning .form-control:focus { - border-color: #a47e3c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -} - -.has-warning .input-group-addon { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} - -.has-error .help-block, -.has-error .control-label { - color: #b94a48; -} - -.has-error .form-control { - border-color: #b94a48; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-error .form-control:focus { - border-color: #953b39; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -} - -.has-error .input-group-addon { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} - -.has-success .help-block, -.has-success .control-label { - color: #468847; -} - -.has-success .form-control { - border-color: #468847; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -} - -.has-success .form-control:focus { - border-color: #356635; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -} - -.has-success .input-group-addon { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} - -.form-control-static { - padding-top: 7px; - margin-bottom: 0; -} - -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} - -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -.form-horizontal .control-label, -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} - -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -.form-horizontal .form-group:before, -.form-horizontal .form-group:after { - display: table; - content: " "; -} - -.form-horizontal .form-group:after { - clear: both; -} - -@media (min-width: 768px) { - .form-horizontal .control-label { - text-align: right; - } -} - -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.428571429; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - border: 1px solid transparent; - border-radius: 4px; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - -o-user-select: none; - user-select: none; -} - -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} - -.btn:hover, -.btn:focus { - color: #333333; - text-decoration: none; -} - -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-default { - color: #333333; - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #333333; - background-color: #ebebeb; - border-color: #adadad; -} - -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background-image: none; -} - -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #ffffff; - border-color: #cccccc; -} - -.btn-primary { - color: #ffffff; - background-color: #428bca; - border-color: #357ebd; -} - -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #3276b1; - border-color: #285e8e; -} - -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background-image: none; -} - -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} - -.btn-warning { - color: #ffffff; - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #ed9c28; - border-color: #d58512; -} - -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background-image: none; -} - -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} - -.btn-danger { - color: #ffffff; - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #d2322d; - border-color: #ac2925; -} - -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background-image: none; -} - -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} - -.btn-success { - color: #ffffff; - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #47a447; - border-color: #398439; -} - -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background-image: none; -} - -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} - -.btn-info { - color: #ffffff; - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #39b3d7; - border-color: #269abc; -} - -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background-image: none; -} - -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} - -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} - -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} - -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} - -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #999999; - text-decoration: none; -} - -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-sm, -.btn-xs { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-xs { - padding: 1px 5px; -} - -.btn-block { - display: block; - width: 100%; - padding-right: 0; - padding-left: 0; -} - -.btn-block + .btn-block { - margin-top: 5px; -} - -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} - -.fade { - opacity: 0; - -webkit-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; -} - -.fade.in { - opacity: 1; -} - -.collapse { - display: none; -} - -.collapse.in { - display: block; -} - -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height 0.35s ease; - transition: height 0.35s ease; -} - -@font-face { - font-family: 'Glyphicons Halflings'; - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg'); -} - -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - -webkit-font-smoothing: antialiased; - font-style: normal; - font-weight: normal; - line-height: 1; -} - -.glyphicon-asterisk:before { - content: "\2a"; -} - -.glyphicon-plus:before { - content: "\2b"; -} - -.glyphicon-euro:before { - content: "\20ac"; -} - -.glyphicon-minus:before { - content: "\2212"; -} - -.glyphicon-cloud:before { - content: "\2601"; -} - -.glyphicon-envelope:before { - content: "\2709"; -} - -.glyphicon-pencil:before { - content: "\270f"; -} - -.glyphicon-glass:before { - content: "\e001"; -} - -.glyphicon-music:before { - content: "\e002"; -} - -.glyphicon-search:before { - content: "\e003"; -} - -.glyphicon-heart:before { - content: "\e005"; -} - -.glyphicon-star:before { - content: "\e006"; -} - -.glyphicon-star-empty:before { - content: "\e007"; -} - -.glyphicon-user:before { - content: "\e008"; -} - -.glyphicon-film:before { - content: "\e009"; -} - -.glyphicon-th-large:before { - content: "\e010"; -} - -.glyphicon-th:before { - content: "\e011"; -} - -.glyphicon-th-list:before { - content: "\e012"; -} - -.glyphicon-ok:before { - content: "\e013"; -} - -.glyphicon-remove:before { - content: "\e014"; -} - -.glyphicon-zoom-in:before { - content: "\e015"; -} - -.glyphicon-zoom-out:before { - content: "\e016"; -} - -.glyphicon-off:before { - content: "\e017"; -} - -.glyphicon-signal:before { - content: "\e018"; -} - -.glyphicon-cog:before { - content: "\e019"; -} - -.glyphicon-trash:before { - content: "\e020"; -} - -.glyphicon-home:before { - content: "\e021"; -} - -.glyphicon-file:before { - content: "\e022"; -} - -.glyphicon-time:before { - content: "\e023"; -} - -.glyphicon-road:before { - content: "\e024"; -} - -.glyphicon-download-alt:before { - content: "\e025"; -} - -.glyphicon-download:before { - content: "\e026"; -} - -.glyphicon-upload:before { - content: "\e027"; -} - -.glyphicon-inbox:before { - content: "\e028"; -} - -.glyphicon-play-circle:before { - content: "\e029"; -} - -.glyphicon-repeat:before { - content: "\e030"; -} - -.glyphicon-refresh:before { - content: "\e031"; -} - -.glyphicon-list-alt:before { - content: "\e032"; -} - -.glyphicon-flag:before { - content: "\e034"; -} - -.glyphicon-headphones:before { - content: "\e035"; -} - -.glyphicon-volume-off:before { - content: "\e036"; -} - -.glyphicon-volume-down:before { - content: "\e037"; -} - -.glyphicon-volume-up:before { - content: "\e038"; -} - -.glyphicon-qrcode:before { - content: "\e039"; -} - -.glyphicon-barcode:before { - content: "\e040"; -} - -.glyphicon-tag:before { - content: "\e041"; -} - -.glyphicon-tags:before { - content: "\e042"; -} - -.glyphicon-book:before { - content: "\e043"; -} - -.glyphicon-print:before { - content: "\e045"; -} - -.glyphicon-font:before { - content: "\e047"; -} - -.glyphicon-bold:before { - content: "\e048"; -} - -.glyphicon-italic:before { - content: "\e049"; -} - -.glyphicon-text-height:before { - content: "\e050"; -} - -.glyphicon-text-width:before { - content: "\e051"; -} - -.glyphicon-align-left:before { - content: "\e052"; -} - -.glyphicon-align-center:before { - content: "\e053"; -} - -.glyphicon-align-right:before { - content: "\e054"; -} - -.glyphicon-align-justify:before { - content: "\e055"; -} - -.glyphicon-list:before { - content: "\e056"; -} - -.glyphicon-indent-left:before { - content: "\e057"; -} - -.glyphicon-indent-right:before { - content: "\e058"; -} - -.glyphicon-facetime-video:before { - content: "\e059"; -} - -.glyphicon-picture:before { - content: "\e060"; -} - -.glyphicon-map-marker:before { - content: "\e062"; -} - -.glyphicon-adjust:before { - content: "\e063"; -} - -.glyphicon-tint:before { - content: "\e064"; -} - -.glyphicon-edit:before { - content: "\e065"; -} - -.glyphicon-share:before { - content: "\e066"; -} - -.glyphicon-check:before { - content: "\e067"; -} - -.glyphicon-move:before { - content: "\e068"; -} - -.glyphicon-step-backward:before { - content: "\e069"; -} - -.glyphicon-fast-backward:before { - content: "\e070"; -} - -.glyphicon-backward:before { - content: "\e071"; -} - -.glyphicon-play:before { - content: "\e072"; -} - -.glyphicon-pause:before { - content: "\e073"; -} - -.glyphicon-stop:before { - content: "\e074"; -} - -.glyphicon-forward:before { - content: "\e075"; -} - -.glyphicon-fast-forward:before { - content: "\e076"; -} - -.glyphicon-step-forward:before { - content: "\e077"; -} - -.glyphicon-eject:before { - content: "\e078"; -} - -.glyphicon-chevron-left:before { - content: "\e079"; -} - -.glyphicon-chevron-right:before { - content: "\e080"; -} - -.glyphicon-plus-sign:before { - content: "\e081"; -} - -.glyphicon-minus-sign:before { - content: "\e082"; -} - -.glyphicon-remove-sign:before { - content: "\e083"; -} - -.glyphicon-ok-sign:before { - content: "\e084"; -} - -.glyphicon-question-sign:before { - content: "\e085"; -} - -.glyphicon-info-sign:before { - content: "\e086"; -} - -.glyphicon-screenshot:before { - content: "\e087"; -} - -.glyphicon-remove-circle:before { - content: "\e088"; -} - -.glyphicon-ok-circle:before { - content: "\e089"; -} - -.glyphicon-ban-circle:before { - content: "\e090"; -} - -.glyphicon-arrow-left:before { - content: "\e091"; -} - -.glyphicon-arrow-right:before { - content: "\e092"; -} - -.glyphicon-arrow-up:before { - content: "\e093"; -} - -.glyphicon-arrow-down:before { - content: "\e094"; -} - -.glyphicon-share-alt:before { - content: "\e095"; -} - -.glyphicon-resize-full:before { - content: "\e096"; -} - -.glyphicon-resize-small:before { - content: "\e097"; -} - -.glyphicon-exclamation-sign:before { - content: "\e101"; -} - -.glyphicon-gift:before { - content: "\e102"; -} - -.glyphicon-leaf:before { - content: "\e103"; -} - -.glyphicon-eye-open:before { - content: "\e105"; -} - -.glyphicon-eye-close:before { - content: "\e106"; -} - -.glyphicon-warning-sign:before { - content: "\e107"; -} - -.glyphicon-plane:before { - content: "\e108"; -} - -.glyphicon-random:before { - content: "\e110"; -} - -.glyphicon-comment:before { - content: "\e111"; -} - -.glyphicon-magnet:before { - content: "\e112"; -} - -.glyphicon-chevron-up:before { - content: "\e113"; -} - -.glyphicon-chevron-down:before { - content: "\e114"; -} - -.glyphicon-retweet:before { - content: "\e115"; -} - -.glyphicon-shopping-cart:before { - content: "\e116"; -} - -.glyphicon-folder-close:before { - content: "\e117"; -} - -.glyphicon-folder-open:before { - content: "\e118"; -} - -.glyphicon-resize-vertical:before { - content: "\e119"; -} - -.glyphicon-resize-horizontal:before { - content: "\e120"; -} - -.glyphicon-hdd:before { - content: "\e121"; -} - -.glyphicon-bullhorn:before { - content: "\e122"; -} - -.glyphicon-certificate:before { - content: "\e124"; -} - -.glyphicon-thumbs-up:before { - content: "\e125"; -} - -.glyphicon-thumbs-down:before { - content: "\e126"; -} - -.glyphicon-hand-right:before { - content: "\e127"; -} - -.glyphicon-hand-left:before { - content: "\e128"; -} - -.glyphicon-hand-up:before { - content: "\e129"; -} - -.glyphicon-hand-down:before { - content: "\e130"; -} - -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} - -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} - -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} - -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} - -.glyphicon-globe:before { - content: "\e135"; -} - -.glyphicon-tasks:before { - content: "\e137"; -} - -.glyphicon-filter:before { - content: "\e138"; -} - -.glyphicon-fullscreen:before { - content: "\e140"; -} - -.glyphicon-dashboard:before { - content: "\e141"; -} - -.glyphicon-heart-empty:before { - content: "\e143"; -} - -.glyphicon-link:before { - content: "\e144"; -} - -.glyphicon-phone:before { - content: "\e145"; -} - -.glyphicon-usd:before { - content: "\e148"; -} - -.glyphicon-gbp:before { - content: "\e149"; -} - -.glyphicon-sort:before { - content: "\e150"; -} - -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} - -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} - -.glyphicon-sort-by-order:before { - content: "\e153"; -} - -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} - -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} - -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} - -.glyphicon-unchecked:before { - content: "\e157"; -} - -.glyphicon-expand:before { - content: "\e158"; -} - -.glyphicon-collapse-down:before { - content: "\e159"; -} - -.glyphicon-collapse-up:before { - content: "\e160"; -} - -.glyphicon-log-in:before { - content: "\e161"; -} - -.glyphicon-flash:before { - content: "\e162"; -} - -.glyphicon-log-out:before { - content: "\e163"; -} - -.glyphicon-new-window:before { - content: "\e164"; -} - -.glyphicon-record:before { - content: "\e165"; -} - -.glyphicon-save:before { - content: "\e166"; -} - -.glyphicon-open:before { - content: "\e167"; -} - -.glyphicon-saved:before { - content: "\e168"; -} - -.glyphicon-import:before { - content: "\e169"; -} - -.glyphicon-export:before { - content: "\e170"; -} - -.glyphicon-send:before { - content: "\e171"; -} - -.glyphicon-floppy-disk:before { - content: "\e172"; -} - -.glyphicon-floppy-saved:before { - content: "\e173"; -} - -.glyphicon-floppy-remove:before { - content: "\e174"; -} - -.glyphicon-floppy-save:before { - content: "\e175"; -} - -.glyphicon-floppy-open:before { - content: "\e176"; -} - -.glyphicon-credit-card:before { - content: "\e177"; -} - -.glyphicon-transfer:before { - content: "\e178"; -} - -.glyphicon-cutlery:before { - content: "\e179"; -} - -.glyphicon-header:before { - content: "\e180"; -} - -.glyphicon-compressed:before { - content: "\e181"; -} - -.glyphicon-earphone:before { - content: "\e182"; -} - -.glyphicon-phone-alt:before { - content: "\e183"; -} - -.glyphicon-tower:before { - content: "\e184"; -} - -.glyphicon-stats:before { - content: "\e185"; -} - -.glyphicon-sd-video:before { - content: "\e186"; -} - -.glyphicon-hd-video:before { - content: "\e187"; -} - -.glyphicon-subtitles:before { - content: "\e188"; -} - -.glyphicon-sound-stereo:before { - content: "\e189"; -} - -.glyphicon-sound-dolby:before { - content: "\e190"; -} - -.glyphicon-sound-5-1:before { - content: "\e191"; -} - -.glyphicon-sound-6-1:before { - content: "\e192"; -} - -.glyphicon-sound-7-1:before { - content: "\e193"; -} - -.glyphicon-copyright-mark:before { - content: "\e194"; -} - -.glyphicon-registration-mark:before { - content: "\e195"; -} - -.glyphicon-cloud-download:before { - content: "\e197"; -} - -.glyphicon-cloud-upload:before { - content: "\e198"; -} - -.glyphicon-tree-conifer:before { - content: "\e199"; -} - -.glyphicon-tree-deciduous:before { - content: "\e200"; -} - -.glyphicon-briefcase:before { - content: "\1f4bc"; -} - -.glyphicon-calendar:before { - content: "\1f4c5"; -} - -.glyphicon-pushpin:before { - content: "\1f4cc"; -} - -.glyphicon-paperclip:before { - content: "\1f4ce"; -} - -.glyphicon-camera:before { - content: "\1f4f7"; -} - -.glyphicon-lock:before { - content: "\1f512"; -} - -.glyphicon-bell:before { - content: "\1f514"; -} - -.glyphicon-bookmark:before { - content: "\1f516"; -} - -.glyphicon-fire:before { - content: "\1f525"; -} - -.glyphicon-wrench:before { - content: "\1f527"; -} - -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid #000000; - border-right: 4px solid transparent; - border-bottom: 0 dotted; - border-left: 4px solid transparent; - content: ""; -} - -.dropdown { - position: relative; -} - -.dropdown-toggle:focus { - outline: 0; -} - -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - list-style: none; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); - background-clip: padding-box; -} - -.dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.428571429; - color: #333333; - white-space: nowrap; -} - -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; -} - -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #ffffff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} - -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #999999; -} - -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -} - -.open > .dropdown-menu { - display: block; -} - -.open > a { - outline: 0; -} - -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.428571429; - color: #999999; -} - -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} - -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} - -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0 dotted; - border-bottom: 4px solid #000000; - content: ""; -} - -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} - -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } -} - -.btn-default .caret { - border-top-color: #333333; -} - -.btn-primary .caret, -.btn-success .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret { - border-top-color: #fff; -} - -.dropup .btn-default .caret { - border-bottom-color: #333333; -} - -.dropup .btn-primary .caret, -.dropup .btn-success .caret, -.dropup .btn-warning .caret, -.dropup .btn-danger .caret, -.dropup .btn-info .caret { - border-bottom-color: #fff; -} - -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} - -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} - -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} - -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: none; -} - -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar:before, -.btn-toolbar:after { - display: table; - content: " "; -} - -.btn-toolbar:after { - clear: both; -} - -.btn-toolbar .btn-group { - float: left; -} - -.btn-toolbar > .btn + .btn, -.btn-toolbar > .btn-group + .btn, -.btn-toolbar > .btn + .btn-group, -.btn-toolbar > .btn-group + .btn-group { - margin-left: 5px; -} - -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} - -.btn-group > .btn:first-child { - margin-left: 0; -} - -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group > .btn-group { - float: left; -} - -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.btn-group > .btn-group:last-child > .btn:first-child { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} - -.btn-group-xs > .btn { - padding: 5px 10px; - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} - -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} - -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); -} - -.btn .caret { - margin-left: 0; -} - -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} - -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} - -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group { - display: block; - float: none; - width: 100%; - max-width: 100%; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after { - display: table; - content: " "; -} - -.btn-group-vertical > .btn-group:after { - clear: both; -} - -.btn-group-vertical > .btn-group > .btn { - float: none; -} - -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} - -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-right-radius: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 0; -} - -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} - -.btn-group-vertical > .btn-group:first-child > .btn:last-child, -.btn-group-vertical > .btn-group:first-child > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.btn-group-vertical > .btn-group:last-child > .btn:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.btn-group-justified { - display: table; - width: 100%; - border-collapse: separate; - table-layout: fixed; -} - -.btn-group-justified .btn { - display: table-cell; - float: none; - width: 1%; -} - -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - display: none; -} - -.input-group { - position: relative; - display: table; - border-collapse: separate; -} - -.input-group.col { - float: none; - padding-right: 0; - padding-left: 0; -} - -.input-group .form-control { - width: 100%; - margin-bottom: 0; -} - -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 45px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} - -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 45px; - line-height: 45px; -} - -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn { - height: auto; -} - -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} - -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} - -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn { - height: auto; -} - -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} - -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} - -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} - -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - text-align: center; - background-color: #eeeeee; - border: 1px solid #cccccc; - border-radius: 4px; -} - -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} - -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} - -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} - -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.input-group-addon:first-child { - border-right: 0; -} - -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child) { - border-bottom-left-radius: 0; - border-top-left-radius: 0; -} - -.input-group-addon:last-child { - border-left: 0; -} - -.input-group-btn { - position: relative; - white-space: nowrap; -} - -.input-group-btn > .btn { - position: relative; -} - -.input-group-btn > .btn + .btn { - margin-left: -4px; -} - -.input-group-btn > .btn:hover, -.input-group-btn > .btn:active { - z-index: 2; -} - -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav:before, -.nav:after { - display: table; - content: " "; -} - -.nav:after { - clear: both; -} - -.nav > li { - position: relative; - display: block; -} - -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} - -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.nav > li.disabled > a { - color: #999999; -} - -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #999999; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} - -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eeeeee; - border-color: #428bca; -} - -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} - -.nav > li > a > img { - max-width: none; -} - -.nav-tabs { - border-bottom: 1px solid #dddddd; -} - -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} - -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.428571429; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} - -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} - -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555555; - cursor: default; - background-color: #ffffff; - border: 1px solid #dddddd; - border-bottom-color: transparent; -} - -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} - -.nav-tabs.nav-justified > li { - float: none; -} - -.nav-tabs.nav-justified > li > a { - text-align: center; -} - -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } -} - -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-bottom: 1px solid #dddddd; -} - -.nav-tabs.nav-justified > .active > a { - border-bottom-color: #ffffff; -} - -.nav-pills > li { - float: left; -} - -.nav-pills > li > a { - border-radius: 5px; -} - -.nav-pills > li + li { - margin-left: 2px; -} - -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #ffffff; - background-color: #428bca; -} - -.nav-stacked > li { - float: none; -} - -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} - -.nav-justified { - width: 100%; -} - -.nav-justified > li { - float: none; -} - -.nav-justified > li > a { - text-align: center; -} - -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } -} - -.nav-tabs-justified { - border-bottom: 0; -} - -.nav-tabs-justified > li > a { - margin-right: 0; - border-bottom: 1px solid #dddddd; -} - -.nav-tabs-justified > .active > a { - border-bottom-color: #ffffff; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; -} - -.tabbable:after { - clear: both; -} - -.tabbable:before, -.tabbable:after { - display: table; - content: " "; -} - -.tabbable:after { - clear: both; -} - -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} - -.tab-content > .active, -.pill-content > .active { - display: block; -} - -.nav .caret { - border-top-color: #428bca; - border-bottom-color: #428bca; -} - -.nav a:hover .caret { - border-top-color: #2a6496; - border-bottom-color: #2a6496; -} - -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar { - position: relative; - z-index: 1000; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -.navbar:before, -.navbar:after { - display: table; - content: " "; -} - -.navbar:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -.navbar-header:before, -.navbar-header:after { - display: table; - content: " "; -} - -.navbar-header:after { - clear: both; -} - -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} - -.navbar-collapse { - max-height: 340px; - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - border-top: 1px solid transparent; - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-overflow-scrolling: touch; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse:before, -.navbar-collapse:after { - display: table; - content: " "; -} - -.navbar-collapse:after { - clear: both; -} - -.navbar-collapse.in { - overflow-y: auto; -} - -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-collapse .navbar-nav.navbar-left:first-child { - margin-left: -15px; - } - .navbar-collapse .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } - .navbar-collapse .navbar-text:last-child { - margin-right: 0; - } -} - -.container > .navbar-header, -.container > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} - -@media (min-width: 768px) { - .container > .navbar-header, - .container > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} - -.navbar-static-top { - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} - -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - border-width: 0 0 1px; -} - -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} - -.navbar-fixed-top { - top: 0; - z-index: 1030; -} - -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; -} - -.navbar-brand { - float: left; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} - -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} - -@media (min-width: 768px) { - .navbar > .container .navbar-brand { - margin-left: -15px; - } -} - -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - border: 1px solid transparent; - border-radius: 4px; -} - -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} - -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} - -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} - -.navbar-nav { - margin: 7.5px -15px; -} - -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} - -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} - -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } -} - -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} - -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); -} - -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - padding-left: 0; - margin-top: 0; - margin-bottom: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - float: none; - margin-left: 0; - } -} - -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} - -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } -} - -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.navbar-nav.pull-right > li > .dropdown-menu, -.navbar-nav > li > .dropdown-menu.pull-right { - right: 0; - left: auto; -} - -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} - -.navbar-text { - float: left; - margin-top: 15px; - margin-bottom: 15px; -} - -@media (min-width: 768px) { - .navbar-text { - margin-right: 15px; - margin-left: 15px; - } -} - -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} - -.navbar-default .navbar-brand { - color: #777777; -} - -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} - -.navbar-default .navbar-text { - color: #777777; -} - -.navbar-default .navbar-nav > li > a { - color: #777777; -} - -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333333; - background-color: transparent; -} - -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #cccccc; - background-color: transparent; -} - -.navbar-default .navbar-toggle { - border-color: #dddddd; -} - -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #dddddd; -} - -.navbar-default .navbar-toggle .icon-bar { - background-color: #cccccc; -} - -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e6e6e6; -} - -.navbar-default .navbar-nav > .dropdown > a:hover .caret, -.navbar-default .navbar-nav > .dropdown > a:focus .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} - -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555555; - background-color: #e7e7e7; -} - -.navbar-default .navbar-nav > .open > a .caret, -.navbar-default .navbar-nav > .open > a:hover .caret, -.navbar-default .navbar-nav > .open > a:focus .caret { - border-top-color: #555555; - border-bottom-color: #555555; -} - -.navbar-default .navbar-nav > .dropdown > a .caret { - border-top-color: #777777; - border-bottom-color: #777777; -} - -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #cccccc; - background-color: transparent; - } -} - -.navbar-default .navbar-link { - color: #777777; -} - -.navbar-default .navbar-link:hover { - color: #333333; -} - -.navbar-inverse { - background-color: #222222; - border-color: #080808; -} - -.navbar-inverse .navbar-brand { - color: #999999; -} - -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-text { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a { - color: #999999; -} - -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #ffffff; - background-color: transparent; -} - -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444444; - background-color: transparent; -} - -.navbar-inverse .navbar-toggle { - border-color: #333333; -} - -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333333; -} - -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #ffffff; -} - -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} - -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #ffffff; - background-color: #080808; -} - -.navbar-inverse .navbar-nav > .dropdown > a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -.navbar-inverse .navbar-nav > .dropdown > a .caret { - border-top-color: #999999; - border-bottom-color: #999999; -} - -.navbar-inverse .navbar-nav > .open > a .caret, -.navbar-inverse .navbar-nav > .open > a:hover .caret, -.navbar-inverse .navbar-nav > .open > a:focus .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} - -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #999999; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #ffffff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #ffffff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444444; - background-color: transparent; - } -} - -.navbar-inverse .navbar-link { - color: #999999; -} - -.navbar-inverse .navbar-link:hover { - color: #ffffff; -} - -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} - -.breadcrumb > li { - display: inline-block; -} - -.breadcrumb > li + li:before { - padding: 0 5px; - color: #cccccc; - content: "/\00a0"; -} - -.breadcrumb > .active { - color: #999999; -} - -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} - -.pagination > li { - display: inline; -} - -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.428571429; - text-decoration: none; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-bottom-left-radius: 4px; - border-top-left-radius: 4px; -} - -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} - -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - background-color: #eeeeee; -} - -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #ffffff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} - -.pagination > .disabled > span, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; - border-color: #dddddd; -} - -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} - -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-bottom-left-radius: 6px; - border-top-left-radius: 6px; -} - -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} - -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-bottom-left-radius: 3px; - border-top-left-radius: 3px; -} - -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager:before, -.pager:after { - display: table; - content: " "; -} - -.pager:after { - clear: both; -} - -.pager li { - display: inline; -} - -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 15px; -} - -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eeeeee; -} - -.pager .next > a, -.pager .next > span { - float: right; -} - -.pager .previous > a, -.pager .previous > span { - float: left; -} - -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #999999; - cursor: not-allowed; - background-color: #ffffff; -} - -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} - -.label[href]:hover, -.label[href]:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.label:empty { - display: none; -} - -.label-default { - background-color: #999999; -} - -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #808080; -} - -.label-primary { - background-color: #428bca; -} - -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} - -.label-success { - background-color: #5cb85c; -} - -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} - -.label-info { - background-color: #5bc0de; -} - -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} - -.label-warning { - background-color: #f0ad4e; -} - -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} - -.label-danger { - background-color: #d9534f; -} - -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} - -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #ffffff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #999999; - border-radius: 10px; -} - -.badge:empty { - display: none; -} - -a.badge:hover, -a.badge:focus { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} - -.btn .badge { - position: relative; - top: -1px; -} - -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #ffffff; -} - -.nav-pills > li > a > .badge { - margin-left: 3px; -} - -.jumbotron { - padding: 30px; - margin-bottom: 30px; - font-size: 21px; - font-weight: 200; - line-height: 2.1428571435; - color: inherit; - background-color: #eeeeee; -} - -.jumbotron h1 { - line-height: 1; - color: inherit; -} - -.jumbotron p { - line-height: 1.4; -} - -.container .jumbotron { - border-radius: 6px; -} - -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1 { - font-size: 63px; - } -} - -.thumbnail { - display: inline-block; - display: block; - height: auto; - max-width: 100%; - padding: 4px; - line-height: 1.428571429; - background-color: #ffffff; - border: 1px solid #dddddd; - border-radius: 4px; - -webkit-transition: all 0.2s ease-in-out; - transition: all 0.2s ease-in-out; -} - -.thumbnail > img { - display: block; - height: auto; - max-width: 100%; -} - -a.thumbnail:hover, -a.thumbnail:focus { - border-color: #428bca; -} - -.thumbnail > img { - margin-right: auto; - margin-left: auto; -} - -.thumbnail .caption { - padding: 9px; - color: #333333; -} - -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} - -.alert h4 { - margin-top: 0; - color: inherit; -} - -.alert .alert-link { - font-weight: bold; -} - -.alert > p, -.alert > ul { - margin-bottom: 0; -} - -.alert > p + p { - margin-top: 5px; -} - -.alert-dismissable { - padding-right: 35px; -} - -.alert-dismissable .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} - -.alert-success { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.alert-success hr { - border-top-color: #c9e2b3; -} - -.alert-success .alert-link { - color: #356635; -} - -.alert-info { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.alert-info hr { - border-top-color: #a6e1ec; -} - -.alert-info .alert-link { - color: #2d6987; -} - -.alert-warning { - color: #c09853; - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.alert-warning hr { - border-top-color: #f8e5be; -} - -.alert-warning .alert-link { - color: #a47e3c; -} - -.alert-danger { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.alert-danger hr { - border-top-color: #e6c1c7; -} - -.alert-danger .alert-link { - color: #953b39; -} - -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-moz-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -@-o-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} - -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} - -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -} - -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - color: #ffffff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-transition: width 0.6s ease; - transition: width 0.6s ease; -} - -.progress-striped .progress-bar { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-size: 40px 40px; -} - -.progress.active .progress-bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - -ms-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} - -.progress-bar-success { - background-color: #5cb85c; -} - -.progress-striped .progress-bar-success { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-info { - background-color: #5bc0de; -} - -.progress-striped .progress-bar-info { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-warning { - background-color: #f0ad4e; -} - -.progress-striped .progress-bar-warning { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.progress-bar-danger { - background-color: #d9534f; -} - -.progress-striped .progress-bar-danger { - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} - -.media, -.media-body { - overflow: hidden; - zoom: 1; -} - -.media, -.media .media { - margin-top: 15px; -} - -.media:first-child { - margin-top: 0; -} - -.media-object { - display: block; -} - -.media-heading { - margin: 0 0 5px; -} - -.media > .pull-left { - margin-right: 10px; -} - -.media > .pull-right { - margin-left: 10px; -} - -.media-list { - padding-left: 0; - list-style: none; -} - -.list-group { - padding-left: 0; - margin-bottom: 20px; -} - -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #ffffff; - border: 1px solid #dddddd; -} - -.list-group-item:first-child { - border-top-right-radius: 4px; - border-top-left-radius: 4px; -} - -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} - -.list-group-item > .badge { - float: right; -} - -.list-group-item > .badge + .badge { - margin-right: 5px; -} - -a.list-group-item { - color: #555555; -} - -a.list-group-item .list-group-item-heading { - color: #333333; -} - -a.list-group-item:hover, -a.list-group-item:focus { - text-decoration: none; - background-color: #f5f5f5; -} - -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading { - color: inherit; -} - -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} - -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} - -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} - -.panel { - margin-bottom: 20px; - background-color: #ffffff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.panel-body { - padding: 15px; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel-body:before, -.panel-body:after { - display: table; - content: " "; -} - -.panel-body:after { - clear: both; -} - -.panel > .list-group { - margin-bottom: 0; -} - -.panel > .list-group .list-group-item { - border-width: 1px 0; -} - -.panel > .list-group .list-group-item:first-child { - border-top-right-radius: 0; - border-top-left-radius: 0; -} - -.panel > .list-group .list-group-item:last-child { - border-bottom: 0; -} - -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} - -.panel > .table { - margin-bottom: 0; -} - -.panel > .panel-body + .table { - border-top: 1px solid #dddddd; -} - -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-right-radius: 3px; - border-top-left-radius: 3px; -} - -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; -} - -.panel-title > a { - color: inherit; -} - -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #dddddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} - -.panel-group .panel { - margin-bottom: 0; - overflow: hidden; - border-radius: 4px; -} - -.panel-group .panel + .panel { - margin-top: 5px; -} - -.panel-group .panel-heading { - border-bottom: 0; -} - -.panel-group .panel-heading + .panel-collapse .panel-body { - border-top: 1px solid #dddddd; -} - -.panel-group .panel-footer { - border-top: 0; -} - -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #dddddd; -} - -.panel-default { - border-color: #dddddd; -} - -.panel-default > .panel-heading { - color: #333333; - background-color: #f5f5f5; - border-color: #dddddd; -} - -.panel-default > .panel-heading + .panel-collapse .panel-body { - border-top-color: #dddddd; -} - -.panel-default > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #dddddd; -} - -.panel-primary { - border-color: #428bca; -} - -.panel-primary > .panel-heading { - color: #ffffff; - background-color: #428bca; - border-color: #428bca; -} - -.panel-primary > .panel-heading + .panel-collapse .panel-body { - border-top-color: #428bca; -} - -.panel-primary > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #428bca; -} - -.panel-success { - border-color: #d6e9c6; -} - -.panel-success > .panel-heading { - color: #468847; - background-color: #dff0d8; - border-color: #d6e9c6; -} - -.panel-success > .panel-heading + .panel-collapse .panel-body { - border-top-color: #d6e9c6; -} - -.panel-success > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #d6e9c6; -} - -.panel-warning { - border-color: #fbeed5; -} - -.panel-warning > .panel-heading { - color: #c09853; - background-color: #fcf8e3; - border-color: #fbeed5; -} - -.panel-warning > .panel-heading + .panel-collapse .panel-body { - border-top-color: #fbeed5; -} - -.panel-warning > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #fbeed5; -} - -.panel-danger { - border-color: #eed3d7; -} - -.panel-danger > .panel-heading { - color: #b94a48; - background-color: #f2dede; - border-color: #eed3d7; -} - -.panel-danger > .panel-heading + .panel-collapse .panel-body { - border-top-color: #eed3d7; -} - -.panel-danger > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #eed3d7; -} - -.panel-info { - border-color: #bce8f1; -} - -.panel-info > .panel-heading { - color: #3a87ad; - background-color: #d9edf7; - border-color: #bce8f1; -} - -.panel-info > .panel-heading + .panel-collapse .panel-body { - border-top-color: #bce8f1; -} - -.panel-info > .panel-footer + .panel-collapse .panel-body { - border-bottom-color: #bce8f1; -} - -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} - -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} - -.well-lg { - padding: 24px; - border-radius: 6px; -} - -.well-sm { - padding: 9px; - border-radius: 3px; -} - -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} - -.close:hover, -.close:focus { - color: #000000; - text-decoration: none; - cursor: pointer; - opacity: 0.5; - filter: alpha(opacity=50); -} - -button.close { - padding: 0; - cursor: pointer; - background: transparent; - border: 0; - -webkit-appearance: none; -} - -.modal-open { - overflow: hidden; -} - -body.modal-open, -.modal-open .navbar-fixed-top, -.modal-open .navbar-fixed-bottom { - margin-right: 15px; -} - -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - display: none; - overflow: auto; - overflow-y: scroll; -} - -.modal.fade .modal-dialog { - -webkit-transform: translate(0, -25%); - -ms-transform: translate(0, -25%); - transform: translate(0, -25%); - -webkit-transition: -webkit-transform 0.3s ease-out; - -moz-transition: -moz-transform 0.3s ease-out; - -o-transition: -o-transform 0.3s ease-out; - transition: transform 0.3s ease-out; -} - -.modal.in .modal-dialog { - -webkit-transform: translate(0, 0); - -ms-transform: translate(0, 0); - transform: translate(0, 0); -} - -.modal-dialog { - z-index: 1050; - width: auto; - padding: 10px; - margin-right: auto; - margin-left: auto; -} - -.modal-content { - position: relative; - background-color: #ffffff; - border: 1px solid #999999; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - outline: none; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); - background-clip: padding-box; -} - -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1030; - background-color: #000000; -} - -.modal-backdrop.fade { - opacity: 0; - filter: alpha(opacity=0); -} - -.modal-backdrop.in { - opacity: 0.5; - filter: alpha(opacity=50); -} - -.modal-header { - min-height: 16.428571429px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} - -.modal-header .close { - margin-top: -2px; -} - -.modal-title { - margin: 0; - line-height: 1.428571429; -} - -.modal-body { - position: relative; - padding: 20px; -} - -.modal-footer { - padding: 19px 20px 20px; - margin-top: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} - -.modal-footer:after { - clear: both; -} - -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} - -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} - -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} - -@media screen and (min-width: 768px) { - .modal-dialog { - right: auto; - left: 50%; - width: 600px; - padding-top: 30px; - padding-bottom: 30px; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); - } -} - -.tooltip { - position: absolute; - z-index: 1030; - display: block; - font-size: 12px; - line-height: 1.4; - opacity: 0; - filter: alpha(opacity=0); - visibility: visible; -} - -.tooltip.in { - opacity: 0.9; - filter: alpha(opacity=90); -} - -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} - -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} - -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} - -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} - -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - border-radius: 4px; -} - -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-top-color: #000000; - border-width: 5px 5px 0; -} - -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-right-color: #000000; - border-width: 5px 5px 5px 0; -} - -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-left-color: #000000; - border-width: 5px 0 5px 5px; -} - -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-bottom-color: #000000; - border-width: 0 5px 5px; -} - -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #ffffff; - border: 1px solid #cccccc; - border: 1px solid rgba(0, 0, 0, 0.2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - background-clip: padding-box; -} - -.popover.top { - margin-top: -10px; -} - -.popover.right { - margin-left: 10px; -} - -.popover.bottom { - margin-top: 10px; -} - -.popover.left { - margin-left: -10px; -} - -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} - -.popover-content { - padding: 9px 14px; -} - -.popover .arrow, -.popover .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} - -.popover .arrow { - border-width: 11px; -} - -.popover .arrow:after { - border-width: 10px; - content: ""; -} - -.popover.top .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999999; - border-top-color: rgba(0, 0, 0, 0.25); - border-bottom-width: 0; -} - -.popover.top .arrow:after { - bottom: 1px; - margin-left: -10px; - border-top-color: #ffffff; - border-bottom-width: 0; - content: " "; -} - -.popover.right .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999999; - border-right-color: rgba(0, 0, 0, 0.25); - border-left-width: 0; -} - -.popover.right .arrow:after { - bottom: -10px; - left: 1px; - border-right-color: #ffffff; - border-left-width: 0; - content: " "; -} - -.popover.bottom .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-bottom-color: #999999; - border-bottom-color: rgba(0, 0, 0, 0.25); - border-top-width: 0; -} - -.popover.bottom .arrow:after { - top: 1px; - margin-left: -10px; - border-bottom-color: #ffffff; - border-top-width: 0; - content: " "; -} - -.popover.left .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-left-color: #999999; - border-left-color: rgba(0, 0, 0, 0.25); - border-right-width: 0; -} - -.popover.left .arrow:after { - right: 1px; - bottom: -10px; - border-left-color: #ffffff; - border-right-width: 0; - content: " "; -} - -.carousel { - position: relative; -} - -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} - -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} - -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - height: auto; - max-width: 100%; - line-height: 1; -} - -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} - -.carousel-inner > .active { - left: 0; -} - -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} - -.carousel-inner > .next { - left: 100%; -} - -.carousel-inner > .prev { - left: -100%; -} - -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} - -.carousel-inner > .active.left { - left: -100%; -} - -.carousel-inner > .active.right { - left: 100%; -} - -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); - opacity: 0.5; - filter: alpha(opacity=50); -} - -.carousel-control.left { - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); -} - -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); - background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); - background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); -} - -.carousel-control:hover, -.carousel-control:focus { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} - -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - left: 50%; - z-index: 5; - display: inline-block; -} - -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - margin-left: -10px; - font-family: serif; -} - -.carousel-control .icon-prev:before { - content: '\2039'; -} - -.carousel-control .icon-next:before { - content: '\203a'; -} - -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} - -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - border: 1px solid #ffffff; - border-radius: 10px; -} - -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #ffffff; -} - -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #ffffff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); -} - -.carousel-caption .btn { - text-shadow: none; -} - -@media screen and (min-width: 768px) { - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - margin-left: -15px; - font-size: 30px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} - -.clearfix:before, -.clearfix:after { - display: table; - content: " "; -} - -.clearfix:after { - clear: both; -} - -.pull-right { - float: right !important; -} - -.pull-left { - float: left !important; -} - -.hide { - display: none !important; -} - -.show { - display: block !important; -} - -.invisible { - visibility: hidden; -} - -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} - -.affix { - position: fixed; -} - -@-ms-viewport { - width: device-width; -} - -@media screen and (max-width: 400px) { - @-ms-viewport { - width: 320px; - } -} - -.hidden { - display: none !important; - visibility: hidden !important; -} - -.visible-xs { - display: none !important; -} - -tr.visible-xs { - display: none !important; -} - -th.visible-xs, -td.visible-xs { - display: none !important; -} - -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-xs.visible-sm { - display: block !important; - } - tr.visible-xs.visible-sm { - display: table-row !important; - } - th.visible-xs.visible-sm, - td.visible-xs.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-xs.visible-md { - display: block !important; - } - tr.visible-xs.visible-md { - display: table-row !important; - } - th.visible-xs.visible-md, - td.visible-xs.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-xs.visible-lg { - display: block !important; - } - tr.visible-xs.visible-lg { - display: table-row !important; - } - th.visible-xs.visible-lg, - td.visible-xs.visible-lg { - display: table-cell !important; - } -} - -.visible-sm { - display: none !important; -} - -tr.visible-sm { - display: none !important; -} - -th.visible-sm, -td.visible-sm { - display: none !important; -} - -@media (max-width: 767px) { - .visible-sm.visible-xs { - display: block !important; - } - tr.visible-sm.visible-xs { - display: table-row !important; - } - th.visible-sm.visible-xs, - td.visible-sm.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-sm.visible-md { - display: block !important; - } - tr.visible-sm.visible-md { - display: table-row !important; - } - th.visible-sm.visible-md, - td.visible-sm.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-sm.visible-lg { - display: block !important; - } - tr.visible-sm.visible-lg { - display: table-row !important; - } - th.visible-sm.visible-lg, - td.visible-sm.visible-lg { - display: table-cell !important; - } -} - -.visible-md { - display: none !important; -} - -tr.visible-md { - display: none !important; -} - -th.visible-md, -td.visible-md { - display: none !important; -} - -@media (max-width: 767px) { - .visible-md.visible-xs { - display: block !important; - } - tr.visible-md.visible-xs { - display: table-row !important; - } - th.visible-md.visible-xs, - td.visible-md.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-md.visible-sm { - display: block !important; - } - tr.visible-md.visible-sm { - display: table-row !important; - } - th.visible-md.visible-sm, - td.visible-md.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-md.visible-lg { - display: block !important; - } - tr.visible-md.visible-lg { - display: table-row !important; - } - th.visible-md.visible-lg, - td.visible-md.visible-lg { - display: table-cell !important; - } -} - -.visible-lg { - display: none !important; -} - -tr.visible-lg { - display: none !important; -} - -th.visible-lg, -td.visible-lg { - display: none !important; -} - -@media (max-width: 767px) { - .visible-lg.visible-xs { - display: block !important; - } - tr.visible-lg.visible-xs { - display: table-row !important; - } - th.visible-lg.visible-xs, - td.visible-lg.visible-xs { - display: table-cell !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .visible-lg.visible-sm { - display: block !important; - } - tr.visible-lg.visible-sm { - display: table-row !important; - } - th.visible-lg.visible-sm, - td.visible-lg.visible-sm { - display: table-cell !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .visible-lg.visible-md { - display: block !important; - } - tr.visible-lg.visible-md { - display: table-row !important; - } - th.visible-lg.visible-md, - td.visible-lg.visible-md { - display: table-cell !important; - } -} - -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} - -.hidden-xs { - display: block !important; -} - -tr.hidden-xs { - display: table-row !important; -} - -th.hidden-xs, -td.hidden-xs { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } - tr.hidden-xs { - display: none !important; - } - th.hidden-xs, - td.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-xs.hidden-sm { - display: none !important; - } - tr.hidden-xs.hidden-sm { - display: none !important; - } - th.hidden-xs.hidden-sm, - td.hidden-xs.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-xs.hidden-md { - display: none !important; - } - tr.hidden-xs.hidden-md { - display: none !important; - } - th.hidden-xs.hidden-md, - td.hidden-xs.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-xs.hidden-lg { - display: none !important; - } - tr.hidden-xs.hidden-lg { - display: none !important; - } - th.hidden-xs.hidden-lg, - td.hidden-xs.hidden-lg { - display: none !important; - } -} - -.hidden-sm { - display: block !important; -} - -tr.hidden-sm { - display: table-row !important; -} - -th.hidden-sm, -td.hidden-sm { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-sm.hidden-xs { - display: none !important; - } - tr.hidden-sm.hidden-xs { - display: none !important; - } - th.hidden-sm.hidden-xs, - td.hidden-sm.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } - tr.hidden-sm { - display: none !important; - } - th.hidden-sm, - td.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-sm.hidden-md { - display: none !important; - } - tr.hidden-sm.hidden-md { - display: none !important; - } - th.hidden-sm.hidden-md, - td.hidden-sm.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-sm.hidden-lg { - display: none !important; - } - tr.hidden-sm.hidden-lg { - display: none !important; - } - th.hidden-sm.hidden-lg, - td.hidden-sm.hidden-lg { - display: none !important; - } -} - -.hidden-md { - display: block !important; -} - -tr.hidden-md { - display: table-row !important; -} - -th.hidden-md, -td.hidden-md { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-md.hidden-xs { - display: none !important; - } - tr.hidden-md.hidden-xs { - display: none !important; - } - th.hidden-md.hidden-xs, - td.hidden-md.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-md.hidden-sm { - display: none !important; - } - tr.hidden-md.hidden-sm { - display: none !important; - } - th.hidden-md.hidden-sm, - td.hidden-md.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } - tr.hidden-md { - display: none !important; - } - th.hidden-md, - td.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-md.hidden-lg { - display: none !important; - } - tr.hidden-md.hidden-lg { - display: none !important; - } - th.hidden-md.hidden-lg, - td.hidden-md.hidden-lg { - display: none !important; - } -} - -.hidden-lg { - display: block !important; -} - -tr.hidden-lg { - display: table-row !important; -} - -th.hidden-lg, -td.hidden-lg { - display: table-cell !important; -} - -@media (max-width: 767px) { - .hidden-lg.hidden-xs { - display: none !important; - } - tr.hidden-lg.hidden-xs { - display: none !important; - } - th.hidden-lg.hidden-xs, - td.hidden-lg.hidden-xs { - display: none !important; - } -} - -@media (min-width: 768px) and (max-width: 991px) { - .hidden-lg.hidden-sm { - display: none !important; - } - tr.hidden-lg.hidden-sm { - display: none !important; - } - th.hidden-lg.hidden-sm, - td.hidden-lg.hidden-sm { - display: none !important; - } -} - -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-lg.hidden-md { - display: none !important; - } - tr.hidden-lg.hidden-md { - display: none !important; - } - th.hidden-lg.hidden-md, - td.hidden-lg.hidden-md { - display: none !important; - } -} - -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } - tr.hidden-lg { - display: none !important; - } - th.hidden-lg, - td.hidden-lg { - display: none !important; - } -} - -.visible-print { - display: none !important; -} - -tr.visible-print { - display: none !important; -} - -th.visible-print, -td.visible-print { - display: none !important; -} - -@media print { - .visible-print { - display: block !important; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } - .hidden-print { - display: none !important; - } - tr.hidden-print { - display: none !important; - } - th.hidden-print, - td.hidden-print { - display: none !important; - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css deleted file mode 100644 index a553c4f5e08..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/css/bootstrap.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - *//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 87eaa434234e2a984c261e0450a2f4ad837aa7b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14079 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 5fee0685496..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,228 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph /> -<glyph /> -<glyph unicode=" " /> -<glyph unicode="*" d="M1100 500h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200z" /> -<glyph unicode="+" d="M1100 400h-400v-400h-300v400h-400v300h400v400h300v-400h400v-300z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M800 500h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257 q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406z" /> -<glyph unicode="−" d="M1100 700h-900v-300h900v300z" /> -<glyph unicode="☁" d="M178 300h750q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57z" /> -<glyph unicode="✉" d="M1200 1100h-1200l600 -603zM300 600l-300 -300v600zM1200 900v-600l-300 300zM800 500l400 -400h-1200l400 400l200 -200z" /> -<glyph unicode="✏" d="M1101 889l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13l-94 -97zM401 189l614 614l-214 214l-614 -614zM-13 -13l333 112l-223 223z" /> -<glyph unicode="" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="" d="M700 100h300v-100h-800v100h300v550l-500 550h1200l-500 -550v-550z" /> -<glyph unicode="" d="M1000 934v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q17 -55 85.5 -75.5t147.5 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7q-79 -25 -122.5 -82t-25.5 -112t86 -75.5t147 5.5 q65 21 109 69t44 90v606z" /> -<glyph unicode="" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> -<glyph unicode="" d="M649 949q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5t-94 124.5t-33.5 117.5q0 64 28 123t73 100.5t104.5 64t119 20.5 t120 -38.5t104.5 -104.5z" /> -<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM168 71l2 1z" /> -<glyph unicode="" d="M791 522l145 -449l-384 275l-382 -275l146 447l-388 280h479l146 400h2l146 -400h472zM747 331l-74 229l193 140h-235l-77 211l-78 -211h-239l196 -142l-73 -226l192 140zM168 71l2 1z" /> -<glyph unicode="" d="M1200 143v-143h-1200v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100z" /> -<glyph unicode="" d="M1200 1100v-1100h-1200v1100h1200zM200 1000h-100v-100h100v100zM900 1000h-600v-400h600v400zM1100 1000h-100v-100h100v100zM200 800h-100v-100h100v100zM1100 800h-100v-100h100v100zM200 600h-100v-100h100v100zM1100 600h-100v-100h100v100zM900 500h-600v-400h600 v400zM200 400h-100v-100h100v100zM1100 400h-100v-100h100v100zM200 200h-100v-100h100v100zM1100 200h-100v-100h100v100z" /> -<glyph unicode="" d="M500 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400 q21 0 35.5 -14.5t14.5 -35.5zM500 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5zM1100 450v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5zM1100 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM700 250v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1100 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5 t14.5 -35.5z" /> -<glyph unicode="" d="M300 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 1050v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700 q21 0 35.5 -14.5t14.5 -35.5zM300 450v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-200q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM1200 650v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5zM300 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5zM1200 250v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M448 34l818 820l-212 212l-607 -607l-206 207l-212 -212z" /> -<glyph unicode="" d="M882 106l-282 282l-282 -282l-212 212l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282z" /> -<glyph unicode="" d="M913 432l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -142 -78 -261zM507 363q137 0 233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5t-234 -97t-97 -233 t97 -233t234 -97zM600 800h100v-200h-100v-100h-200v100h-100v200h100v100h200v-100z" /> -<glyph unicode="" d="M913 432l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 299q-120 -77 -261 -77q-200 0 -342 142t-142 342t142 342t342 142t342 -142t142 -342q0 -141 -78 -262zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 801v-200h400v200h-400z" /> -<glyph unicode="" d="M700 750v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5zM800 975v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123 t-123 184t-45.5 224.5q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155z" /> -<glyph unicode="" d="M1200 1h-200v1200h200v-1200zM900 1h-200v800h200v-800zM600 1h-200v500h200v-500zM300 301h-200v-300h200v300z" /> -<glyph unicode="" d="M488 183l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5 q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39zM600 815q89 0 152 -63 t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152q0 88 63 151t152 63z" /> -<glyph unicode="" d="M900 1100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100zM800 1100v100h-300v-100h300zM200 900h900v-800q0 -41 -29.5 -71 t-70.5 -30h-700q-41 0 -70.5 30t-29.5 71v800zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> -<glyph unicode="" d="M1301 601h-200v-600h-300v400h-300v-400h-300v600h-200l656 644z" /> -<glyph unicode="" d="M600 700h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18v1150q0 11 7 18t18 7h475v-500zM1000 800h-300v300z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 600h200 v-100h-300v400h100v-300z" /> -<glyph unicode="" d="M721 400h-242l-40 -400h-539l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538zM712 500l-27 300h-170l-27 -300h224z" /> -<glyph unicode="" d="M1100 400v-400h-1100v400h490l-290 300h200v500h300v-500h200l-290 -300h490zM988 300h-175v-100h175v100z" /> -<glyph unicode="" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 1012q-170 0 -291 -121t-121 -291t121 -291t291 -121t291 121 t121 291t-121 291t-291 121zM700 600h150l-250 -300l-250 300h150v300h200v-300z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM850 600h-150 v-300h-200v300h-150l250 300z" /> -<glyph unicode="" d="M0 500l200 700h800q199 -700 200 -700v-475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18v475zM903 1000h-606l-97 -500h200l50 -200h300l50 200h200z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM797 598 l-297 -201v401z" /> -<glyph unicode="" d="M1177 600h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123t-123 -184t-45.5 -224.5t45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123 t123 184t45.5 224.5z" /> -<glyph unicode="" d="M700 800l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400zM500 400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122l-145 -145v400h400z" /> -<glyph unicode="" d="M100 1200v-1200h1100v1200h-1100zM1100 100h-900v900h900v-900zM400 800h-100v100h100v-100zM1000 800h-500v100h500v-100zM400 600h-100v100h100v-100zM1000 600h-500v100h500v-100zM400 400h-100v100h100v-100zM1000 400h-500v100h500v-100zM400 200h-100v100h100v-100 zM1000 300h-500v-100h500v100z" /> -<glyph unicode="" d="M200 0h-100v1100h100v-1100zM1100 600v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5z" /> -<glyph unicode="" d="M1200 275v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5t-49.5 -227v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50 q11 0 18 7t7 18zM400 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14zM1000 480v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14z" /> -<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM971 600l141 -141l-71 -71l-141 141l-141 -141l-71 71l141 141l-141 141l71 71l141 -141l141 141l71 -71z" /> -<glyph unicode="" d="M0 800v-400h300l300 -200v800l-300 -200h-300zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M974 186l6 8q142 178 142 405q0 230 -144 408l-6 8l-83 -64l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8zM300 801l300 200v-800l-300 200h-300v400h300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257z" /> -<glyph unicode="" d="M100 700h400v100h100v100h-100v300h-500v-600h100v100zM1200 700v500h-600v-200h100v-300h200v-300h300v200h-200v100h200zM100 1100h300v-300h-300v300zM800 800v300h300v-300h-300zM200 900h100v100h-100v-100zM900 1000h100v-100h-100v100zM300 600h-100v-100h-200 v-500h500v500h-200v100zM900 200v-100h-200v100h-100v100h100v200h-200v100h300v-300h200v-100h-100zM400 400v-300h-300v300h300zM300 200h-100v100h100v-100zM1100 300h100v-100h-100v100zM600 100h100v-100h-100v100zM1200 100v-100h-300v100h300z" /> -<glyph unicode="" d="M100 1200h-100v-1000h100v1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 1200v-1000h-200v1000h200zM400 100v-100h-300v100h300zM500 91h100v-91h-100v91zM700 91h100v-91h-100v91zM1100 91v-91h-200v91h200z " /> -<glyph unicode="" d="M1200 500l-500 -500l-699 700v475q0 10 7.5 17.5t17.5 7.5h474zM320 882q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71t29 -71q30 -30 71.5 -30t71.5 30z" /> -<glyph unicode="" d="M1201 500l-500 -500l-699 700v475q0 11 7 18t18 7h474zM1501 500l-500 -500l-50 50l450 450l-700 700h100zM320 882q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71t30 -71q29 -30 71 -30t71 30z" /> -<glyph unicode="" d="M1200 1200v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900v1025l175 175h925z" /> -<glyph unicode="" d="M947 829l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18l-94 -346l40 -124h592zM1200 800v-700h-200v200h-800v-200h-200v700h200l100 -200h600l100 200h200zM881 176l38 -152q2 -10 -3.5 -17t-15.5 -7h-600q-10 0 -15.5 7t-3.5 17l38 152q2 10 11.5 17t19.5 7 h500q10 0 19.5 -7t11.5 -17z" /> -<glyph unicode="" d="M1200 0v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417zM416 521l178 457l46 -140l116 -317 h-340z" /> -<glyph unicode="" d="M100 1199h471q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111t-162 -38.5h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21 t-29 14t-49 14.5v70zM400 1079v-379h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400z" /> -<glyph unicode="" d="M877 1200l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425z" /> -<glyph unicode="" d="M1150 1200h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49v300h150h700zM100 1000v-800h75l-125 -167l-125 167h75v800h-75l125 167 l125 -167h-75z" /> -<glyph unicode="" d="M950 1201h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50v300h150h700zM200 101h800v75l167 -125l-167 -125v75h-800v-75l-167 125l167 125 v-75z" /> -<glyph unicode="" d="M700 950v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35zM1100 650v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1000 q21 0 35.5 15t14.5 35zM900 350v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M1000 950v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 650v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h1100 q21 0 35.5 15t14.5 35zM1000 350v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35zM1200 50v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35 t35.5 -15h1100q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35zM0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M400 1100h-100v-1100h100v1100zM700 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM1100 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM100 425v75h-201v100h201v75l166 -125zM900 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM1200 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> -<glyph unicode="" d="M201 950v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35zM801 1100h100v-1100h-100v1100zM601 650v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15 h500q20 0 35 15t15 35zM1101 425v75h200v100h-200v75l-167 -125zM401 350v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35zM701 50v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5 v-100q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35z" /> -<glyph unicode="" d="M900 925v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53zM1200 300l-300 300l300 300v-600z" /> -<glyph unicode="" d="M1200 1056v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31zM1100 1000h-1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500zM476 750q0 -56 -39 -95t-95 -39t-95 39t-39 95t39 95t95 39t95 -39 t39 -95z" /> -<glyph unicode="" d="M600 1213q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262q0 124 60.5 231.5t165 172t226.5 64.5zM599 514q107 0 182.5 75.5t75.5 182.5t-75.5 182 t-182.5 75t-182 -75.5t-75 -181.5q0 -107 75.5 -182.5t181.5 -75.5z" /> -<glyph unicode="" d="M600 1199q122 0 233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233t47.5 233t127.5 191t191 127.5t233 47.5zM600 173v854q-176 0 -301.5 -125t-125.5 -302t125.5 -302t301.5 -125z " /> -<glyph unicode="" d="M554 1295q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 138.5t-64 210.5q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5zM455 296q-7 6 -18 17 t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156q14 -82 59.5 -136t136.5 -80z" /> -<glyph unicode="" d="M1108 902l113 113l-21 85l-92 28l-113 -113zM1100 625v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125zM436 341l161 50l412 412l-114 113l-405 -405z" /> -<glyph unicode="" d="M1100 453v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5z M813 431l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209z" /> -<glyph unicode="" d="M1100 569v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5h300q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69z M625 348l566 567l-136 137l-430 -431l-147 147l-136 -136z" /> -<glyph unicode="" d="M900 303v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198l-300 300l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296z" /> -<glyph unicode="" d="M900 0l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100z" /> -<glyph unicode="" d="M1200 0l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100z" /> -<glyph unicode="" d="M1200 0l-500 488v-488l-564 550l564 550v-487l500 487v-1100z" /> -<glyph unicode="" d="M1100 550l-900 550v-1100z" /> -<glyph unicode="" d="M500 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM900 150v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -21 14.5 -35.5t35.5 -14.5h200 q21 0 35.5 14.5t14.5 35.5z" /> -<glyph unicode="" d="M1100 150v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35z" /> -<glyph unicode="" d="M500 0v488l-500 -488v1100l500 -487v487l564 -550z" /> -<glyph unicode="" d="M1050 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488l-500 -488v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5z" /> -<glyph unicode="" d="M650 1064l-550 -564h1100zM1200 350v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" /> -<glyph unicode="" d="M777 7l240 240l-353 353l353 353l-240 240l-592 -594z" /> -<glyph unicode="" d="M513 -46l-241 240l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-200h-200v-200h200v-200h200v200h200v200h-200v200h-200z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM300 700v-200h600v200h-600z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM247 741l141 -141l-142 -141l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141 l-141 142z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM546 623l-102 102l-174 -174l276 -277l411 411l-175 174z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 500h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3 q-105 0 -172 -56t-67 -183h144q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5zM500 400v-100h200v100h-200z" /> -<glyph unicode="" d="M600 1197q162 0 299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5t80 299.5t217.5 217.5t299.5 80zM500 900v-100h200v100h-200zM400 700v-100h100v-200h-100v-100h400v100h-100v300h-300z" /> -<glyph unicode="" d="M1200 700v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194v200h194q15 60 36 104.5t55.5 86t88 69t126.5 40.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203zM700 500v-206q149 48 201 206h-201v200h200 q-25 74 -76 127.5t-124 76.5v-204h-200v203q-75 -24 -130 -77.5t-79 -125.5h209v-200h-210q24 -73 79.5 -127.5t130.5 -78.5v206h200z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM844 735 l-135 -135l135 -135l-109 -109l-135 135l-135 -135l-109 109l135 135l-135 135l109 109l135 -135l135 135z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM896 654 l-346 -345l-228 228l141 141l87 -87l204 205z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM248 385l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5q0 -115 62 -215zM955 809l-564 -564q97 -59 209 -59q171 0 292.5 121.5 t121.5 292.5q0 112 -59 209z" /> -<glyph unicode="" d="M1200 400h-600v-301l-600 448l600 453v-300h600v-300z" /> -<glyph unicode="" d="M600 400h-600v300h600v300l600 -453l-600 -448v301z" /> -<glyph unicode="" d="M1098 600h-298v-600h-300v600h-296l450 600z" /> -<glyph unicode="" d="M998 600l-449 -600l-445 600h296v600h300v-600h298z" /> -<glyph unicode="" d="M600 199v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453z" /> -<glyph unicode="" d="M1200 1200h-400l129 -129l-294 -294l142 -142l294 294l129 -129v400zM565 423l-294 -294l129 -129h-400v400l129 -129l294 294z" /> -<glyph unicode="" d="M871 730l129 -130h-400v400l129 -129l295 295l142 -141zM200 600h400v-400l-129 130l-295 -295l-142 141l295 295z" /> -<glyph unicode="" d="M600 1177q118 0 224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5t45.5 224.5t123 184t184 123t224.5 45.5zM686 549l58 302q4 20 -8 34.5t-33 14.5h-207q-20 0 -32 -14.5t-8 -34.5 l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5zM700 400h-200v-100h200v100z" /> -<glyph unicode="" d="M1200 900h-111v6t-1 15t-3 18l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6h-111v-100h100v-200h400v300h200v-300h400v200h100v100z M731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269zM481 900h-281q-3 0 14 48t35 96l18 47zM100 0h400v400h-400v-400zM700 400h400v-400h-400v400z" /> -<glyph unicode="" d="M0 121l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55l-201 -202 v143zM692 611q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5t86.5 76.5q55 66 367 234z" /> -<glyph unicode="" d="M1261 600l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5 t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30zM600 240q64 0 123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212 q0 85 46 158q-102 -87 -226 -258q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5zM484 762l-107 -106q49 -124 154 -191l105 105q-37 24 -75 72t-57 84z" /> -<glyph unicode="" d="M906 1200l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43l-26 40l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148zM1261 600l-26 -40q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5 t-124 -100t-146.5 -79l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52zM513 264l37 141q-107 18 -178.5 101.5t-71.5 193.5q0 85 46 158q-102 -87 -226 -258q210 -282 393 -336z M484 762l-107 -106q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68z" /> -<glyph unicode="" d="M-47 0h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 33 -48 36t-48 -29l-642 -1066q-21 -32 -7.5 -66t50.5 -34zM700 200v100h-200v-100h-345l445 723l445 -723h-345zM700 700h-200v-100l100 -300l100 300v100z" /> -<glyph unicode="" d="M800 711l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -21 -13 -29t-32 1l-94 78h-222l-94 -78q-19 -9 -32 -1t-13 29v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41q0 20 11 44.5t26 38.5 l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339z" /> -<glyph unicode="" d="M941 800l-600 -600h-341v200h259l600 600h241v198l300 -295l-300 -300v197h-159zM381 678l141 142l-181 180h-341v-200h259zM1100 598l300 -295l-300 -300v197h-241l-181 181l141 142l122 -123h159v198z" /> -<glyph unicode="" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" /> -<glyph unicode="" d="M400 900h-300v300h300v-300zM1100 900h-300v300h300v-300zM1100 800v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5t-58 109.5t-31.5 116t-15 104t-3 83v200h300v-250q0 -113 6 -145 q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300z" /> -<glyph unicode="" d="M902 184l226 227l-578 579l-580 -579l227 -227l352 353z" /> -<glyph unicode="" d="M650 218l578 579l-226 227l-353 -353l-352 353l-227 -227z" /> -<glyph unicode="" d="M1198 400v600h-796l215 -200h381v-400h-198l299 -283l299 283h-200zM-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196z" /> -<glyph unicode="" d="M1050 1200h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35 q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43l-100 475q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5z" /> -<glyph unicode="" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" /> -<glyph unicode="" d="M201 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000zM1501 700l-300 -700h-1200l300 700h1200z" /> -<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> -<glyph unicode="" d="M900 303v197h-600v-197l-300 297l300 298v-198h600v198l300 -298z" /> -<glyph unicode="" d="M31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM100 300h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM900 200h-100v-100h100v100z M1100 200h-100v-100h100v100z" /> -<glyph unicode="" d="M1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35zM325 800l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35q-56 337 -56 351v250v5 q0 13 0.5 18.5t2.5 13t8 10.5t15 3h200zM-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5z" /> -<glyph unicode="" d="M445 1180l-45 -233l-224 78l78 -225l-233 -44l179 -156l-179 -155l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180z" /> -<glyph unicode="" d="M700 1200h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400q0 -75 100 -75h61q123 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5zM700 925l-50 -225h450 v-125l-250 -375h-214l-136 100h-100v375l150 212l100 213h50v-175zM0 800v-600h200v600h-200z" /> -<glyph unicode="" d="M700 0h-50q-27 0 -51 20t-38 48l-96 198l-145 196q-20 26 -20 63v400q0 75 100 75h61q123 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5zM200 400h-200v600h200 v-600zM700 275l-50 225h450v125l-250 375h-214l-136 -100h-100v-375l150 -212l100 -213h50v175z" /> -<glyph unicode="" d="M364 873l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM408 792v-503 l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83zM208 200h-200v600h200v-600z" /> -<glyph unicode="" d="M475 1104l365 -230q7 -4 16.5 -10.5t26 -26t16.5 -36.5v-526q0 -13 -85.5 -93.5t-93.5 -80.5h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-84 0 -139 39t-55 111t54 110t139 37h302l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6zM370 946 l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100h222q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l106 89v502l-342 237zM1199 201h-200v600h200v-600z" /> -<glyph unicode="" d="M1100 473v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90zM911 400h-503l-236 339 l83 86l183 -146q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6v7.5v7v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294zM1000 200v-200h-600v200h600z" /> -<glyph unicode="" d="M305 1104v200h600v-200h-600zM605 310l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15l-230 -362q-15 -31 7 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85l-1 -302q0 -84 38.5 -138t110.5 -54t111 55t39 139v106z M905 804v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146l-83 86l237 339h503z" /> -<glyph unicode="" d="M603 1195q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM598 701h-298v-201h300l-2 -194l402 294l-402 298v-197z" /> -<glyph unicode="" d="M597 1195q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5zM200 600l400 -294v194h302v201h-300v197z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM500 900v-300h-200l300 -400l300 400h-200v300h-200z" /> -<glyph unicode="" d="M603 1195q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5zM627 1101q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6 q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55 t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q102 -2 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7 q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5 t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 41 1 44q31 -13 58.5 -14.5t39.5 3.5l11 4q6 36 -17 53.5t-64 28.5t-56 23q-19 -3 -37 0zM613 994q0 -18 8 -42.5t16.5 -44t9.5 -23.5q-9 2 -31 5t-36 5t-32 8t-30 14q3 12 16 30t16 25q10 -10 18.5 -10 t14 6t14.5 14.5t16 12.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " /> -<glyph unicode="" d="M1100 1200v-100h-1000v100h1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> -<glyph unicode="" d="M329 729l142 142l-200 200l129 129h-400v-400l129 129zM1200 1200v-400l-129 129l-200 -200l-142 142l200 200l-129 129h400zM271 129l129 -129h-400v400l129 -129l200 200l142 -142zM1071 271l129 129v-400h-400l129 129l-200 200l142 142z" /> -<glyph unicode="" d="M596 1192q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1010q-171 0 -292.5 -121.5t-121.5 -292.5q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5zM455 905 q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5t16 38.5t39 16.5zM708 821l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5 q0 32 20.5 56.5t51.5 29.5zM855 709q23 0 38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39q0 22 16 38t39 16zM345 709q23 0 39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39t15.5 38.5t38.5 15.5z" /> -<glyph unicode="" d="M649 54l-16 22q-90 125 -293 323q-71 70 -104.5 105.5t-77 89.5t-61 99t-17.5 91q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-203 -198 -293 -323zM844 524l12 12 q64 62 97.5 97t64.5 79t31 72q0 71 -48 119t-105 48q-74 0 -132 -82l-118 -171l-114 174q-51 79 -123 79q-60 0 -109.5 -49t-49.5 -118q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203z" /> -<glyph unicode="" d="M476 406l19 -17l105 105l-212 212l389 389l247 -247l-95 -96l18 -18q46 -46 77 -99l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159q0 -93 66 -159zM123 193l141 -141q66 -66 159 -66q95 0 159 66 l283 283q66 66 66 159t-66 159l-141 141q-12 12 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159q0 -94 66 -160z" /> -<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM900 1000h-600v-700h600v700zM600 46q43 0 73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5t-73.5 -30.5t-30.5 -73.5 t30.5 -73.5t73.5 -30.5z" /> -<glyph unicode="" d="M700 1029v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5h139q5 -77 48.5 -126.5t117.5 -64.5v335l-27 7q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5 t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5zM600 755v274q-61 -8 -97.5 -37.5t-36.5 -102.5q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3zM700 548 v-311q170 18 170 151q0 64 -44 99.5t-126 60.5z" /> -<glyph unicode="" d="M866 300l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5t-30 142.5h-221v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5 t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -11 2.5 -24.5t5.5 -24t9.5 -26.5t10.5 -25t14 -27.5t14 -25.5t15.5 -27t13.5 -24h242v-100h-197q8 -50 -2.5 -115t-31.5 -94 q-41 -59 -99 -113q35 11 84 18t70 7q32 1 102 -16t104 -17q76 0 136 30z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1200l298 -300h-198v-900h-200v900h-198z" /> -<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-500h-100v100h-100v-100h-100v500h300zM901 1100h-100v-200h100v200zM700 500h300v-200h-99v-100h-100v100h99v100h-200v100zM800 100h200v-100h-300v200h100v-100z" /> -<glyph unicode="" d="M400 300h198l-298 -300l-298 300h198v900h200v-900zM1000 1200v-200h-99v-100h-100v100h99v100h-200v100h300zM800 800h200v-100h-300v200h100v-100zM700 500h300v-500h-100v100h-100v-100h-100v500zM801 200h100v200h-100v-200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1100h-100v100h200v-500h-100v400zM1100 500v-500h-100v100h-200v400h300zM1001 400h-100v-200h100v200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1100 1200v-500h-100v100h-200v400h300zM1001 1100h-100v-200h100v200zM900 400h-100v100h200v-500h-100v400z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" /> -<glyph unicode="" d="M300 0l298 300h-198v900h-200v-900h-198zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" /> -<glyph unicode="" d="M400 1100h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5v300q0 165 117.5 282.5t282.5 117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5z" /> -<glyph unicode="" d="M700 0h-300q-163 0 -281.5 117.5t-118.5 282.5v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5 t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5zM400 800v-500l333 250z" /> -<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM800 700h-500l250 -333z" /> -<glyph unicode="" d="M1100 700v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5zM900 300v500q0 41 -29.5 70.5t-70.5 29.5h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5 t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5zM550 733l-250 -333h500z" /> -<glyph unicode="" d="M500 1100h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200zM700 550l-400 -350v200h-300v300h300v200z" /> -<glyph unicode="" d="M403 2l9 -1q13 0 26 16l538 630q15 19 6 36q-8 18 -32 16h-300q1 4 78 219.5t79 227.5q2 17 -6 27l-8 8h-9q-16 0 -25 -15q-4 -5 -98.5 -111.5t-228 -257t-209.5 -238.5q-17 -19 -7 -40q10 -19 32 -19h302q-155 -438 -160 -458q-5 -21 4 -32z" /> -<glyph unicode="" d="M800 200h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185zM900 200v200h-300v300h300v200l400 -350z" /> -<glyph unicode="" d="M1200 700l-149 149l-342 -353l-213 213l353 342l-149 149h500v-500zM1022 571l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5v-300 q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM600 794 q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" /> -<glyph unicode="" d="M700 800v400h-300v-400h-300l445 -500l450 500h-295zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M400 700v-300h300v300h295l-445 500l-450 -500h300zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M405 400l596 596l-154 155l-442 -442l-150 151l-155 -155zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M409 1103l-97 97l-212 -212l97 -98zM650 861l-149 149l-212 -212l149 -149l-238 -248h700v699zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M539 950l-149 -149l212 -212l149 148l248 -237v700h-699zM297 709l-97 -97l212 -212l98 97zM25 300h1048q11 0 19 -7.5t8 -17.5v-275h-1100v275q0 11 7 18t18 7zM1000 200h-100v-50h100v50z" /> -<glyph unicode="" d="M1200 1199v-1079l-475 272l-310 -393v416h-392zM1166 1148l-672 -712v-226z" /> -<glyph unicode="" d="M1100 1000v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1200h-100v-200h100v200z" /> -<glyph unicode="" d="M578 500h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120zM700 1200h-100v-200h100v200zM1300 538l-475 -476l-244 244l123 123l120 -120l353 352z" /> -<glyph unicode="" d="M529 500h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170zM700 1200h-100v-200h100v200zM1167 6l-170 170l-170 -170l-127 127l170 170l-170 170l127 127l170 -170l170 170l127 -128 l-170 -169l170 -170z" /> -<glyph unicode="" d="M700 500h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200zM700 1000h-100v200h100v-200zM1000 600h-200v-300h-200l300 -300l300 300h-200v300z" /> -<glyph unicode="" d="M602 500h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200zM700 1000h-100v200h100v-200zM1000 300h200l-300 300l-300 -300h200v-300h200v300z" /> -<glyph unicode="" d="M1200 900v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1200zM0 800v-550q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200zM100 500h400v-200h-400v200z" /> -<glyph unicode="" d="M500 1000h400v198l300 -298l-300 -298v198h-400v200zM100 800v200h100v-200h-100zM400 800h-100v200h100v-200zM700 300h-400v-198l-300 298l300 298v-198h400v-200zM800 500h100v-200h-100v200zM1000 500v-200h100v200h-100z" /> -<glyph unicode="" d="M1200 50v1106q0 31 -18 40.5t-44 -7.5l-276 -117q-25 -16 -43.5 -50.5t-18.5 -65.5v-359q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5zM550 1200l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447l-100 203v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300z" /> -<glyph unicode="" d="M1100 106v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394 q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5z" /> -<glyph unicode="" d="M675 1000l-100 100h-375l-100 -100h400l200 -200v-98l295 98h105v200h-425zM500 300v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5zM100 800h300v-200h-300v200zM700 565l400 133 v-163l-400 -133v163zM100 500h300v-200h-300v200zM805 300l295 98v-298h-425l-100 -100h-375l-100 100h400l200 200h105z" /> -<glyph unicode="" d="M179 1169l-162 -162q-1 -11 -0.5 -32.5t16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q16 17 13 40.5t-22 37.5l-192 136q-19 14 -45 12t-42 -19l-119 -118q-143 103 -267 227q-126 126 -227 268l118 118 q17 17 20 41.5t-11 44.5l-139 194q-14 19 -36.5 22t-40.5 -14z" /> -<glyph unicode="" d="M1200 712v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40t-53.5 -36.5t-31 -27.5l-9 -10v-200q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38 t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5zM800 650l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -15 -35.5t-35 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5 t30 -27.5t12 -24l1 -10v-50z" /> -<glyph unicode="" d="M175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250zM1200 100v-100h-1100v100h1100z" /> -<glyph unicode="" d="M600 1100h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300v1000q0 41 29.5 70.5t70.5 29.5zM1000 800h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300v700q0 41 29.5 70.5t70.5 29.5zM400 0v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400h300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM400 600h-100v200h-100v-500h100v200h100v-200h100v500h-100v-200zM800 800h-200v-500h200v100h100v300h-100 v100zM800 700v-300h-100v300h100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-500h300v100h-200v300h200v100h-300zM600 800v-500h300v100h-200v300h200v100h-300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM500 700l-300 -150l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM900 800v-500h-700v500h700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM800 700h-130 q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM200 800v-300h200v-100h-200v-100h300v300h-200v100h200v100h-300zM800 300h100v500h-200v-100h100v-400z M601 300h100v100h-100v-100z" /> -<glyph unicode="" d="M1200 800v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212zM1000 900h-900v-700h900v700zM300 700v100h-100v-500h300v400h-200zM800 300h100v500h-200v-100h100v-400zM401 400h-100v200h100v-200z M601 300h100v100h-100v-100z" /> -<glyph unicode="" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM1000 900h-900v-700h900v700zM400 700h-200v100h300v-300h-99v-100h-100v100h99v200zM800 700h-100v100h200v-500h-100v400zM201 400h100v-100 h-100v100zM701 300h-100v100h100v-100z" /> -<glyph unicode="" d="M600 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM600 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700h-300 v-200h300v-100h-300l-100 100v200l100 100h300v-100z" /> -<glyph unicode="" d="M596 1196q162 0 299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299t80 299t217 217t299 80zM596 1014q-171 0 -292.5 -121.5t-121.5 -292.5t121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5zM800 700v-100 h-100v100h-200v-100h200v-100h-200v-100h-100v400h300zM800 400h-100v100h100v-100z" /> -<glyph unicode="" d="M800 300h128q120 0 205 86t85 208q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h222v300h400v-300zM700 200h200l-300 -300 l-300 300h200v300h200v-300z" /> -<glyph unicode="" d="M600 714l403 -403q94 26 154.5 104t60.5 178q0 121 -85 207.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5q0 -80 56.5 -137t135.5 -57h8zM700 -100h-200v300h-200l300 300 l300 -300h-200v-300z" /> -<glyph unicode="" d="M700 200h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-155l-75 -45h350l-75 45v155z" /> -<glyph unicode="" d="M700 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -12t1 -11q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5 q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350z" /> -<glyph unicode="💼" d="M800 1000h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100zM500 1000h200v100h-200v-100zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" /> -<glyph unicode="📅" d="M1100 900v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150h1100zM0 800v-750q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100zM100 600h100v-100h-100v100zM300 600h100v-100h-100v100z M500 600h100v-100h-100v100zM700 600h100v-100h-100v100zM900 600h100v-100h-100v100zM100 400h100v-100h-100v100zM300 400h100v-100h-100v100zM500 400h100v-100h-100v100zM700 400h100v-100h-100v100zM900 400h100v-100h-100v100zM100 200h100v-100h-100v100zM300 200 h100v-100h-100v100zM500 200h100v-100h-100v100zM700 200h100v-100h-100v100zM900 200h100v-100h-100v100z" /> -<glyph unicode="📌" d="M902 1185l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207l-380 -303l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15z" /> -<glyph unicode="📎" d="M518 119l69 -60l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163t35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84 t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -79.5 -17t-67.5 -51l-388 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348 q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256z" /> -<glyph unicode="📷" d="M1200 200v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5z M1000 700h-100v100h100v-100zM844 500q0 -100 -72 -172t-172 -72t-172 72t-72 172t72 172t172 72t172 -72t72 -172zM706 500q0 44 -31 75t-75 31t-75 -31t-31 -75t31 -75t75 -31t75 31t31 75z" /> -<glyph unicode="🔒" d="M900 800h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> -<glyph unicode="🔔" d="M1062 400h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-22 -9 -63 -23t-167.5 -37t-251.5 -23t-245.5 20.5t-178.5 41.5l-58 20q-18 7 -31 27.5t-13 40.5q0 21 13.5 35.5t33.5 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94 q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327zM600 104q-54 0 -103 6q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6z" /> -<glyph unicode="🔖" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> -<glyph unicode="🔥" d="M400 755q2 -12 8 -41.5t8 -43t6 -39.5t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85t5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5 q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129 q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5z" /> -<glyph unicode="🔧" d="M948 778l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index be784dc1d5bcb92ab155f578f3723524a3dd9688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29512 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%0DQ&GeghWoFLr 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 DlhOCh diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 2cc3e4852a5a42e6aadd6284e067b66e14a57bc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16448 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 SpmL}^|C{CHXC=u2fd30xD#Mci diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js deleted file mode 100644 index 2c64257146c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.js +++ /dev/null @@ -1,1999 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if (!jQuery) { throw new Error("Bootstrap requires jQuery") } - -/* ======================================================================== - * Bootstrap: transition.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#transitions - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - 'WebkitTransition' : 'webkitTransitionEnd' - , 'MozTransition' : 'transitionend' - , 'OTransition' : 'oTransitionEnd otransitionend' - , 'transition' : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false, $el = this - $(this).one($.support.transition.end, function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#alerts - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - $parent.trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one($.support.transition.end, removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - var old = $.fn.alert - - $.fn.alert = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#buttons - * ======================================================================== - * Copyright 2013 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - } - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (!data.resetText) $el.data('resetText', $el[val]()) - - $el[val](data[state] || this.options[state]) - - // push to event loop to allow forms to submit - setTimeout(function () { - state == 'loadingText' ? - $el.addClass(d).attr(d, d) : - $el.removeClass(d).removeAttr(d); - }, 0) - } - - Button.prototype.toggle = function () { - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - .prop('checked', !this.$element.hasClass('active')) - .trigger('change') - if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') - } - - this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - var old = $.fn.button - - $.fn.button = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - $btn.button('toggle') - e.preventDefault() - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#carousel - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter', $.proxy(this.pause, this)) - .on('mouseleave', $.proxy(this.cycle, this)) - } - - Carousel.DEFAULTS = { - interval: 5000 - , pause: 'hover' - , wrap: true - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getActiveIndex = function () { - this.$active = this.$element.find('.item.active') - this.$items = this.$active.parent().children() - - return this.$items.index(this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getActiveIndex() - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition.end) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - this.sliding = true - - isCycling && this.pause() - - var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) - - if ($next.hasClass('active')) return - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - this.$element.one('slid', function () { - var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) - $nextIndicator && $nextIndicator.addClass('active') - }) - } - - if ($.support.transition && this.$element.hasClass('slide')) { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one($.support.transition.end, function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { that.$element.trigger('slid') }, 0) - }) - .emulateTransitionEnd(600) - } else { - this.$element.trigger(e) - if (e.isDefaultPrevented()) return - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger('slid') - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - var old = $.fn.carousel - - $.fn.carousel = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var $this = $(this), href - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - $target.carousel(options) - - if (slideIndex = $this.attr('data-slide-to')) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - $carousel.carousel($carousel.data()) - }) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#collapse - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - actives.collapse('hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing') - [dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('in') - [dimension]('auto') - this.transitioning = 0 - this.$element.trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - [dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element - [dimension](this.$element[dimension]()) - [0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one($.support.transition.end, $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - var old = $.fn.collapse - - $.fn.collapse = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { - var $this = $(this), href - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - $target.collapse(option) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#dropdowns - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle=dropdown]' - var Dropdown = function (element) { - var $el = $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } - - $parent.trigger(e = $.Event('show.bs.dropdown')) - - if (e.isDefaultPrevented()) return - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown') - - $this.focus() - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).focus() - return $this.click() - } - - var $items = $('[role=menu] li:not(.divider):visible a', $parent) - - if (!$items.length) return - - var index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index=0 - - $items.eq(index).focus() - } - - function clearMenus() { - $(backdrop).remove() - $(toggle).each(function (e) { - var $parent = getParent($(this)) - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown')) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown') - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - var old = $.fn.dropdown - - $.fn.dropdown = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('dropdown') - - if (!data) $this.data('dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api' , toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu]' , Dropdown.prototype.keydown) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#modals - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$element = $(element) - this.$backdrop = - this.isShown = null - - if (this.options.remote) this.$element.load(this.options.remote) - } - - Modal.DEFAULTS = { - backdrop: true - , keyboard: true - , show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this[!this.isShown ? 'show' : 'hide'](_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.escape() - - this.$element.on('click.dismiss.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(document.body) // don't move modals dom position - } - - that.$element.show() - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$element.find('.modal-dialog') // wait for modal to slide in - .one($.support.transition.end, function () { - that.$element.focus().trigger(e) - }) - .emulateTransitionEnd(300) : - that.$element.focus().trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.escape() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - .off('click.dismiss.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one($.support.transition.end, $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.focus() - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.removeBackdrop() - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(document.body) - - this.$element.on('click.dismiss.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - $.support.transition && this.$element.hasClass('fade')? - this.$backdrop - .one($.support.transition.end, callback) - .emulateTransitionEnd(150) : - callback() - - } else if (callback) { - callback() - } - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - var old = $.fn.modal - - $.fn.modal = function (option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7 - var option = $target.data('modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - e.preventDefault() - - $target - .modal(option, this) - .one('hide', function () { - $this.is(':visible') && $this.focus() - }) - }) - - $(document) - .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') }) - .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = - this.options = - this.enabled = - this.timeout = - this.hoverState = - this.$element = null - - this.init('tooltip', element, options) - } - - Tooltip.DEFAULTS = { - animation: true - , placement: 'top' - , selector: false - , template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>' - , trigger: 'hover focus' - , title: '' - , delay: 0 - , html: false - , container: false - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focus' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'blur' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay - , hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.'+ this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - var $tip = this.tip() - - this.setContent() - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var $parent = this.$element.parent() - - var orgPlacement = placement - var docScroll = document.documentElement.scrollTop || document.body.scrollTop - var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth() - var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight() - var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left - - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' : - placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' : - placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - this.$element.trigger('shown.bs.' + this.type) - } - } - - Tooltip.prototype.applyPlacement = function(offset, placement) { - var replace - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top = offset.top + marginTop - offset.left = offset.left + marginLeft - - $tip - .offset(offset) - .addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - replace = true - offset.top = offset.top + height - actualHeight - } - - if (/bottom|top/.test(placement)) { - var delta = 0 - - if (offset.left < 0) { - delta = offset.left * -2 - offset.left = 0 - - $tip.offset(offset) - - actualWidth = $tip[0].offsetWidth - actualHeight = $tip[0].offsetHeight - } - - this.replaceArrow(delta - width + actualWidth, actualWidth, 'left') - } else { - this.replaceArrow(actualHeight - height, actualHeight, 'top') - } - - if (replace) $tip.offset(offset) - } - - Tooltip.prototype.replaceArrow = function(delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + "%") : '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function () { - var that = this - var $tip = this.tip() - var e = $.Event('hide.bs.' + this.type) - - function complete() { - if (that.hoverState != 'in') $tip.detach() - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one($.support.transition.end, complete) - .emulateTransitionEnd(150) : - complete() - - this.$element.trigger('hidden.bs.' + this.type) - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function () { - var el = this.$element[0] - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : { - width: el.offsetWidth - , height: el.offsetHeight - }, this.$element.offset()) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.tip = function () { - return this.$tip = this.$tip || $(this.options.template) - } - - Tooltip.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow') - } - - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - - Tooltip.prototype.destroy = function () { - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - var old = $.fn.tooltip - - $.fn.tooltip = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#popovers - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.DEFAULTS = $.extend({} , $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right' - , trigger: 'click' - , content: '' - , template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content')[this.options.html ? 'html' : 'text'](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return this.$arrow = this.$arrow || this.tip().find('.arrow') - } - - Popover.prototype.tip = function () { - if (!this.$tip) this.$tip = $(this.options.template) - return this.$tip - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - var old = $.fn.popover - - $.fn.popover = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#scrollspy - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - var href - var process = $.proxy(this.process, this) - - this.$element = $(element).is('body') ? $(window) : $(element) - this.$body = $('body') - this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.offsets = $([]) - this.targets = $([]) - this.activeTarget = null - - this.refresh() - this.process() - } - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.refresh = function () { - var offsetMethod = this.$element[0] == window ? 'offset' : 'position' - - this.offsets = $([]) - this.targets = $([]) - - var self = this - var $targets = this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#\w/.test(href) && $(href) - - return ($href - && $href.length - && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight - var maxScroll = scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) && this.activate(i) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - $(this.selector) - .parents('.active') - .removeClass('active') - - var selector = this.selector - + '[data-target="' + target + '"],' - + this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - $spy.scrollspy($spy.data()) - }) - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#tabs - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - this.element = $(element) - } - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.parent('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown.bs.tab' - , relatedTarget: previous - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active - .one($.support.transition.end, next) - .emulateTransitionEnd(150) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - var old = $.fn.tab - - $.fn.tab = function ( option ) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - $(this).tab('show') - }) - -}(window.jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.0.0 - * http://twbs.github.com/bootstrap/javascript.html#affix - * ======================================================================== - * Copyright 2012 Twitter, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ======================================================================== */ - - -+function ($) { "use strict"; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - this.$window = $(window) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = null - - this.checkPosition() - } - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0 - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$window.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top() - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom() - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin) this.$element.css('top', '') - - this.affixed = affix - this.unpin = affix == 'bottom' ? position.top - scrollTop : null - - this.$element.removeClass(Affix.RESET).addClass('affix' + (affix ? '-' + affix : '')) - - if (affix == 'bottom') { - this.$element.offset({ top: document.body.offsetHeight - offsetBottom - this.$element.height() }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - var old = $.fn.affix - - $.fn.affix = function (option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - $spy.affix(data) - }) - }) - -}(window.jQuery); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js deleted file mode 100644 index 1765631f41f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/bootstrap3/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css deleted file mode 100644 index 520064cfe9e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/button.css +++ /dev/null @@ -1,54 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - border-bottom: 1px solid #222; - margin.left: 5; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js deleted file mode 100644 index 0b4ea58fdb3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/d3.v2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function e(e,t){try{for(var n in t)Object.defineProperty(e.prototype,n,{value:t[n],enumerable:!1})}catch(r){e.prototype=t}}function t(e){var t=-1,n=e.length,r=[];while(++t<n)r.push(e[t]);return r}function n(e){return Array.prototype.slice.call(e)}function r(){}function i(e){return e}function s(){return this}function o(){return!0}function u(e){return typeof e=="function"?e:function(){return e}}function a(e,t,n){return function(){var r=n.apply(t,arguments);return arguments.length?e:r}}function f(e){return e!=null&&!isNaN(e)}function l(e){return e.length}function c(e){return e==null}function h(e){return e.trim().replace(/\s+/g," ")}function p(e){var t=1;while(e*t%1)t*=10;return t}function d(){}function v(e){function t(){var t=n,r=-1,i=t.length,s;while(++r<i)(s=t[r].on)&&s.apply(this,arguments);return e}var n=[],i=new r;return t.on=function(t,r){var s=i.get(t),o;return arguments.length<2?s&&s.on:(s&&(s.on=null,n=n.slice(0,o=n.indexOf(s)).concat(n.slice(o+1)),i.remove(t)),r&&n.push(i.set(t,{on:r})),e)},t}function m(e,t){return t-(e?1+Math.floor(Math.log(e+Math.pow(10,1+Math.floor(Math.log(e)/Math.LN10)-t))/Math.LN10):1)}function g(e){return e+""}function y(e){var t=e.lastIndexOf("."),n=t>=0?e.substring(t):(t=e.length,""),r=[];while(t>0)r.push(e.substring(t-=3,t+3));return r.reverse().join(",")+n}function b(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function w(e){return function(t){return t<=0?0:t>=1?1:e(t)}}function E(e){return function(t){return 1-e(1-t)}}function S(e){return function(t){return.5*(t<.5?e(2*t):2-e(2-2*t))}}function x(e){return e}function T(e){return function(t){return Math.pow(t,e)}}function N(e){return 1-Math.cos(e*Math.PI/2)}function C(e){return Math.pow(2,10*(e-1))}function k(e){return 1-Math.sqrt(1-e*e)}function L(e,t){var n;return arguments.length<2&&(t=.45),arguments.length<1?(e=1,n=t/4):n=t/(2*Math.PI)*Math.asin(1/e),function(r){return 1+e*Math.pow(2,10*-r)*Math.sin((r-n)*2*Math.PI/t)}}function A(e){return e||(e=1.70158),function(t){return t*t*((e+1)*t-e)}}function O(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function M(){d3.event.stopPropagation(),d3.event.preventDefault()}function _(){var e=d3.event,t;while(t=e.sourceEvent)e=t;return e}function D(e){var t=new d,n=0,r=arguments.length;while(++n<r)t[arguments[n]]=v(t);return t.of=function(n,r){return function(i){try{var s=i.sourceEvent=d3.event;i.target=e,d3.event=i,t[i.type].apply(n,r)}finally{d3.event=s}}},t}function P(e){var t=[e.a,e.b],n=[e.c,e.d],r=B(t),i=H(t,n),s=B(j(n,t,-i))||0;t[0]*n[1]<n[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-n[0],n[1]))*ls,this.translate=[e.e,e.f],this.scale=[r,s],this.skew=s?Math.atan2(i,s)*ls:0}function H(e,t){return e[0]*t[0]+e[1]*t[1]}function B(e){var t=Math.sqrt(H(e,e));return t&&(e[0]/=t,e[1]/=t),t}function j(e,t,n){return e[0]+=n*t[0],e[1]+=n*t[1],e}function F(e){return e=="transform"?d3.interpolateTransform:d3.interpolate}function I(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return(n-e)*t}}function q(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return Math.max(0,Math.min(1,(n-e)*t))}}function R(){}function U(e,t,n){return new z(e,t,n)}function z(e,t,n){this.r=e,this.g=t,this.b=n}function W(e){return e<16?"0"+Math.max(0,e).toString(16):Math.min(255,e).toString(16)}function X(e,t,n){var r=0,i=0,s=0,o,u,a;o=/([a-z]+)\((.*)\)/i.exec(e);if(o){u=o[2].split(",");switch(o[1]){case"hsl":return n(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(K(u[0]),K(u[1]),K(u[2]))}}return(a=ds.get(e))?t(a.r,a.g,a.b):(e!=null&&e.charAt(0)==="#"&&(e.length===4?(r=e.charAt(1),r+=r,i=e.charAt(2),i+=i,s=e.charAt(3),s+=s):e.length===7&&(r=e.substring(1,3),i=e.substring(3,5),s=e.substring(5,7)),r=parseInt(r,16),i=parseInt(i,16),s=parseInt(s,16)),t(r,i,s))}function V(e,t,n){var r=Math.min(e/=255,t/=255,n/=255),i=Math.max(e,t,n),s=i-r,o,u,a=(i+r)/2;return s?(u=a<.5?s/(i+r):s/(2-i-r),e==i?o=(t-n)/s+(t<n?6:0):t==i?o=(n-e)/s+2:o=(e-t)/s+4,o*=60):u=o=0,Q(o,u,a)}function $(e,t,n){e=J(e),t=J(t),n=J(n);var r=ut((.4124564*e+.3575761*t+.1804375*n)/ys),i=ut((.2126729*e+.7151522*t+.072175*n)/bs),s=ut((.0193339*e+.119192*t+.9503041*n)/ws);return nt(116*i-16,500*(r-i),200*(i-s))}function J(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function K(e){var t=parseFloat(e);return e.charAt(e.length-1)==="%"?Math.round(t*2.55):t}function Q(e,t,n){return new G(e,t,n)}function G(e,t,n){this.h=e,this.s=t,this.l=n}function Y(e,t,n){function r(e){return e>360?e-=360:e<0&&(e+=360),e<60?s+(o-s)*e/60:e<180?o:e<240?s+(o-s)*(240-e)/60:s}function i(e){return Math.round(r(e)*255)}var s,o;return e%=360,e<0&&(e+=360),t=t<0?0:t>1?1:t,n=n<0?0:n>1?1:n,o=n<=.5?n*(1+t):n+t-n*t,s=2*n-o,U(i(e+120),i(e),i(e-120))}function Z(e,t,n){return new et(e,t,n)}function et(e,t,n){this.h=e,this.c=t,this.l=n}function tt(e,t,n){return nt(n,Math.cos(e*=Math.PI/180)*t,Math.sin(e)*t)}function nt(e,t,n){return new rt(e,t,n)}function rt(e,t,n){this.l=e,this.a=t,this.b=n}function it(e,t,n){var r=(e+16)/116,i=r+t/500,s=r-n/200;return i=ot(i)*ys,r=ot(r)*bs,s=ot(s)*ws,U(at(3.2404542*i-1.5371385*r-.4985314*s),at(-0.969266*i+1.8760108*r+.041556*s),at(.0556434*i-.2040259*r+1.0572252*s))}function st(e,t,n){return Z(Math.atan2(n,t)/Math.PI*180,Math.sqrt(t*t+n*n),e)}function ot(e){return e>.206893034?e*e*e:(e-4/29)/7.787037}function ut(e){return e>.008856?Math.pow(e,1/3):7.787037*e+4/29}function at(e){return Math.round(255*(e<=.00304?12.92*e:1.055*Math.pow(e,1/2.4)-.055))}function ft(e){return Qi(e,ks),e}function lt(e){return function(){return Ss(e,this)}}function ct(e){return function(){return xs(e,this)}}function ht(e,t){function n(){this.removeAttribute(e)}function r(){this.removeAttributeNS(e.space,e.local)}function i(){this.setAttribute(e,t)}function s(){this.setAttributeNS(e.space,e.local,t)}function o(){var n=t.apply(this,arguments);n==null?this.removeAttribute(e):this.setAttribute(e,n)}function u(){var n=t.apply(this,arguments);n==null?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,n)}return e=d3.ns.qualify(e),t==null?e.local?r:n:typeof t=="function"?e.local?u:o:e.local?s:i}function pt(e){return new RegExp("(?:^|\\s+)"+d3.requote(e)+"(?:\\s+|$)","g")}function dt(e,t){function n(){var n=-1;while(++n<i)e[n](this,t)}function r(){var n=-1,r=t.apply(this,arguments);while(++n<i)e[n](this,r)}e=e.trim().split(/\s+/).map(vt);var i=e.length;return typeof t=="function"?r:n}function vt(e){var t=pt(e);return function(n,r){if(i=n.classList)return r?i.add(e):i.remove(e);var i=n.className,s=i.baseVal!=null,o=s?i.baseVal:i;r?(t.lastIndex=0,t.test(o)||(o=h(o+" "+e),s?i.baseVal=o:n.className=o)):o&&(o=h(o.replace(t," ")),s?i.baseVal=o:n.className=o)}}function mt(e,t,n){function r(){this.style.removeProperty(e)}function i(){this.style.setProperty(e,t,n)}function s(){var r=t.apply(this,arguments);r==null?this.style.removeProperty(e):this.style.setProperty(e,r,n)}return t==null?r:typeof t=="function"?s:i}function gt(e,t){function n(){delete this[e]}function r(){this[e]=t}function i(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}return t==null?n:typeof t=="function"?i:r}function yt(e){return{__data__:e}}function bt(e){return function(){return Cs(this,e)}}function wt(e){return arguments.length||(e=d3.ascending),function(t,n){return e(t&&t.__data__,n&&n.__data__)}}function Et(e,t,n){function r(){var t=this[s];t&&(this.removeEventListener(e,t,t.$),delete this[s])}function i(){function i(e){var n=d3.event;d3.event=e,u[0]=o.__data__;try{t.apply(o,u)}finally{d3.event=n}}var o=this,u=arguments;r.call(this),this.addEventListener(e,this[s]=i,i.$=n),i._=t}var s="__on"+e,o=e.indexOf(".");return o>0&&(e=e.substring(0,o)),t?i:r}function St(e,t){for(var n=0,r=e.length;n<r;n++)for(var i=e[n],s=0,o=i.length,u;s<o;s++)(u=i[s])&&t(u,s,n);return e}function xt(e){return Qi(e,As),e}function Tt(e,t,n){Qi(e,Os);var i=new r,s=d3.dispatch("start","end"),o=Fs;return e.id=t,e.time=n,e.tween=function(t,n){return arguments.length<2?i.get(t):(n==null?i.remove(t):i.set(t,n),e)},e.ease=function(t){return arguments.length?(o=typeof t=="function"?t:d3.ease.apply(d3,arguments),e):o},e.each=function(t,n){return arguments.length<2?Nt.call(e,t):(s.on(t,n),e)},d3.timer(function(r){return St(e,function(e,u,a){function f(r){return v.active>t?c():(v.active=t,i.forEach(function(t,n){(n=n.call(e,m,u))&&h.push(n)}),s.start.call(e,m,u),l(r)||d3.timer(l,0,n),1)}function l(n){if(v.active!==t)return c();var r=(n-p)/d,i=o(r),a=h.length;while(a>0)h[--a].call(e,i);if(r>=1)return c(),_s=t,s.end.call(e,m,u),_s=0,1}function c(){return--v.count||delete e.__transition__,1}var h=[],p=e.delay,d=e.duration,v=(e=e.node).__transition__||(e.__transition__={active:0,count:0}),m=e.__data__;++v.count,p<=r?f(r):d3.timer(f,p,n)})},0,n),e}function Nt(e){var t=_s,n=Fs,r=Bs,i=js;return _s=this.id,Fs=this.ease(),St(this,function(t,n,r){Bs=t.delay,js=t.duration,e.call(t=t.node,t.__data__,n,r)}),_s=t,Fs=n,Bs=r,js=i,this}function Ct(e,t,n){return n!=""&&Is}function kt(e,t){return d3.tween(e,F(t))}function Lt(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,e>=n.delay&&(n.flush=n.callback(e)),n=n.next;var r=At()-t;r>24?(isFinite(r)&&(clearTimeout(Ws),Ws=setTimeout(Lt,r)),zs=0):(zs=1,Xs(Lt))}function At(){var e=null,t=Us,n=Infinity;while(t)t.flush?(delete Rs[t.callback.id],t=e?e.next=t.next:Us=t.next):(n=Math.min(n,t.then+t.delay),t=(e=t).next);return n}function Ot(e,t){var n=e.ownerSVGElement||e;if(n.createSVGPoint){var r=n.createSVGPoint();if(Vs<0&&(window.scrollX||window.scrollY)){n=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var i=n[0][0].getScreenCTM();Vs=!i.f&&!i.e,n.remove()}return Vs?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(e.getScreenCTM().inverse()),[r.x,r.y]}var s=e.getBoundingClientRect();return[t.clientX-s.left-e.clientLeft,t.clientY-s.top-e.clientTop]}function Mt(){}function _t(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Dt(e){return e.rangeExtent?e.rangeExtent():_t(e.range())}function Pt(e,t){var n=0,r=e.length-1,i=e[n],s=e[r],o;s<i&&(o=n,n=r,r=o,o=i,i=s,s=o);if(t=t(s-i))e[n]=t.floor(i),e[r]=t.ceil(s);return e}function Ht(){return Math}function Bt(e,t,n,r){function i(){var i=Math.min(e.length,t.length)>2?zt:Ut,a=r?q:I;return o=i(e,t,a,n),u=i(t,e,a,d3.interpolate),s}function s(e){return o(e)}var o,u;return s.invert=function(e){return u(e)},s.domain=function(t){return arguments.length?(e=t.map(Number),i()):e},s.range=function(e){return arguments.length?(t=e,i()):t},s.rangeRound=function(e){return s.range(e).interpolate(d3.interpolateRound)},s.clamp=function(e){return arguments.length?(r=e,i()):r},s.interpolate=function(e){return arguments.length?(n=e,i()):n},s.ticks=function(t){return qt(e,t)},s.tickFormat=function(t){return Rt(e,t)},s.nice=function(){return Pt(e,Ft),i()},s.copy=function(){return Bt(e,t,n,r)},i()}function jt(e,t){return d3.rebind(e,t,"range","rangeRound","interpolate","clamp")}function Ft(e){return e=Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1),e&&{floor:function(t){return Math.floor(t/e)*e},ceil:function(t){return Math.ceil(t/e)*e}}}function It(e,t){var n=_t(e),r=n[1]-n[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),s=t/r*i;return s<=.15?i*=10:s<=.35?i*=5:s<=.75&&(i*=2),n[0]=Math.ceil(n[0]/i)*i,n[1]=Math.floor(n[1]/i)*i+i*.5,n[2]=i,n}function qt(e,t){return d3.range.apply(d3,It(e,t))}function Rt(e,t){return d3.format(",."+Math.max(0,-Math.floor(Math.log(It(e,t)[2])/Math.LN10+.01))+"f")}function Ut(e,t,n,r){var i=n(e[0],e[1]),s=r(t[0],t[1]);return function(e){return s(i(e))}}function zt(e,t,n,r){var i=[],s=[],o=0,u=Math.min(e.length,t.length)-1;e[u]<e[0]&&(e=e.slice().reverse(),t=t.slice().reverse());while(++o<=u)i.push(n(e[o-1],e[o])),s.push(r(t[o-1],t[o]));return function(t){var n=d3.bisect(e,t,1,u)-1;return s[n](i[n](t))}}function Wt(e,t){function n(n){return e(t(n))}var r=t.pow;return n.invert=function(t){return r(e.invert(t))},n.domain=function(i){return arguments.length?(t=i[0]<0?Vt:Xt,r=t.pow,e.domain(i.map(t)),n):e.domain().map(r)},n.nice=function(){return e.domain(Pt(e.domain(),Ht)),n},n.ticks=function(){var n=_t(e.domain()),i=[];if(n.every(isFinite)){var s=Math.floor(n[0]),o=Math.ceil(n[1]),u=r(n[0]),a=r(n[1]);if(t===Vt){i.push(r(s));for(;s++<o;)for(var f=9;f>0;f--)i.push(r(s)*f)}else{for(;s<o;s++)for(var f=1;f<10;f++)i.push(r(s)*f);i.push(r(s))}for(s=0;i[s]<u;s++);for(o=i.length;i[o-1]>a;o--);i=i.slice(s,o)}return i},n.tickFormat=function(e,i){arguments.length<2&&(i=$s);if(arguments.length<1)return i;var s=Math.max(.1,e/n.ticks().length),o=t===Vt?(u=-1e-12,Math.floor):(u=1e-12,Math.ceil),u;return function(e){return e/r(o(t(e)+u))<=s?i(e):""}},n.copy=function(){return Wt(e.copy(),t)},jt(n,e)}function Xt(e){return Math.log(e<0?0:e)/Math.LN10}function Vt(e){return-Math.log(e>0?0:-e)/Math.LN10}function $t(e,t){function n(t){return e(r(t))}var r=Jt(t),i=Jt(1/t);return n.invert=function(t){return i(e.invert(t))},n.domain=function(t){return arguments.length?(e.domain(t.map(r)),n):e.domain().map(i)},n.ticks=function(e){return qt(n.domain(),e)},n.tickFormat=function(e){return Rt(n.domain(),e)},n.nice=function(){return n.domain(Pt(n.domain(),Ft))},n.exponent=function(e){if(!arguments.length)return t;var s=n.domain();return r=Jt(t=e),i=Jt(1/t),n.domain(s)},n.copy=function(){return $t(e.copy(),t)},jt(n,e)}function Jt(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function Kt(e,t){function n(t){return o[((s.get(t)||s.set(t,e.push(t)))-1)%o.length]}function i(t,n){return d3.range(e.length).map(function(e){return t+n*e})}var s,o,u;return n.domain=function(i){if(!arguments.length)return e;e=[],s=new r;var o=-1,u=i.length,a;while(++o<u)s.has(a=i[o])||s.set(a,e.push(a));return n[t.t].apply(n,t.a)},n.range=function(e){return arguments.length?(o=e,u=0,t={t:"range",a:arguments},n):o},n.rangePoints=function(r,s){arguments.length<2&&(s=0);var a=r[0],f=r[1],l=(f-a)/(Math.max(1,e.length-1)+s);return o=i(e.length<2?(a+f)/2:a+l*s/2,l),u=0,t={t:"rangePoints",a:arguments},n},n.rangeBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=(c-l)/(e.length-s+2*a);return o=i(l+h*a,h),f&&o.reverse(),u=h*(1-s),t={t:"rangeBands",a:arguments},n},n.rangeRoundBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=Math.floor((c-l)/(e.length-s+2*a)),p=c-l-(e.length-s)*h;return o=i(l+Math.round(p/2),h),f&&o.reverse(),u=Math.round(h*(1-s)),t={t:"rangeRoundBands",a:arguments},n},n.rangeBand=function(){return u},n.rangeExtent=function(){return _t(t.a[0])},n.copy=function(){return Kt(e,t)},n.domain(e)}function Qt(e,t){function n(){var n=0,s=e.length,o=t.length;i=[];while(++n<o)i[n-1]=d3.quantile(e,n/o);return r}function r(e){return isNaN(e=+e)?NaN:t[d3.bisect(i,e)]}var i;return r.domain=function(t){return arguments.length?(e=t.filter(function(e){return!isNaN(e)}).sort(d3.ascending),n()):e},r.range=function(e){return arguments.length?(t=e,n()):t},r.quantiles=function(){return i},r.copy=function(){return Qt(e,t)},n()}function Gt(e,t,n){function r(t){return n[Math.max(0,Math.min(o,Math.floor(s*(t-e))))]}function i(){return s=n.length/(t-e),o=n.length-1,r}var s,o;return r.domain=function(n){return arguments.length?(e=+n[0],t=+n[n.length-1],i()):[e,t]},r.range=function(e){return arguments.length?(n=e,i()):n},r.copy=function(){return Gt(e,t,n)},i()}function Yt(e,t){function n(n){return t[d3.bisect(e,n)]}return n.domain=function(t){return arguments.length?(e=t,n):e},n.range=function(e){return arguments.length?(t=e,n):t},n.copy=function(){return Yt(e,t)},n}function Zt(e){function t(e){return+e}return t.invert=t,t.domain=t.range=function(n){return arguments.length?(e=n.map(t),t):e},t.ticks=function(t){return qt(e,t)},t.tickFormat=function(t){return Rt(e,t)},t.copy=function(){return Zt(e)},t}function en(e){return e.innerRadius}function tn(e){return e.outerRadius}function nn(e){return e.startAngle}function rn(e){return e.endAngle}function sn(e){function t(t){function o(){a.push("M",s(e(l),f))}var a=[],l=[],c=-1,h=t.length,p,d=u(n),v=u(r);while(++c<h)i.call(this,p=t[c],c)?l.push([+d.call(this,p,c),+v.call(this,p,c)]):l.length&&(o(),l=[]);return l.length&&o(),a.length?a.join(""):null}var n=on,r=un,i=o,s=an,a=s.key,f=.7;return t.x=function(e){return arguments.length?(n=e,t):n},t.y=function(e){return arguments.length?(r=e,t):r},t.defined=function(e){return arguments.length?(i=e,t):i},t.interpolate=function(e){return arguments.length?(typeof e=="function"?a=s=e:a=(s=eo.get(e)||an).key,t):a},t.tension=function(e){return arguments.length?(f=e,t):f},t}function on(e){return e[0]}function un(e){return e[1]}function an(e){return e.join("L")}function fn(e){return an(e)+"Z"}function ln(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("V",(r=e[t])[1],"H",r[0]);return i.join("")}function cn(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("H",(r=e[t])[0],"V",r[1]);return i.join("")}function hn(e,t){return e.length<4?an(e):e[1]+vn(e.slice(1,e.length-1),mn(e,t))}function pn(e,t){return e.length<3?an(e):e[0]+vn((e.push(e[0]),e),mn([e[e.length-2]].concat(e,[e[1]]),t))}function dn(e,t,n){return e.length<3?an(e):e[0]+vn(e,mn(e,t))}function vn(e,t){if(t.length<1||e.length!=t.length&&e.length!=t.length+2)return an(e);var n=e.length!=t.length,r="",i=e[0],s=e[1],o=t[0],u=o,a=1;n&&(r+="Q"+(s[0]-o[0]*2/3)+","+(s[1]-o[1]*2/3)+","+s[0]+","+s[1],i=e[1],a=2);if(t.length>1){u=t[1],s=e[a],a++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1];for(var f=2;f<t.length;f++,a++)s=e[a],u=t[f],r+="S"+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1]}if(n){var l=e[a];r+="Q"+(s[0]+u[0]*2/3)+","+(s[1]+u[1]*2/3)+","+l[0]+","+l[1]}return r}function mn(e,t){var n=[],r=(1-t)/2,i,s=e[0],o=e[1],u=1,a=e.length;while(++u<a)i=s,s=o,o=e[u],n.push([r*(o[0]-i[0]),r*(o[1]-i[1])]);return n}function gn(e){if(e.length<3)return an(e);var t=1,n=e.length,r=e[0],i=r[0],s=r[1],o=[i,i,i,(r=e[1])[0]],u=[s,s,s,r[1]],a=[i,",",s];Sn(a,o,u);while(++t<n)r=e[t],o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);t=-1;while(++t<2)o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);return a.join("")}function yn(e){if(e.length<4)return an(e);var t=[],n=-1,r=e.length,i,s=[0],o=[0];while(++n<3)i=e[n],s.push(i[0]),o.push(i[1]);t.push(En(ro,s)+","+En(ro,o)),--n;while(++n<r)i=e[n],s.shift(),s.push(i[0]),o.shift(),o.push(i[1]),Sn(t,s,o);return t.join("")}function bn(e){var t,n=-1,r=e.length,i=r+4,s,o=[],u=[];while(++n<4)s=e[n%r],o.push(s[0]),u.push(s[1]);t=[En(ro,o),",",En(ro,u)],--n;while(++n<i)s=e[n%r],o.shift(),o.push(s[0]),u.shift(),u.push(s[1]),Sn(t,o,u);return t.join("")}function wn(e,t){var n=e.length-1;if(n){var r=e[0][0],i=e[0][1],s=e[n][0]-r,o=e[n][1]-i,u=-1,a,f;while(++u<=n)a=e[u],f=u/n,a[0]=t*a[0]+(1-t)*(r+f*s),a[1]=t*a[1]+(1-t)*(i+f*o)}return gn(e)}function En(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]}function Sn(e,t,n){e.push("C",En(to,t),",",En(to,n),",",En(no,t),",",En(no,n),",",En(ro,t),",",En(ro,n))}function xn(e,t){return(t[1]-e[1])/(t[0]-e[0])}function Tn(e){var t=0,n=e.length-1,r=[],i=e[0],s=e[1],o=r[0]=xn(i,s);while(++t<n)r[t]=(o+(o=xn(i=s,s=e[t+1])))/2;return r[t]=o,r}function Nn(e){var t=[],n,r,i,s,o=Tn(e),u=-1,a=e.length-1;while(++u<a)n=xn(e[u],e[u+1]),Math.abs(n)<1e-6?o[u]=o[u+1]=0:(r=o[u]/n,i=o[u+1]/n,s=r*r+i*i,s>9&&(s=n*3/Math.sqrt(s),o[u]=s*r,o[u+1]=s*i));u=-1;while(++u<=a)s=(e[Math.min(a,u+1)][0]-e[Math.max(0,u-1)][0])/(6*(1+o[u]*o[u])),t.push([s||0,o[u]*s||0]);return t}function Cn(e){return e.length<3?an(e):e[0]+vn(e,Nn(e))}function kn(e){var t,n=-1,r=e.length,i,s;while(++n<r)t=e[n],i=t[0],s=t[1]+Ys,t[0]=i*Math.cos(s),t[1]=i*Math.sin(s);return e}function Ln(e){function t(t){function o(){l.push("M",f(e(v),p),h,c(e(d.reverse()),p),"Z")}var l=[],d=[],v=[],m=-1,g=t.length,y,b=u(n),w=u(i),E=n===r?function(){return x}:u(r),S=i===s?function(){return T}:u(s),x,T;while(++m<g)a.call(this,y=t[m],m)?(d.push([x=+b.call(this,y,m),T=+w.call(this,y,m)]),v.push([+E.call(this,y,m),+S.call(this,y,m)])):d.length&&(o(),d=[],v=[]);return d.length&&o(),l.length?l.join(""):null}var n=on,r=on,i=0,s=un,a=o,f=an,l=f.key,c=f,h="L",p=.7;return t.x=function(e){return arguments.length?(n=r=e,t):r},t.x0=function(e){return arguments.length?(n=e,t):n},t.x1=function(e){return arguments.length?(r=e,t):r},t.y=function(e){return arguments.length?(i=s=e,t):s},t.y0=function(e){return arguments.length?(i=e,t):i},t.y1=function(e){return arguments.length?(s=e,t):s},t.defined=function(e){return arguments.length?(a=e,t):a},t.interpolate=function(e){return arguments.length?(typeof e=="function"?l=f=e:l=(f=eo.get(e)||an).key,c=f.reverse||f,h=f.closed?"M":"L",t):l},t.tension=function(e){return arguments.length?(p=e,t):p},t}function An(e){return e.source}function On(e){return e.target}function Mn(e){return e.radius}function _n(e){return e.startAngle}function Dn(e){return e.endAngle}function Pn(e){return[e.x,e.y]}function Hn(e){return function(){var t=e.apply(this,arguments),n=t[0],r=t[1]+Ys;return[n*Math.cos(r),n*Math.sin(r)]}}function Bn(){return 64}function jn(){return"circle"}function Fn(e){var t=Math.sqrt(e/Math.PI);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+ -t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function In(e,t){e.attr("transform",function(e){return"translate("+t(e)+",0)"})}function qn(e,t){e.attr("transform",function(e){return"translate(0,"+t(e)+")"})}function Rn(e,t,n){i=[];if(n&&t.length>1){var r=_t(e.domain()),i,s=-1,o=t.length,u=(t[1]-t[0])/++n,a,f;while(++s<o)for(a=n;--a>0;)(f=+t[s]-a*u)>=r[0]&&i.push(f);for(--s,a=0;++a<n&&(f=+t[s]+a*u)<r[1];)i.push(f)}return i}function Un(){fo||(fo=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var e=d3.event,t;try{fo.scrollTop=1e3,fo.dispatchEvent(e),t=1e3-fo.scrollTop}catch(n){t=e.wheelDelta||-e.detail*5}return t}function zn(e){var t=e.source,n=e.target,r=Xn(t,n),i=[t];while(t!==r)t=t.parent,i.push(t);var s=i.length;while(n!==r)i.splice(s,0,n),n=n.parent;return i}function Wn(e){var t=[],n=e.parent;while(n!=null)t.push(e),e=n,n=n.parent;return t.push(e),t}function Xn(e,t){if(e===t)return e;var n=Wn(e),r=Wn(t),i=n.pop(),s=r.pop(),o=null;while(i===s)o=i,i=n.pop(),s=r.pop();return o}function Vn(e){e.fixed|=2}function $n(e){e.fixed&=1}function Jn(e){e.fixed|=4}function Kn(e){e.fixed&=3}function Qn(e,t,n){var r=0,i=0;e.charge=0;if(!e.leaf){var s=e.nodes,o=s.length,u=-1,a;while(++u<o){a=s[u];if(a==null)continue;Qn(a,t,n),e.charge+=a.charge,r+=a.charge*a.cx,i+=a.charge*a.cy}}if(e.point){e.leaf||(e.point.x+=Math.random()-.5,e.point.y+=Math.random()-.5);var f=t*n[e.point.index];e.charge+=e.pointCharge=f,r+=f*e.point.x,i+=f*e.point.y}e.cx=r/e.charge,e.cy=i/e.charge}function Gn(e){return 20}function Yn(e){return 1}function Zn(e){return e.x}function er(e){return e.y}function tr(e,t,n){e.y0=t,e.y=n}function nr(e){return d3.range(e.length)}function rr(e){var t=-1,n=e[0].length,r=[];while(++t<n)r[t]=0;return r}function ir(e){var t=1,n=0,r=e[0][1],i,s=e.length;for(;t<s;++t)(i=e[t][1])>r&&(n=t,r=i);return n}function sr(e){return e.reduce(or,0)}function or(e,t){return e+t[1]}function ur(e,t){return ar(e,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ar(e,t){var n=-1,r=+e[0],i=(e[1]-r)/t,s=[];while(++n<=t)s[n]=i*n+r;return s}function fr(e){return[d3.min(e),d3.max(e)]}function lr(e,t){return d3.rebind(e,t,"sort","children","value"),e.links=dr,e.nodes=function(t){return vo=!0,(e.nodes=e)(t)},e}function cr(e){return e.children}function hr(e){return e.value}function pr(e,t){return t.value-e.value}function dr(e){return d3.merge(e.map(function(e){return(e.children||[]).map(function(t){return{source:e,target:t}})}))}function vr(e,t){return e.value-t.value}function mr(e,t){var n=e._pack_next;e._pack_next=t,t._pack_prev=e,t._pack_next=n,n._pack_prev=t}function gr(e,t){e._pack_next=t,t._pack_prev=e}function yr(e,t){var n=t.x-e.x,r=t.y-e.y,i=e.r+t.r;return i*i-n*n-r*r>.001}function br(e){function t(e){r=Math.min(e.x-e.r,r),i=Math.max(e.x+e.r,i),s=Math.min(e.y-e.r,s),o=Math.max(e.y+e.r,o)}if(!(n=e.children)||!(p=n.length))return;var n,r=Infinity,i=-Infinity,s=Infinity,o=-Infinity,u,a,f,l,c,h,p;n.forEach(wr),u=n[0],u.x=-u.r,u.y=0,t(u);if(p>1){a=n[1],a.x=a.r,a.y=0,t(a);if(p>2){f=n[2],xr(u,a,f),t(f),mr(u,f),u._pack_prev=f,mr(f,a),a=u._pack_next;for(l=3;l<p;l++){xr(u,a,f=n[l]);var d=0,v=1,m=1;for(c=a._pack_next;c!==a;c=c._pack_next,v++)if(yr(c,f)){d=1;break}if(d==1)for(h=u._pack_prev;h!==c._pack_prev;h=h._pack_prev,m++)if(yr(h,f))break;d?(v<m||v==m&&a.r<u.r?gr(u,a=c):gr(u=h,a),l--):(mr(u,f),a=f,t(f))}}}var g=(r+i)/2,y=(s+o)/2,b=0;for(l=0;l<p;l++)f=n[l],f.x-=g,f.y-=y,b=Math.max(b,f.r+Math.sqrt(f.x*f.x+f.y*f.y));e.r=b,n.forEach(Er)}function wr(e){e._pack_next=e._pack_prev=e}function Er(e){delete e._pack_next,delete e._pack_prev}function Sr(e,t,n,r){var i=e.children;e.x=t+=r*e.x,e.y=n+=r*e.y,e.r*=r;if(i){var s=-1,o=i.length;while(++s<o)Sr(i[s],t,n,r)}}function xr(e,t,n){var r=e.r+n.r,i=t.x-e.x,s=t.y-e.y;if(r&&(i||s)){var o=t.r+n.r,u=i*i+s*s;o*=o,r*=r;var a=.5+(r-o)/(2*u),f=Math.sqrt(Math.max(0,2*o*(r+u)-(r-=u)*r-o*o))/(2*u);n.x=e.x+a*i+f*s,n.y=e.y+a*s-f*i}else n.x=e.x+r,n.y=e.y}function Tr(e){return 1+d3.max(e,function(e){return e.y})}function Nr(e){return e.reduce(function(e,t){return e+t.x},0)/e.length}function Cr(e){var t=e.children;return t&&t.length?Cr(t[0]):e}function kr(e){var t=e.children,n;return t&&(n=t.length)?kr(t[n-1]):e}function Lr(e,t){return e.parent==t.parent?1:2}function Ar(e){var t=e.children;return t&&t.length?t[0]:e._tree.thread}function Or(e){var t=e.children,n;return t&&(n=t.length)?t[n-1]:e._tree.thread}function Mr(e,t){var n=e.children;if(n&&(i=n.length)){var r,i,s=-1;while(++s<i)t(r=Mr(n[s],t),e)>0&&(e=r)}return e}function _r(e,t){return e.x-t.x}function Dr(e,t){return t.x-e.x}function Pr(e,t){return e.depth-t.depth}function Hr(e,t){function n(e,r){var i=e.children;if(i&&(a=i.length)){var s,o=null,u=-1,a;while(++u<a)s=i[u],n(s,o),o=s}t(e,r)}n(e,null)}function Br(e){var t=0,n=0,r=e.children,i=r.length,s;while(--i>=0)s=r[i]._tree,s.prelim+=t,s.mod+=t,t+=s.shift+(n+=s.change)}function jr(e,t,n){e=e._tree,t=t._tree;var r=n/(t.number-e.number);e.change+=r,t.change-=r,t.shift+=n,t.prelim+=n,t.mod+=n}function Fr(e,t,n){return e._tree.ancestor.parent==t.parent?e._tree.ancestor:n}function Ir(e){return{x:e.x,y:e.y,dx:e.dx,dy:e.dy}}function qr(e,t){var n=e.x+t[3],r=e.y+t[0],i=e.dx-t[1]-t[3],s=e.dy-t[0]-t[2];return i<0&&(n+=i/2,i=0),s<0&&(r+=s/2,s=0),{x:n,y:r,dx:i,dy:s}}function Rr(e,t){function n(e,r){d3.text(e,t,function(e){r(e&&n.parse(e))})}function r(t){return t.map(i).join(e)}function i(e){return o.test(e)?'"'+e.replace(/\"/g,'""')+'"':e}var s=new RegExp("\r\n|["+e+"\r\n]","g"),o=new RegExp('["'+e+"\n]"),u=e.charCodeAt(0);return n.parse=function(e){var t;return n.parseRows(e,function(e,n){if(n){var r={},i=-1,s=t.length;while(++i<s)r[t[i]]=e[i];return r}return t=e,null})},n.parseRows=function(e,t){function n(){if(s.lastIndex>=e.length)return i;if(l)return l=!1,r;var t=s.lastIndex;if(e.charCodeAt(t)===34){var n=t;while(n++<e.length)if(e.charCodeAt(n)===34){if(e.charCodeAt(n+1)!==34)break;n++}s.lastIndex=n+2;var o=e.charCodeAt(n+1);return o===13?(l=!0,e.charCodeAt(n+2)===10&&s.lastIndex++):o===10&&(l=!0),e.substring(t+1,n).replace(/""/g,'"')}var a=s.exec(e);return a?(l=a[0].charCodeAt(0)!==u,e.substring(t,a.index)):(s.lastIndex=e.length,e.substring(t))}var r={},i={},o=[],a=0,f,l;s.lastIndex=0;while((f=n())!==i){var c=[];while(f!==r&&f!==i)c.push(f),f=n();if(t&&!(c=t(c,a++)))continue;o.push(c)}return o},n.format=function(e){return e.map(r).join("\n")},n}function Ur(e,t){return function(n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}}function zr(e){return"m0,"+e+"a"+e+","+e+" 0 1,1 0,"+ -2*e+"a"+e+","+e+" 0 1,1 0,"+2*e+"z"}function Wr(e,t){go.hasOwnProperty(e.type)&&go[e.type](e,t)}function Xr(e,t){Wr(e.geometry,t)}function Vr(e,t){for(var n=e.features,r=0,i=n.length;r<i;r++)Wr(n[r].geometry,t)}function $r(e,t){for(var n=e.geometries,r=0,i=n.length;r<i;r++)Wr(n[r],t)}function Jr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Kr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Qr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r][0],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Gr(e,t){t.apply(null,e.coordinates)}function Yr(e,t){for(var n=e.coordinates[0],r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Zr(e){return e.source}function ei(e){return e.target}function ti(){function e(e){var t=Math.sin(e*=p)*d,n=Math.sin(p-e)*d,r=n*s+t*c,u=n*o+t*h,a=n*i+t*l;return[Math.atan2(u,r)/mo,Math.atan2(a,Math.sqrt(r*r+u*u))/mo]}var t,n,r,i,s,o,u,a,f,l,c,h,p,d;return e.distance=function(){return p==null&&(d=1/Math.sin(p=Math.acos(Math.max(-1,Math.min(1,i*l+r*f*Math.cos(u-t)))))),p},e.source=function(u){var a=Math.cos(t=u[0]*mo),f=Math.sin(t);return r=Math.cos(n=u[1]*mo),i=Math.sin(n),s=r*a,o=r*f,p=null,e},e.target=function(t){var n=Math.cos(u=t[0]*mo),r=Math.sin(u);return f=Math.cos(a=t[1]*mo),l=Math.sin(a),c=f*n,h=f*r,p=null,e},e}function ni(e,t){var n=ti().source(e).target(t);return n.distance(),n}function ri(e){var t=0,n=0;for(;;){if(e(t,n))return[t,n];t===0?(t=n+1,n=0):(t-=1,n+=1)}}function ii(e,t,n,r){var i,s,o,u,a,f,l;return i=r[e],s=i[0],o=i[1],i=r[t],u=i[0],a=i[1],i=r[n],f=i[0],l=i[1],(l-o)*(u-s)-(a-o)*(f-s)>0}function si(e,t,n){return(n[0]-t[0])*(e[1]-t[1])<(n[1]-t[1])*(e[0]-t[0])}function oi(e,t,n,r){var i=e[0],s=t[0],o=n[0],u=r[0],a=e[1],f=t[1],l=n[1],c=r[1],h=i-o,p=s-i,d=u-o,v=a-l,m=f-a,g=c-l,y=(d*v-g*h)/(g*p-d*m);return[i+y*p,a+y*m]}function ui(e,t){var n={list:e.map(function(e,t){return{index:t,x:e[0],y:e[1]}}).sort(function(e,t){return e.y<t.y?-1:e.y>t.y?1:e.x<t.x?-1:e.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(e,t){return{edge:e,side:t,vertex:null,l:null,r:null}},insert:function(e,t){t.l=e,t.r=e.r,e.r.l=t,e.r=t},leftBound:function(e){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,e));return t=t.l,t},del:function(e){e.l.r=e.r,e.r.l=e.l,e.edge=null},right:function(e){return e.r},left:function(e){return e.l},leftRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[e.side]},rightRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[wo[e.side]]}},i={bisect:function(e,t){var n={region:{l:e,r:t},ep:{l:null,r:null}},r=t.x-e.x,i=t.y-e.y,s=r>0?r:-r,o=i>0?i:-i;return n.c=e.x*r+e.y*i+(r*r+i*i)*.5,s>o?(n.a=1,n.b=i/r,n.c/=r):(n.b=1,n.a=r/i,n.c/=i),n},intersect:function(e,t){var n=e.edge,r=t.edge;if(!n||!r||n.region.r==r.region.r)return null;var i=n.a*r.b-n.b*r.a;if(Math.abs(i)<1e-10)return null;var s=(n.c*r.b-r.c*n.b)/i,o=(r.c*n.a-n.c*r.a)/i,u=n.region.r,a=r.region.r,f,l;u.y<a.y||u.y==a.y&&u.x<a.x?(f=e,l=n):(f=t,l=r);var c=s>=l.region.r.x;return c&&f.side==="l"||!c&&f.side==="r"?null:{x:s,y:o}},rightOf:function(e,t){var n=e.edge,r=n.region.r,i=t.x>r.x;if(i&&e.side==="l")return 1;if(!i&&e.side==="r")return 0;if(n.a===1){var s=t.y-r.y,o=t.x-r.x,u=0,a=0;!i&&n.b<0||i&&n.b>=0?a=u=s>=n.b*o:(a=t.x+t.y*n.b>n.c,n.b<0&&(a=!a),a||(u=1));if(!u){var f=r.x-n.region.l.x;a=n.b*(o*o-s*s)<f*s*(1+2*o/f+n.b*n.b),n.b<0&&(a=!a)}}else{var l=n.c-n.a*t.x,c=t.y-l,h=t.x-r.x,p=l-r.y;a=c*c>h*h+p*p}return e.side==="l"?a:!a},endPoint:function(e,n,r){e.ep[n]=r;if(!e.ep[wo[n]])return;t(e)},distance:function(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}},s={list:[],insert:function(e,t,n){e.vertex=t,e.ystar=t.y+n;for(var r=0,i=s.list,o=i.length;r<o;r++){var u=i[r];if(e.ystar>u.ystar||e.ystar==u.ystar&&t.x>u.vertex.x)continue;break}i.splice(r,0,e)},del:function(e){for(var t=0,n=s.list,r=n.length;t<r&&n[t]!=e;++t);n.splice(t,1)},empty:function(){return s.list.length===0},nextEvent:function(e){for(var t=0,n=s.list,r=n.length;t<r;++t)if(n[t]==e)return n[t+1];return null},min:function(){var e=s.list[0];return{x:e.vertex.x,y:e.ystar}},extractMin:function(){return s.list.shift()}};r.init(),n.bottomSite=n.list.shift();var o=n.list.shift(),u,a,f,l,c,h,p,d,v,m,g,y,b;for(;;){s.empty()||(u=s.min());if(o&&(s.empty()||o.y<u.y||o.y==u.y&&o.x<u.x))a=r.leftBound(o),f=r.right(a),p=r.rightRegion(a),y=i.bisect(p,o),h=r.createHalfEdge(y,"l"),r.insert(a,h),m=i.intersect(a,h),m&&(s.del(a),s.insert(a,m,i. -distance(m,o))),a=h,h=r.createHalfEdge(y,"r"),r.insert(a,h),m=i.intersect(h,f),m&&s.insert(h,m,i.distance(m,o)),o=n.list.shift();else{if(!!s.empty())break;a=s.extractMin(),l=r.left(a),f=r.right(a),c=r.right(f),p=r.leftRegion(a),d=r.rightRegion(f),g=a.vertex,i.endPoint(a.edge,a.side,g),i.endPoint(f.edge,f.side,g),r.del(a),s.del(f),r.del(f),b="l",p.y>d.y&&(v=p,p=d,d=v,b="r"),y=i.bisect(p,d),h=r.createHalfEdge(y,b),r.insert(l,h),i.endPoint(y,wo[b],g),m=i.intersect(l,h),m&&(s.del(l),s.insert(l,m,i.distance(m,p))),m=i.intersect(h,c),m&&s.insert(h,m,i.distance(m,p))}}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function ai(){return{leaf:!0,nodes:[],point:null}}function fi(e,t,n,r,i,s){if(!e(t,n,r,i,s)){var o=(n+i)*.5,u=(r+s)*.5,a=t.nodes;a[0]&&fi(e,a[0],n,r,o,u),a[1]&&fi(e,a[1],o,r,i,u),a[2]&&fi(e,a[2],n,u,o,s),a[3]&&fi(e,a[3],o,u,i,s)}}function li(e){return{x:e[0],y:e[1]}}function ci(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function hi(e){return e.substring(0,3)}function pi(e,t,n,r){var i,s,o=0,u=t.length,a=n.length;while(o<u){if(r>=a)return-1;i=t.charCodeAt(o++);if(i==37){s=Uo[t.charAt(o++)];if(!s||(r=s(e,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}function di(e){return new RegExp("^(?:"+e.map(d3.requote).join("|")+")","i")}function vi(e){var t=new r,n=-1,i=e.length;while(++n<i)t.set(e[n].toLowerCase(),n);return t}function mi(e,t,n){Bo.lastIndex=0;var r=Bo.exec(t.substring(n));return r?n+=r[0].length:-1}function gi(e,t,n){Ho.lastIndex=0;var r=Ho.exec(t.substring(n));return r?n+=r[0].length:-1}function yi(e,t,n){Io.lastIndex=0;var r=Io.exec(t.substring(n));return r?(e.m=qo.get(r[0].toLowerCase()),n+=r[0].length):-1}function bi(e,t,n){jo.lastIndex=0;var r=jo.exec(t.substring(n));return r?(e.m=Fo.get(r[0].toLowerCase()),n+=r[0].length):-1}function wi(e,t,n){return pi(e,Ro.c.toString(),t,n)}function Ei(e,t,n){return pi(e,Ro.x.toString(),t,n)}function Si(e,t,n){return pi(e,Ro.X.toString(),t,n)}function xi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+4));return r?(e.y=+r[0],n+=r[0].length):-1}function Ti(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.y=Ni(+r[0]),n+=r[0].length):-1}function Ni(e){return e+(e>68?1900:2e3)}function Ci(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.m=r[0]-1,n+=r[0].length):-1}function ki(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.d=+r[0],n+=r[0].length):-1}function Li(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.H=+r[0],n+=r[0].length):-1}function Ai(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.M=+r[0],n+=r[0].length):-1}function Oi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.S=+r[0],n+=r[0].length):-1}function Mi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+3));return r?(e.L=+r[0],n+=r[0].length):-1}function _i(e,t,n){var r=Wo.get(t.substring(n,n+=2).toLowerCase());return r==null?-1:(e.p=r,n)}function Di(e){var t=e.getTimezoneOffset(),n=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return n+Mo(r)+Mo(i)}function Pi(e){return e.toISOString()}function Hi(e,t,n){function r(t){var n=e(t),r=s(n,1);return t-n<r-t?n:r}function i(n){return t(n=e(new Eo(n-1)),1),n}function s(e,n){return t(e=new Eo(+e),n),e}function o(e,r,s){var o=i(e),u=[];if(s>1)while(o<r)n(o)%s||u.push(new Date(+o)),t(o,1);else while(o<r)u.push(new Date(+o)),t(o,1);return u}function u(e,t,n){try{Eo=ci;var r=new ci;return r._=e,o(r,t,n)}finally{Eo=Date}}e.floor=e,e.round=r,e.ceil=i,e.offset=s,e.range=o;var a=e.utc=Bi(e);return a.floor=a,a.round=Bi(r),a.ceil=Bi(i),a.offset=Bi(s),a.range=u,e}function Bi(e){return function(t,n){try{Eo=ci;var r=new ci;return r._=t,e(r,n)._}finally{Eo=Date}}}function ji(e,t,n){function r(t){return e(t)}return r.invert=function(t){return Ii(e.invert(t))},r.domain=function(t){return arguments.length?(e.domain(t),r):e.domain().map(Ii)},r.nice=function(e){return r.domain(Pt(r.domain(),function(){return e}))},r.ticks=function(n,i){var s=Fi(r.domain());if(typeof n!="function"){var o=s[1]-s[0],u=o/n,a=d3.bisect(Vo,u);if(a==Vo.length)return t.year(s,n);if(!a)return e.ticks(n).map(Ii);Math.log(u/Vo[a-1])<Math.log(Vo[a]/u)&&--a,n=t[a],i=n[1],n=n[0].range}return n(s[0],new Date(+s[1]+1),i)},r.tickFormat=function(){return n},r.copy=function(){return ji(e.copy(),t,n)},d3.rebind(r,e,"range","rangeRound","interpolate","clamp")}function Fi(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Ii(e){return new Date(e)}function qi(e){return function(t){var n=e.length-1,r=e[n];while(!r[1](t))r=e[--n];return r[0](t)}}function Ri(e){var t=new Date(e,0,1);return t.setFullYear(e),t}function Ui(e){var t=e.getFullYear(),n=Ri(t),r=Ri(t+1);return t+(e-n)/(r-n)}function zi(e){var t=new Date(Date.UTC(e,0,1));return t.setUTCFullYear(e),t}function Wi(e){var t=e.getUTCFullYear(),n=zi(t),r=zi(t+1);return t+(e-n)/(r-n)}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Xi){var Vi=CSSStyleDeclaration.prototype,$i=Vi.setProperty;Vi.setProperty=function(e,t,n){$i.call(this,e,t+"",n)}}d3={version:"2.10.3"};var Ji=n;try{Ji(document.documentElement.childNodes)[0].nodeType}catch(Ki){Ji=t}var Qi=[].__proto__?function(e,t){e.__proto__=t}:function(e,t){for(var n in t)e[n]=t[n]};d3.map=function(e){var t=new r;for(var n in e)t.set(n,e[n]);return t},e(r,{has:function(e){return Gi+e in this},get:function(e){return this[Gi+e]},set:function(e,t){return this[Gi+e]=t},remove:function(e){return e=Gi+e,e in this&&delete this[e]},keys:function(){var e=[];return this.forEach(function(t){e.push(t)}),e},values:function(){var e=[];return this.forEach(function(t,n){e.push(n)}),e},entries:function(){var e=[];return this.forEach(function(t,n){e.push({key:t,value:n})}),e},forEach:function(e){for(var t in this)t.charCodeAt(0)===Yi&&e.call(this,t.substring(1),this[t])}});var Gi="\0",Yi=Gi.charCodeAt(0);d3.functor=u,d3.rebind=function(e,t){var n=1,r=arguments.length,i;while(++n<r)e[i=arguments[n]]=a(e,t,t[i]);return e},d3.ascending=function(e,t){return e<t?-1:e>t?1:e>=t?0:NaN},d3.descending=function(e,t){return t<e?-1:t>e?1:t>=e?0:NaN},d3.mean=function(e,t){var n=e.length,r,i=0,s=-1,o=0;if(arguments.length===1)while(++s<n)f(r=e[s])&&(i+=(r-i)/++o);else while(++s<n)f(r=t.call(e,e[s],s))&&(i+=(r-i)/++o);return o?i:undefined},d3.median=function(e,t){return arguments.length>1&&(e=e.map(t)),e=e.filter(f),e.length?d3.quantile(e.sort(d3.ascending),.5):undefined},d3.min=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&i>s&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&i>s&&(i=s)}return i},d3.max=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&s>i&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&s>i&&(i=s)}return i},d3.extent=function(e,t){var n=-1,r=e.length,i,s,o;if(arguments.length===1){while(++n<r&&((i=o=e[n])==null||i!=i))i=o=undefined;while(++n<r)(s=e[n])!=null&&(i>s&&(i=s),o<s&&(o=s))}else{while(++n<r&&((i=o=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&(i>s&&(i=s),o<s&&(o=s))}return[i,o]},d3.random={normal:function(e,t){var n=arguments.length;return n<2&&(t=1),n<1&&(e=0),function(){var n,r,i;do n=Math.random()*2-1,r=Math.random()*2-1,i=n*n+r*r;while(!i||i>1);return e+t*n*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(e,t){var n=arguments.length;n<2&&(t=1),n<1&&(e=0);var r=d3.random.normal();return function(){return Math.exp(e+t*r())}},irwinHall:function(e){return function(){for(var t=0,n=0;n<e;n++)t+=Math.random();return t/e}}},d3.sum=function(e,t){var n=0,r=e.length,i,s=-1;if(arguments.length===1)while(++s<r)isNaN(i=+e[s])||(n+=i);else while(++s<r)isNaN(i=+t.call(e,e[s],s))||(n+=i);return n},d3.quantile=function(e,t){var n=(e.length-1)*t+1,r=Math.floor(n),i=e[r-1],s=n-r;return s?i+s*(e[r]-i):i},d3.transpose=function(e){return d3.zip.apply(d3,e)},d3.zip=function(){if(!(i=arguments.length))return[];for(var e=-1,t=d3.min(arguments,l),n=new Array(t);++e<t;)for(var r=-1,i,s=n[e]=new Array(i);++r<i;)s[r]=arguments[r][e];return n},d3.bisector=function(e){return{left:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;e.call(t,t[s],s)<n?r=s+1:i=s}return r},right:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;n<e.call(t,t[s],s)?i=s:r=s+1}return r}}};var Zi=d3.bisector(function(e){return e});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.first=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])>0&&(i=s);return i},d3.last=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])<=0&&(i=s);return i},d3.nest=function(){function e(t,s){if(s>=i.length)return u?u.call(n,t):o?t.sort(o):t;var a=-1,f=t.length,l=i[s++],c,h,p=new r,d,v={};while(++a<f)(d=p.get(c=l(h=t[a])))?d.push(h):p.set(c,[h]);return p.forEach(function(t,n){v[t]=e(n,s)}),v}function t(e,n){if(n>=i.length)return e;var r=[],o=s[n++],u;for(u in e)r.push({key:u,values:t(e[u],n)});return o&&r.sort(function(e,t){return o(e.key,t.key)}),r}var n={},i=[],s=[],o,u;return n.map=function(t){return e(t,0)},n.entries=function(n){return t(e(n,0),0)},n.key=function(e){return i.push(e),n},n.sortKeys=function(e){return s[i.length-1]=e,n},n.sortValues=function(e){return o=e,n},n.rollup=function(e){return u=e,n},n},d3.keys=function(e){var t=[];for(var n in e)t.push(n);return t},d3.values=function(e){var t=[];for(var n in e)t.push(e[n]);return t},d3.entries=function(e){var t=[];for(var n in e)t.push({key:n,value:e[n]});return t},d3.permute=function(e,t){var n=[],r=-1,i=t.length;while(++r<i)n[r]=e[t[r]];return n},d3.merge=function(e){return Array.prototype.concat.apply([],e)},d3.split=function(e,t){var n=[],r=[],i,s=-1,o=e.length;arguments.length<2&&(t=c);while(++s<o)t.call(r,i=e[s],s)?r=[]:(r.length||n.push(r),r.push(i));return n},d3.range=function(e,t,n){arguments.length<3&&(n=1,arguments.length<2&&(t=e,e=0));if((t-e)/n===Infinity)throw new Error("infinite range");var r=[],i=p(Math.abs(n)),s=-1,o;e*=i,t*=i,n*=i;if(n<0)while((o=e+n*++s)>t)r.push(o/i);else while((o=e+n*++s)<t)r.push(o/i);return r},d3.requote=function(e){return e.replace(es,"\\$&")};var es=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(e,t){return t?Math.round(e*(t=Math.pow(10,t)))/t:Math.round(e)},d3.xhr=function(e,t,n){var r=new XMLHttpRequest;arguments.length<3?(n=t,t=null):t&&r.overrideMimeType&&r.overrideMimeType(t),r.open("GET",e,!0),t&&r.setRequestHeader("Accept",t),r.onreadystatechange=function(){if(r.readyState===4){var e=r.status;n(!e&&r.response||e>=200&&e<300||e===304?r:null)}},r.send(null)},d3.text=function(e,t,n){function r(e){n(e&&e.responseText)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)},d3.json=function(e,t){d3.text(e,"application/json",function(e){t(e?JSON.parse(e):null)})},d3.html=function(e,t){d3.text(e,"text/html",function(e){if(e!=null){var n=document.createRange();n.selectNode(document.body),e=n.createContextualFragment(e)}t(e)})},d3.xml=function(e,t,n){function r(e){n(e&&e.responseXML)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)};var ts={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:ts,qualify:function(e){var t=e.indexOf(":"),n=e;return t>=0&&(n=e.substring(0,t),e=e.substring(t+1)),ts.hasOwnProperty(n)?{space:ts[n],local:e}:e}},d3.dispatch=function(){var e=new d,t=-1,n=arguments.length;while(++t<n)e[arguments[t]]=v(e);return e},d.prototype.on=function(e,t){var n=e.indexOf("."),r="";return n>0&&(r=e.substring(n+1),e=e.substring(0,n)),arguments.length<2?this[e].on(r):this[e].on(r,t)},d3.format=function(e){var t=ns.exec(e),n=t[1]||" ",r=t[3]||"",i=t[5],s=+t[6],o=t[7],u=t[8],a=t[9],f=1,l="",c=!1;u&&(u=+u.substring(1)),i&&(n="0",o&&(s-=Math.floor((s-1)/4)));switch(a){case"n":o=!0,a="g";break;case"%":f=100,l="%",a="f";break;case"p":f=100,l="%",a="r";break;case"d":c=!0,u=0;break;case"s":f=-1,a="r"}return a=="r"&&!u&&(a="g"),a=rs.get(a)||g,function(e){if(c&&e%1)return"";var t=e<0&&(e=-e)?"-":r;if(f<0){var h=d3.formatPrefix(e,u);e=h.scale(e),l=h.symbol}else e*=f;e=a(e,u);if(i){var p=e.length+t.length;p<s&&(e=(new Array(s-p+1)).join(n)+e),o&&(e=y(e)),e=t+e}else{o&&(e=y(e)),e=t+e;var p=e.length;p<s&&(e=(new Array(s-p+1)).join(n)+e)}return e+l}};var ns=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,rs=d3.map({g:function(e,t){return e.toPrecision(t)},e:function(e,t){return e.toExponential(t)},f:function(e,t){return e.toFixed(t)},r:function(e,t){return d3.round(e,t=m(e,t)).toFixed(Math.max(0,Math.min(20,t)))}}),is=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(b);d3.formatPrefix=function(e,t){var n=0;return e&&(e<0&&(e*=-1),t&&(e=d3.round(e,m(e,t))),n=1+Math.floor(1e-12+Math.log(e)/Math.LN10),n=Math.max(-24,Math.min(24,Math.floor((n<=0?n+1:n-1)/3)*3))),is[8+n/3]};var ss=T(2),os=T(3),us=function(){return x},as=d3.map({linear:us,poly:T,quad:function(){return ss},cubic:function(){return os},sin:function(){return N},exp:function(){return C},circle:function(){return k},elastic:L,back:A,bounce:function(){return O}}),fs=d3.map({"in":x,out:E,"in-out":S,"out-in":function(e){return S(E(e))}});d3.ease=function(e){var t=e.indexOf("-"),n=t>=0?e.substring(0,t):e,r=t>=0?e.substring(t+1):"in";return n=as.get(n)||us,r=fs.get(r)||x,w(r(n.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(e){var t=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(e){t.setAttribute("transform",e);var n=t.transform.baseVal.consolidate();return new P(n?n.matrix:cs)})(e)},P.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ls=180/Math.PI,cs={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(e,t){var n=d3.interpolators.length,r;while(--n>=0&&!(r=d3.interpolators[n](e,t)));return r},d3.interpolateNumber=function(e,t){return t-=e,function(n){return e+t*n}},d3.interpolateRound=function(e,t){return t-=e,function(n){return Math.round(e+t*n)}},d3.interpolateString=function(e,t){var n,r,i,s=0,o=0,u=[],a=[],f,l;hs.lastIndex=0;for(r=0;n=hs.exec(t);++r)n.index&&u.push(t.substring(s,o=n.index)),a.push({i:u.length,x:n[0]}),u.push(null),s=hs.lastIndex;s<t.length&&u.push(t.substring(s));for(r=0,f=a.length;(n=hs.exec(e))&&r<f;++r){l=a[r];if(l.x==n[0]){if(l.i)if(u[l.i+1]==null){u[l.i-1]+=l.x,u.splice(l.i,1);for(i=r+1;i<f;++i)a[i].i--}else{u[l.i-1]+=l.x+u[l.i+1],u.splice(l.i,2);for(i=r+1;i<f;++i)a[i].i-=2}else if(u[l.i+1]==null)u[l.i]=l.x;else{u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1);for(i=r+1;i<f;++i)a[i].i--}a.splice(r,1),f--,r--}else l.x=d3.interpolateNumber(parseFloat(n[0]),parseFloat(l.x))}while(r<f)l=a.pop(),u[l.i+1]==null?u[l.i]=l.x:(u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1)),f--;return u.length===1?u[0]==null?a[0].x:function(){return t}:function(e){for(r=0;r<f;++r)u[(l=a[r]).i]=l.x(e);return u.join("")}},d3.interpolateTransform=function(e,t){var n=[],r=[],i,s=d3.transform(e),o=d3.transform(t),u=s.translate,a=o.translate,f=s.rotate,l=o.rotate,c=s.skew,h=o.skew,p=s.scale,d=o.scale;return u[0]!=a[0]||u[1]!=a[1]?(n.push("translate(",null,",",null,")"),r.push({i:1,x:d3.interpolateNumber(u[0],a[0])},{i:3,x:d3.interpolateNumber(u[1],a[1])})):a[0]||a[1]?n.push("translate("+a+")"):n.push(""),f!=l?(f-l>180?l+=360:l-f>180&&(f+=360),r.push({i:n.push(n.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(f,l)})):l&&n.push(n.pop()+"rotate("+l+")"),c!=h?r.push({i:n.push(n.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(c,h)}):h&&n.push(n.pop()+"skewX("+h+")"),p[0]!=d[0]||p[1]!=d[1]?(i=n.push(n.pop()+"scale(",null,",",null,")"),r.push({i:i-4,x:d3.interpolateNumber(p[0],d[0])},{i:i-2,x:d3.interpolateNumber(p[1],d[1])})):(d[0]!=1||d[1]!=1)&&n.push(n.pop()+"scale("+d+")"),i=r.length,function(e){var t=-1,s;while(++t<i)n[(s=r[t]).i]=s.x(e);return n.join("")}},d3.interpolateRgb=function(e,t){e=d3.rgb(e),t=d3.rgb(t);var n=e.r,r=e.g,i=e.b,s=t.r-n,o=t.g-r,u=t.b-i;return function(e){return"#"+W(Math.round(n+s*e))+W(Math.round(r+o*e))+W(Math.round(i+u*e))}},d3.interpolateHsl=function(e,t){e=d3.hsl(e),t=d3.hsl(t);var n=e.h,r=e.s,i=e.l,s=t.h-n,o=t.s-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return Y(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateLab=function(e,t){e=d3.lab(e),t=d3.lab(t);var n=e.l,r=e.a,i=e.b,s=t.l-n,o=t.a-r,u=t.b-i;return function(e){return it(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateHcl=function(e,t){e=d3.hcl(e),t=d3.hcl(t);var n=e.h,r=e.c,i=e.l,s=t.h-n,o=t.c-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return tt(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateArray=function(e,t){var n=[],r=[],i=e.length,s=t.length,o=Math.min(e.length,t.length),u;for(u=0;u<o;++u)n.push(d3.interpolate(e[u],t[u]));for(;u<i;++u)r[u]=e[u];for(;u<s;++u)r[u]=t[u];return function(e){for(u=0;u<o;++u)r[u]=n[u](e);return r}},d3.interpolateObject=function(e,t){var n={},r={},i;for(i in e)i in t?n[i]=F(i)(e[i],t[i]):r[i]=e[i];for(i in t)i in e||(r[i]=t[i]);return function(e){for(i in n)r[i]=n[i](e);return r}};var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(e,t){return t instanceof Array&&d3.interpolateArray(e,t)},function(e,t){return(typeof e=="string"||typeof t=="string")&&d3.interpolateString(e+"",t+"")},function(e,t){return(typeof t=="string"?ds.has(t)||/^(#|rgb\(|hsl\()/.test(t):t instanceof R)&&d3.interpolateRgb(e,t)},function(e,t){return!isNaN(e=+e)&&!isNaN(t=+t)&&d3.interpolateNumber(e,t)}],R.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(e,t,n){return arguments.length===1?e instanceof z?U(e.r,e.g,e.b):X(""+e,U,Y):U(~~e,~~t,~~n)};var ps=z.prototype=new R;ps.brighter=function(e){e=Math.pow(.7,arguments.length?e:1);var t=this.r,n=this.g,r=this.b,i=30;return!t&&!n&&!r?U(i,i,i):(t&&t<i&&(t=i),n&&n<i&&(n=i),r&&r<i&&(r=i),U(Math.min(255,Math.floor(t/e)),Math.min(255,Math.floor(n/e)),Math.min(255,Math.floor(r/e))))},ps.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),U(Math.floor(e*this.r),Math.floor(e*this.g),Math.floor(e*this.b))},ps.hsl=function(){return V(this.r,this.g,this.b)},ps.toString=function(){return"#"+W(this.r)+W(this.g)+W(this.b)};var ds=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});ds.forEach(function(e,t){ds.set(e,X(t,U,Y))}),d3.hsl=function(e,t,n){return arguments.length===1?e instanceof G?Q(e.h,e.s,e.l):X(""+e,V,Q):Q(+e,+t,+n)};var vs=G.prototype=new R;vs.brighter=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,this.l/e)},vs.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,e*this.l)},vs.rgb=function(){return Y(this.h,this.s,this.l)},d3.hcl=function(e,t,n){return arguments.length===1?e instanceof et?Z(e.h,e.c,e.l):e instanceof rt?st(e.l,e.a,e.b):st((e=$((e=d3.rgb(e)).r,e.g,e.b)).l,e.a,e.b):Z(+e,+t,+n)};var ms=et.prototype=new R;ms.brighter=function(e){return Z(this.h,this.c,Math.min(100,this.l+gs*(arguments.length?e:1)))},ms.darker=function(e){return Z(this.h,this.c,Math.max(0,this.l-gs*(arguments.length?e:1)))},ms.rgb=function(){return tt(this.h,this.c,this.l).rgb()},d3.lab=function(e,t,n){return arguments.length===1?e instanceof rt?nt(e.l,e.a,e.b):e instanceof et?tt(e.l,e.c,e.h):$((e=d3.rgb(e)).r,e.g,e.b):nt(+e,+t,+n)};var gs=18,ys=.95047,bs=1,ws=1.08883,Es=rt.prototype=new R;Es.brighter=function(e){return nt(Math.min(100,this.l+gs*(arguments.length?e:1)),this.a,this.b)},Es.darker=function(e){return nt(Math.max(0,this.l-gs*(arguments.length?e:1)),this.a,this.b)},Es.rgb=function(){return it(this.l,this.a,this.b)};var Ss=function(e,t){return t.querySelector(e)},xs=function(e,t){return t.querySelectorAll(e)},Ts=document.documentElement,Ns=Ts.matchesSelector||Ts.webkitMatchesSelector||Ts.mozMatchesSelector||Ts.msMatchesSelector||Ts.oMatchesSelector,Cs=function(e,t){return Ns.call(e,t)};typeof Sizzle=="function"&&(Ss=function(e,t){return Sizzle(e,t)[0]||null},xs=function(e,t){return Sizzle.uniqueSort(Sizzle(e,t))},Cs=Sizzle.matchesSelector);var ks=[];d3.selection=function(){return Ls},d3.selection.prototype=ks,ks.select=function(e){var t=[],n,r,i,s;typeof e!="function"&&(e=lt(e));for(var o=-1,u=this.length;++o<u;){t.push(n=[]),n.parentNode=(i=this[o]).parentNode;for(var a=-1,f=i.length;++a<f;)(s=i[a])?(n.push(r=e.call(s,s.__data__,a)),r&&"__data__"in s&&(r.__data__=s.__data__)):n.push(null)}return ft(t)},ks.selectAll=function(e){var t=[],n,r;typeof e!="function"&&(e=ct(e));for(var i=-1,s=this.length;++i<s;)for(var o=this[i],u=-1,a=o.length;++u<a;)if(r=o[u])t.push(n=Ji(e.call(r,r.__data__,u))),n.parentNode=r;return ft(t)},ks.attr=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node();return e=d3.ns.qualify(e),e.local?n.getAttributeNS(e.space,e.local):n.getAttribute(e)}for(t in e)this.each(ht(t,e[t]));return this}return this.each(ht(e,t))},ks.classed=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node(),r=(e=e.trim().split(/^|\s+/g)).length,i=-1;if(t=n.classList){while(++i<r)if(!t.contains(e[i]))return!1}else{t=n.className,t.baseVal!=null&&(t=t.baseVal);while(++i<r)if(!pt(e[i]).test(t))return!1}return!0}for(t in e)this.each(dt(t,e[t]));return this}return this.each(dt(e,t))},ks.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.each(mt(n,e[n],t));return this}if(r<2)return window.getComputedStyle(this.node(),null).getPropertyValue(e);n=""}return this.each(mt(e,t,n))},ks.property=function(e,t){if(arguments.length<2){if(typeof e=="string")return this.node()[e];for(t in e)this.each(gt(t,e[t]));return this}return this.each(gt(e,t))},ks.text=function(e){return arguments.length<1?this.node().textContent:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.textContent=t==null?"":t}:e==null?function(){this.textContent=""}:function(){this.textContent=e})},ks.html=function(e){return arguments.length<1?this.node().innerHTML:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.innerHTML=t==null?"":t}:e==null?function(){this.innerHTML=""}:function(){this.innerHTML=e})},ks.append=function(e){function t(){return this.appendChild(document.createElementNS(this.namespaceURI,e))}function n(){return this.appendChild(document.createElementNS(e.space,e.local))}return e=d3.ns.qualify(e),this.select(e.local?n:t)},ks.insert=function(e,t){function n(){return this.insertBefore(document.createElementNS(this.namespaceURI,e),Ss(t,this))}function r(){return this.insertBefore(document.createElementNS(e.space,e.local),Ss(t,this))}return e=d3.ns.qualify(e),this.select(e.local?r:n)},ks.remove=function(){return this.each(function(){var e=this.parentNode;e&&e.removeChild(this)})},ks.data=function(e,t){function n(e,n){var i,s=e.length,o=n.length,u=Math.min(s,o),c=Math.max(s,o),h=[],p=[],d=[],v,m;if(t){var g=new r,y=[],b,w=n.length;for(i=-1;++i<s;)b=t.call(v=e[i],v.__data__,i),g.has(b)?d[w++]=v:g.set(b,v),y.push(b);for(i=-1;++i<o;)b=t.call(n,m=n[i],i),g.has(b)?(h[i]=v=g.get(b),v.__data__=m,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null),g.remove(b);for(i=-1;++i<s;)g.has(y[i])&&(d[i]=e[i])}else{for(i=-1;++i<u;)v=e[i],m=n[i],v?(v.__data__=m,h[i]=v,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null);for(;i<o;++i)p[i]=yt(n[i]),h[i]=d[i]=null;for(;i<c;++i)d[i]=e[i],p[i]=h[i]=null}p.update=h,p.parentNode=h.parentNode=d.parentNode=e.parentNode,a.push(p),f.push(h),l.push(d)}var i=-1,s=this.length,o,u;if(!arguments.length){e=new Array(s=(o=this[0]).length);while(++i<s)if(u=o[i])e[i]=u.__data__;return e}var a=xt([]),f=ft([]),l=ft([]);if(typeof e=="function")while(++i<s)n(o=this[i],e.call(o,o.parentNode.__data__,i));else while(++i<s)n(o=this[i],e);return f.enter=function(){return a},f.exit=function(){return l},f},ks.datum=ks.map=function(e){return arguments.length<1?this.property("__data__"):this.property("__data__",e)},ks.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]),n.parentNode=(r=this[s]).parentNode;for(var u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i,i.__data__,u)&&n.push(i)}return ft(t)},ks.order=function(){for(var e=-1,t=this.length;++e<t;)for(var n=this[e],r=n.length-1,i=n[r],s;--r>=0;)if(s=n[r])i&&i!==s.nextSibling&&i.parentNode.insertBefore(s,i),i=s;return this},ks.sort=function(e){e=wt.apply(this,arguments);for(var t=-1,n=this.length;++t<n;)this[t].sort(e);return this.order()},ks.on=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t=!1);for(n in e)this.each(Et(n,e[n],t));return this}if(r<2)return(r=this.node()["__on"+e])&&r._;n=!1}return this.each(Et(e,t,n))},ks.each=function(e){return St(this,function(t,n,r){e.call(t,t.__data__,n,r)})},ks.call=function(e){return e.apply(this,(arguments[0]=this,arguments)),this},ks.empty=function(){return!this.node()},ks.node=function(e){for(var t=0,n=this.length;t<n;t++)for(var r=this[t],i=0,s=r.length;i<s;i++){var o=r[i];if(o)return o}return null},ks.transition=function(){var e=[],t,n;for(var r=-1,i=this.length;++r<i;){e.push(t=[]);for(var s=this[r],o=-1,u=s.length;++o<u;)t.push((n=s[o])?{node:n,delay:Bs,duration:js}:null)}return Tt(e,_s||++Ms,Date.now())};var Ls=ft([[document]]);Ls[0].parentNode=Ts,d3.select=function(e){return typeof e=="string"?Ls.select(e):ft([[e]])},d3.selectAll=function(e){return typeof e=="string"?Ls.selectAll(e):ft([Ji(e)])};var As=[];d3.selection.enter=xt,d3.selection.enter.prototype=As,As.append=ks.append,As.insert=ks.insert,As.empty=ks.empty,As.node=ks.node,As.select=function(e){var t=[],n,r,i,s,o;for(var u=-1,a=this.length;++u<a;){i=(s=this[u]).update,t.push(n=[]),n.parentNode=s.parentNode;for(var f=-1,l=s.length;++f<l;)(o=s[f])?(n.push(i[f]=r=e.call(s.parentNode,o.__data__,f)),r.__data__=o.__data__):n.push(null)}return ft(t)};var Os=[],Ms=0,_s=0,Ds=0,Ps=250,Hs=d3.ease("cubic-in-out"),Bs=Ds,js=Ps,Fs=Hs;Os.call=ks.call,d3.transition=function(e){return arguments.length?_s?e.transition():e:Ls.transition()},d3.transition.prototype=Os,Os.select=function(e){var t=[],n,r,i;typeof e!="function"&&(e=lt(e));for(var s=-1,o=this.length;++s<o;){t.push(n=[]);for(var u=this[s],a=-1,f=u.length;++a<f;)(i=u[a])&&(r=e.call(i.node,i.node.__data__,a))?("__data__"in i.node&&(r.__data__=i.node.__data__),n.push({node:r,delay:i.delay,duration:i.duration})):n.push(null)}return Tt(t,this.id,this.time).ease(this.ease())},Os.selectAll=function(e){var t=[],n,r,i;typeof e!="function"&&(e=ct(e));for(var s=-1,o=this.length;++s<o;)for(var u=this[s],a=-1,f=u.length;++a<f;)if(i=u[a]){r=e.call(i.node,i.node.__data__,a),t.push(n=[]);for(var l=-1,c=r.length;++l<c;)n.push({node:r[l],delay:i.delay,duration:i.duration})}return Tt(t,this.id,this.time).ease(this.ease())},Os.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]);for(var r=this[s],u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i.node,i.node.__data__,u)&&n.push(i)}return Tt(t,this.id,this.time).ease(this.ease())},Os.attr=function(e,t){if(arguments.length<2){for(t in e)this.attrTween(t,kt(e[t],t));return this}return this.attrTween(e,kt(t,e))},Os.attrTween=function(e,t){function n(e,n){var r=t.call(this,e,n,this.getAttribute(i));return r===Is?(this.removeAttribute(i),null):r&&function(e){this.setAttribute(i,r(e))}}function r(e,n){var r=t.call(this,e,n,this.getAttributeNS(i.space,i.local));return r===Is?(this.removeAttributeNS(i.space,i.local),null):r&&function(e){this.setAttributeNS(i.space,i.local,r(e))}}var i=d3.ns.qualify(e);return this.tween("attr."+e,i.local?r:n)},Os.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.styleTween(n,kt(e[n],n),t);return this}n=""}return this.styleTween(e,kt(t,e),n)},Os.styleTween=function(e,t,n){return arguments.length<3&&(n=""),this.tween("style."+e,function(r,i){var s=t.call(this,r,i,window.getComputedStyle(this,null).getPropertyValue(e));return s===Is?(this.style.removeProperty(e),null):s&&function(t){this.style.setProperty(e,s(t),n)}})},Os.text=function(e){return this.tween("text",function(t,n){this.textContent=typeof e=="function"?e.call(this,t,n):e})},Os.remove=function(){return this.each("end.transition",function(){var e;!this.__transition__&&(e=this.parentNode)&&e.removeChild(this)})},Os.delay=function(e){return St(this,typeof e=="function"?function(t,n,r){t.delay=e.call(t=t.node,t.__data__,n,r)|0}:(e|=0,function(t){t.delay=e}))},Os.duration=function(e){return St(this,typeof e=="function"?function(t,n,r){t.duration=Math.max(1,e.call(t=t.node,t.__data__,n,r)|0)}:(e=Math.max(1,e|0),function(t){t.duration=e}))},Os.transition=function(){return this.select(s)},d3.tween=function(e,t){function n(n,r,i){var s=e.call(this,n,r);return s==null?i!=""&&Is:i!=s&&t(i,s+"")}function r(n,r,i){return i!=e&&t(i,e)}return typeof e=="function"?n:e==null?Ct:(e+="",r)};var Is={},qs=0,Rs={},Us=null,zs,Ws;d3.timer=function(e,t,n){if(arguments.length<3){if(arguments.length<2)t=0;else if(!isFinite(t))return;n=Date.now()}var r=Rs[e.id];r&&r.callback===e?(r.then=n,r.delay=t):Rs[e.id=++qs]=Us={callback:e,then:n,delay:t,next:Us},zs||(Ws=clearTimeout(Ws),zs=1,Xs(Lt))},d3.timer.flush=function(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,n.delay||(n.flush=n.callback(e)),n=n.next;At()};var Xs=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout -(e,17)};d3.mouse=function(e){return Ot(e,_())};var Vs=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(e,t){return arguments.length<2&&(t=_().touches),t?Ji(t).map(function(t){var n=Ot(e,t);return n.identifier=t.identifier,n}):[]},d3.scale={},d3.scale.linear=function(){return Bt([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Wt(d3.scale.linear(),Xt)};var $s=d3.format(".0e");Xt.pow=function(e){return Math.pow(10,e)},Vt.pow=function(e){return-Math.pow(10,-e)},d3.scale.pow=function(){return $t(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return Kt([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(Js)},d3.scale.category20=function(){return d3.scale.ordinal().range(Ks)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Qs)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Gs)};var Js=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ks=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Qs=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Gs=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return Qt([],[])},d3.scale.quantize=function(){return Gt(0,1,[0,1])},d3.scale.threshold=function(){return Yt([.5],[0,1])},d3.scale.identity=function(){return Zt([0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=t.apply(this,arguments),s=n.apply(this,arguments),o=r.apply(this,arguments)+Ys,u=i.apply(this,arguments)+Ys,a=(u<o&&(a=o,o=u,u=a),u-o),f=a<Math.PI?"0":"1",l=Math.cos(o),c=Math.sin(o),h=Math.cos(u),p=Math.sin(u);return a>=Zs?e?"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"Z":e?"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L"+e*h+","+e*p+"A"+e+","+e+" 0 "+f+",0 "+e*l+","+e*c+"Z":"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L0,0"+"Z"}var t=en,n=tn,r=nn,i=rn;return e.innerRadius=function(n){return arguments.length?(t=u(n),e):t},e.outerRadius=function(t){return arguments.length?(n=u(t),e):n},e.startAngle=function(t){return arguments.length?(r=u(t),e):r},e.endAngle=function(t){return arguments.length?(i=u(t),e):i},e.centroid=function(){var e=(t.apply(this,arguments)+n.apply(this,arguments))/2,s=(r.apply(this,arguments)+i.apply(this,arguments))/2+Ys;return[Math.cos(s)*e,Math.sin(s)*e]},e};var Ys=-Math.PI/2,Zs=2*Math.PI-1e-6;d3.svg.line=function(){return sn(i)};var eo=d3.map({linear:an,"linear-closed":fn,"step-before":ln,"step-after":cn,basis:gn,"basis-open":yn,"basis-closed":bn,bundle:wn,cardinal:dn,"cardinal-open":hn,"cardinal-closed":pn,monotone:Cn});eo.forEach(function(e,t){t.key=e,t.closed=/-closed$/.test(e)});var to=[0,2/3,1/3,0],no=[0,1/3,2/3,0],ro=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var e=sn(kn);return e.radius=e.x,delete e.x,e.angle=e.y,delete e.y,e},ln.reverse=cn,cn.reverse=ln,d3.svg.area=function(){return Ln(i)},d3.svg.area.radial=function(){var e=Ln(kn);return e.radius=e.x,delete e.x,e.innerRadius=e.x0,delete e.x0,e.outerRadius=e.x1,delete e.x1,e.angle=e.y,delete e.y,e.startAngle=e.y0,delete e.y0,e.endAngle=e.y1,delete e.y1,e},d3.svg.chord=function(){function e(e,u){var a=t(this,s,e,u),f=t(this,o,e,u);return"M"+a.p0+r(a.r,a.p1,a.a1-a.a0)+(n(a,f)?i(a.r,a.p1,a.r,a.p0):i(a.r,a.p1,f.r,f.p0)+r(f.r,f.p1,f.a1-f.a0)+i(f.r,f.p1,a.r,a.p0))+"Z"}function t(e,t,n,r){var i=t.call(e,n,r),s=a.call(e,i,r),o=f.call(e,i,r)+Ys,u=l.call(e,i,r)+Ys;return{r:s,a0:o,a1:u,p0:[s*Math.cos(o),s*Math.sin(o)],p1:[s*Math.cos(u),s*Math.sin(u)]}}function n(e,t){return e.a0==t.a0&&e.a1==t.a1}function r(e,t,n){return"A"+e+","+e+" 0 "+ +(n>Math.PI)+",1 "+t}function i(e,t,n,r){return"Q 0,0 "+r}var s=An,o=On,a=Mn,f=nn,l=rn;return e.radius=function(t){return arguments.length?(a=u(t),e):a},e.source=function(t){return arguments.length?(s=u(t),e):s},e.target=function(t){return arguments.length?(o=u(t),e):o},e.startAngle=function(t){return arguments.length?(f=u(t),e):f},e.endAngle=function(t){return arguments.length?(l=u(t),e):l},e},d3.svg.diagonal=function(){function e(e,i){var s=t.call(this,e,i),o=n.call(this,e,i),u=(s.y+o.y)/2,a=[s,{x:s.x,y:u},{x:o.x,y:u},o];return a=a.map(r),"M"+a[0]+"C"+a[1]+" "+a[2]+" "+a[3]}var t=An,n=On,r=Pn;return e.source=function(n){return arguments.length?(t=u(n),e):t},e.target=function(t){return arguments.length?(n=u(t),e):n},e.projection=function(t){return arguments.length?(r=t,e):r},e},d3.svg.diagonal.radial=function(){var e=d3.svg.diagonal(),t=Pn,n=e.projection;return e.projection=function(e){return arguments.length?n(Hn(t=e)):t},e},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function e(e,r){return(io.get(t.call(this,e,r))||Fn)(n.call(this,e,r))}var t=jn,n=Bn;return e.type=function(n){return arguments.length?(t=u(n),e):t},e.size=function(t){return arguments.length?(n=u(t),e):n},e};var io=d3.map({circle:Fn,cross:function(e){var t=Math.sqrt(e/5)/2;return"M"+ -3*t+","+ -t+"H"+ -t+"V"+ -3*t+"H"+t+"V"+ -t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+ -t+"V"+t+"H"+ -3*t+"Z"},diamond:function(e){var t=Math.sqrt(e/(2*oo)),n=t*oo;return"M0,"+ -t+"L"+n+",0"+" 0,"+t+" "+ -n+",0"+"Z"},square:function(e){var t=Math.sqrt(e)/2;return"M"+ -t+","+ -t+"L"+t+","+ -t+" "+t+","+t+" "+ -t+","+t+"Z"},"triangle-down":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+n+"L"+t+","+ -n+" "+ -t+","+ -n+"Z"},"triangle-up":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+ -n+"L"+t+","+n+" "+ -t+","+n+"Z"}});d3.svg.symbolTypes=io.keys();var so=Math.sqrt(3),oo=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function e(e){e.each(function(){var e=d3.select(this),c=a==null?t.ticks?t.ticks.apply(t,u):t.domain():a,h=f==null?t.tickFormat?t.tickFormat.apply(t,u):String:f,p=Rn(t,c,l),d=e.selectAll(".minor").data(p,String),v=d.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),m=d3.transition(d.exit()).style("opacity",1e-6).remove(),g=d3.transition(d).style("opacity",1),y=e.selectAll("g").data(c,String),b=y.enter().insert("g","path").style("opacity",1e-6),w=d3.transition(y.exit()).style("opacity",1e-6).remove(),E=d3.transition(y).style("opacity",1),S,x=Dt(t),T=e.selectAll(".domain").data([0]),N=T.enter().append("path").attr("class","domain"),C=d3.transition(T),k=t.copy(),L=this.__chart__||k;this.__chart__=k,b.append("line").attr("class","tick"),b.append("text");var A=b.select("line"),O=E.select("line"),M=y.select("text").text(h),_=b.select("text"),D=E.select("text");switch(n){case"bottom":S=In,v.attr("y2",i),g.attr("x2",0).attr("y2",i),A.attr("y2",r),_.attr("y",Math.max(r,0)+o),O.attr("x2",0).attr("y2",r),D.attr("x",0).attr("y",Math.max(r,0)+o),M.attr("dy",".71em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+s+"V0H"+x[1]+"V"+s);break;case"top":S=In,v.attr("y2",-i),g.attr("x2",0).attr("y2",-i),A.attr("y2",-r),_.attr("y",-(Math.max(r,0)+o)),O.attr("x2",0).attr("y2",-r),D.attr("x",0).attr("y",-(Math.max(r,0)+o)),M.attr("dy","0em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+ -s+"V0H"+x[1]+"V"+ -s);break;case"left":S=qn,v.attr("x2",-i),g.attr("x2",-i).attr("y2",0),A.attr("x2",-r),_.attr("x",-(Math.max(r,0)+o)),O.attr("x2",-r).attr("y2",0),D.attr("x",-(Math.max(r,0)+o)).attr("y",0),M.attr("dy",".32em").attr("text-anchor","end"),C.attr("d","M"+ -s+","+x[0]+"H0V"+x[1]+"H"+ -s);break;case"right":S=qn,v.attr("x2",i),g.attr("x2",i).attr("y2",0),A.attr("x2",r),_.attr("x",Math.max(r,0)+o),O.attr("x2",r).attr("y2",0),D.attr("x",Math.max(r,0)+o).attr("y",0),M.attr("dy",".32em").attr("text-anchor","start"),C.attr("d","M"+s+","+x[0]+"H0V"+x[1]+"H"+s)}if(t.ticks)b.call(S,L),E.call(S,k),w.call(S,k),v.call(S,L),g.call(S,k),m.call(S,k);else{var P=k.rangeBand()/2,H=function(e){return k(e)+P};b.call(S,H),E.call(S,H)}})}var t=d3.scale.linear(),n="bottom",r=6,i=6,s=6,o=3,u=[10],a=null,f,l=0;return e.scale=function(n){return arguments.length?(t=n,e):t},e.orient=function(t){return arguments.length?(n=t,e):n},e.ticks=function(){return arguments.length?(u=arguments,e):u},e.tickValues=function(t){return arguments.length?(a=t,e):a},e.tickFormat=function(t){return arguments.length?(f=t,e):f},e.tickSize=function(t,n,o){if(!arguments.length)return r;var u=arguments.length-1;return r=+t,i=u>1?+n:r,s=u>0?+arguments[u]:r,e},e.tickPadding=function(t){return arguments.length?(o=+t,e):o},e.tickSubdivide=function(t){return arguments.length?(l=+t,e):l},e},d3.svg.brush=function(){function e(s){s.each(function(){var s=d3.select(this),f=s.selectAll(".background").data([0]),l=s.selectAll(".extent").data([0]),c=s.selectAll(".resize").data(a,String),h;s.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),l.enter().append("rect").attr("class","extent").style("cursor","move"),c.enter().append("g").attr("class",function(e){return"resize "+e}).style("cursor",function(e){return uo[e]}).append("rect").attr("x",function(e){return/[ew]$/.test(e)?-3:null}).attr("y",function(e){return/^[ns]/.test(e)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),c.style("display",e.empty()?"none":null),c.exit().remove(),o&&(h=Dt(o),f.attr("x",h[0]).attr("width",h[1]-h[0]),n(s)),u&&(h=Dt(u),f.attr("y",h[0]).attr("height",h[1]-h[0]),r(s)),t(s)})}function t(e){e.selectAll(".resize").attr("transform",function(e){return"translate("+f[+/e$/.test(e)][0]+","+f[+/^s/.test(e)][1]+")"})}function n(e){e.select(".extent").attr("x",f[0][0]),e.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(e){e.select(".extent").attr("y",f[0][1]),e.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function i(){function i(){var e=d3.event.changedTouches;return e?d3.touches(v,e)[0]:d3.mouse(v)}function a(){d3.event.keyCode==32&&(S||(x=null,T[0]-=f[1][0],T[1]-=f[1][1],S=2),M())}function c(){d3.event.keyCode==32&&S==2&&(T[0]+=f[1][0],T[1]+=f[1][1],S=0,M())}function h(){var e=i(),s=!1;N&&(e[0]+=N[0],e[1]+=N[1]),S||(d3.event.altKey?(x||(x=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),T[0]=f[+(e[0]<x[0])][0],T[1]=f[+(e[1]<x[1])][1]):x=null),w&&p(e,o,0)&&(n(y),s=!0),E&&p(e,u,1)&&(r(y),s=!0),s&&(t(y),g({type:"brush",mode:S?"move":"resize"}))}function p(e,t,n){var r=Dt(t),i=r[0],s=r[1],o=T[n],u=f[1][n]-f[0][n],a,c;S&&(i-=o,s-=u+o),a=Math.max(i,Math.min(s,e[n])),S?c=(a+=o)+u:(x&&(o=Math.max(i,Math.min(s,2*x[n]-a))),o<a?(c=a,a=o):c=o);if(f[0][n]!==a||f[1][n]!==c)return l=null,f[0][n]=a,f[1][n]=c,!0}function d(){h(),y.style("pointer-events","all").selectAll(".resize").style("display",e.empty()?"none":null),d3.select("body").style("cursor",null),C.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),g({type:"brushend"}),M()}var v=this,m=d3.select(d3.event.target),g=s.of(v,arguments),y=d3.select(v),b=m.datum(),w=!/^(n|s)$/.test(b)&&o,E=!/^(e|w)$/.test(b)&&u,S=m.classed("extent"),x,T=i(),N,C=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",d).on("touchmove.brush",h).on("touchend.brush",d).on("keydown.brush",a).on("keyup.brush",c);if(S)T[0]=f[0][0]-T[0],T[1]=f[0][1]-T[1];else if(b){var k=+/w$/.test(b),L=+/^n/.test(b);N=[f[1-k][0]-T[0],f[1-L][1]-T[1]],T[0]=f[k][0],T[1]=f[L][1]}else d3.event.altKey&&(x=T.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",m.style("cursor")),g({type:"brushstart"}),h(),M()}var s=D(e,"brushstart","brush","brushend"),o=null,u=null,a=ao[0],f=[[0,0],[0,0]],l;return e.x=function(t){return arguments.length?(o=t,a=ao[!o<<1|!u],e):o},e.y=function(t){return arguments.length?(u=t,a=ao[!o<<1|!u],e):u},e.extent=function(t){var n,r,i,s,a;return arguments.length?(l=[[0,0],[0,0]],o&&(n=t[0],r=t[1],u&&(n=n[0],r=r[0]),l[0][0]=n,l[1][0]=r,o.invert&&(n=o(n),r=o(r)),r<n&&(a=n,n=r,r=a),f[0][0]=n|0,f[1][0]=r|0),u&&(i=t[0],s=t[1],o&&(i=i[1],s=s[1]),l[0][1]=i,l[1][1]=s,u.invert&&(i=u(i),s=u(s)),s<i&&(a=i,i=s,s=a),f[0][1]=i|0,f[1][1]=s|0),e):(t=l||f,o&&(n=t[0][0],r=t[1][0],l||(n=f[0][0],r=f[1][0],o.invert&&(n=o.invert(n),r=o.invert(r)),r<n&&(a=n,n=r,r=a))),u&&(i=t[0][1],s=t[1][1],l||(i=f[0][1],s=f[1][1],u.invert&&(i=u.invert(i),s=u.invert(s)),s<i&&(a=i,i=s,s=a))),o&&u?[[n,i],[r,s]]:o?[n,r]:u&&[i,s])},e.clear=function(){return l=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,e},e.empty=function(){return o&&f[0][0]===f[1][0]||u&&f[0][1]===f[1][1]},d3.rebind(e,s,"on")};var uo={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ao=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function e(){this.on("mousedown.drag",t).on("touchstart.drag",t)}function t(){function e(){var e=o.parentNode;return f?d3.touches(e).filter(function(e){return e.identifier===f})[0]:d3.mouse(e)}function t(){if(!o.parentNode)return i();var t=e(),n=t[0]-c[0],r=t[1]-c[1];h|=n|r,c=t,M(),u({type:"drag",x:t[0]+l[0],y:t[1]+l[1],dx:n,dy:r})}function i(){u({type:"dragend"}),h&&(M(),d3.event.target===a&&p.on("click.drag",s,!0)),p.on(f?"touchmove.drag-"+f:"mousemove.drag",null).on(f?"touchend.drag-"+f:"mouseup.drag",null)}function s(){M(),p.on("click.drag",null)}var o=this,u=n.of(o,arguments),a=d3.event.target,f=d3.event.touches&&d3.event.changedTouches[0].identifier,l,c=e(),h=0,p=d3.select(window).on(f?"touchmove.drag-"+f:"mousemove.drag",t).on(f?"touchend.drag-"+f:"mouseup.drag",i,!0);r?(l=r.apply(o,arguments),l=[l.x-c[0],l.y-c[1]]):l=[0,0],f||M(),u({type:"dragstart"})}var n=D(e,"drag","dragstart","dragend"),r=null;return e.origin=function(t){return arguments.length?(r=t,e):r},d3.rebind(e,n,"on")},d3.behavior.zoom=function(){function e(){this.on("mousedown.zoom",o).on("mousewheel.zoom",u).on("mousemove.zoom",a).on("DOMMouseScroll.zoom",u).on("dblclick.zoom",f).on("touchstart.zoom",l).on("touchmove.zoom",c).on("touchend.zoom",l)}function t(e){return[(e[0]-h[0])/d,(e[1]-h[1])/d]}function n(e){return[e[0]*d+h[0],e[1]*d+h[1]]}function r(e){d=Math.max(m[0],Math.min(m[1],e))}function i(e,t){t=n(t),h[0]+=e[0]-t[0],h[1]+=e[1]-t[1]}function s(e){b&&b.domain(y.range().map(function(e){return(e-h[0])/d}).map(y.invert)),E&&E.domain(w.range().map(function(e){return(e-h[1])/d}).map(w.invert)),d3.event.preventDefault(),e({type:"zoom",scale:d,translate:h})}function o(){function e(){f=1,i(d3.mouse(o),c),s(u)}function n(){f&&M(),l.on("mousemove.zoom",null).on("mouseup.zoom",null),f&&d3.event.target===a&&l.on("click.zoom",r,!0)}function r(){M(),l.on("click.zoom",null)}var o=this,u=g.of(o,arguments),a=d3.event.target,f=0,l=d3.select(window).on("mousemove.zoom",e).on("mouseup.zoom",n),c=t(d3.mouse(o));window.focus(),M()}function u(){p||(p=t(d3.mouse(this))),r(Math.pow(2,Un()*.002)*d),i(d3.mouse(this),p),s(g.of(this,arguments))}function a(){p=null}function f(){var e=d3.mouse(this),n=t(e);r(d3.event.shiftKey?d/2:d*2),i(e,n),s(g.of(this,arguments))}function l(){var e=d3.touches(this),n=Date.now();v=d,p={},e.forEach(function(e){p[e.identifier]=t(e)}),M();if(e.length===1){if(n-S<500){var o=e[0],u=t(e[0]);r(d*2),i(o,u),s(g.of(this,arguments))}S=n}}function c(){var e=d3.touches(this),t=e[0],n=p[t.identifier];if(o=e[1]){var o,u=p[o.identifier];t=[(t[0]+o[0])/2,(t[1]+o[1])/2],n=[(n[0]+u[0])/2,(n[1]+u[1])/2],r(d3.event.scale*v)}i(t,n),S=null,s(g.of(this,arguments))}var h=[0,0],p,d=1,v,m=lo,g=D(e,"zoom"),y,b,w,E,S;return e.translate=function(t){return arguments.length?(h=t.map(Number),e):h},e.scale=function(t){return arguments.length?(d=+t,e):d},e.scaleExtent=function(t){return arguments.length?(m=t==null?lo:t.map(Number),e):m},e.x=function(t){return arguments.length?(b=t,y=t.copy(),e):b},e.y=function(t){return arguments.length?(E=t,w=t.copy(),e):E},d3.rebind(e,g,"on")};var fo,lo=[0,Infinity];d3.layout={},d3.layout.bundle=function(){return function(e){var t=[],n=-1,r=e.length;while(++n<r)t.push(zn(e[n]));return t}},d3.layout.chord=function(){function e(){var e={},n=[],c=d3.range(o),h=[],p,d,v,m,g;r=[],i=[],p=0,m=-1;while(++m<o){d=0,g=-1;while(++g<o)d+=s[m][g];n.push(d),h.push(d3.range(o)),p+=d}a&&c.sort(function(e,t){return a(n[e],n[t])}),f&&h.forEach(function(e,t){e.sort(function(e,n){return f(s[t][e],s[t][n])})}),p=(2*Math.PI-u*o)/p,d=0,m=-1;while(++m<o){v=d,g=-1;while(++g<o){var y=c[m],b=h[y][g],w=s[y][b],E=d,S=d+=w*p;e[y+"-"+b]={index:y,subindex:b,startAngle:E,endAngle:S,value:w}}i[y]={index:y,startAngle:v,endAngle:d,value:(d-v)/p},d+=u}m=-1;while(++m<o){g=m-1;while(++g<o){var x=e[m+"-"+g],T=e[g+"-"+m];(x.value||T.value)&&r.push(x.value<T.value?{source:T,target:x}:{source:x,target:T})}}l&&t()}function t(){r.sort(function(e,t){return l((e.source.value+e.target.value)/2,(t.source.value+t.target.value)/2)})}var n={},r,i,s,o,u=0,a,f,l;return n.matrix=function(e){return arguments.length?(o=(s=e)&&s.length,r=i=null,n):s},n.padding=function(e){return arguments.length?(u=e,r=i=null,n):u},n.sortGroups=function(e){return arguments.length?(a=e,r=i=null,n):a},n.sortSubgroups=function(e){return arguments.length?(f=e,r=null,n):f},n.sortChords=function(e){return arguments.length?(l=e,r&&t(),n):l},n.chords=function(){return r||e(),r},n.groups=function(){return i||e(),i},n},d3.layout.force=function(){function e(e){return function(t,n,r,i,s){if(t.point!==e){var o=t.cx-e.x,u=t.cy-e.y,a=1/Math.sqrt(o*o+u*u);if((i-n)*a<d){var f=t.charge*a*a;return e.px-=o*f,e.py-=u*f,!0}if(t.point&&isFinite(a)){var f=t.pointCharge*a*a;e.px-=o*f,e.py-=u*f}}return!t.charge}}function t(e){e.px=d3.event.x,e.py=d3.event.y,n.resume()}var n={},r=d3.dispatch("start","tick","end"),s=[1,1],o,a,f=.9,l=Gn,c=Yn,h=-30,p=.1,d=.8,v,m=[],g=[],y,b,w;return n.tick=function(){if((a*=.99)<.005)return r.end({type:"end",alpha:a=0}),!0;var t=m.length,n=g.length,i,o,u,l,c,d,v,E,S;for(o=0;o<n;++o){u=g[o],l=u.source,c=u.target,E=c.x-l.x,S=c.y-l.y;if(d=E*E+S*S)d=a*b[o]*((d=Math.sqrt(d))-y[o])/d,E*=d,S*=d,c.x-=E*(v=l.weight/(c.weight+l.weight)),c.y-=S*v,l.x+=E*(v=1-v),l.y+=S*v}if(v=a*p){E=s[0]/2,S=s[1]/2,o=-1;if(v)while(++o<t)u=m[o],u.x+=(E-u.x)*v,u.y+=(S-u.y)*v}if(h){Qn(i=d3.geom.quadtree(m),a,w),o=-1;while(++o<t)(u=m[o]).fixed||i.visit(e(u))}o=-1;while(++o<t)u=m[o],u.fixed?(u.x=u.px,u.y=u.py):(u.x-=(u.px-(u.px=u.x))*f,u.y-=(u.py-(u.py=u.y))*f);r.tick({type:"tick",alpha:a})},n.nodes=function(e){return arguments.length?(m=e,n):m},n.links=function(e){return arguments.length?(g=e,n):g},n.size=function(e){return arguments.length?(s=e,n):s},n.linkDistance=function(e){return arguments.length?(l=u(e),n):l},n.distance=n.linkDistance,n.linkStrength=function(e){return arguments.length?(c=u(e),n):c},n.friction=function(e){return arguments.length?(f=e,n):f},n.charge=function(e){return arguments.length?(h=typeof e=="function"?e:+e,n):h},n.gravity=function(e){return arguments.length?(p=e,n):p},n.theta=function(e){return arguments.length?(d=e,n):d},n.alpha=function(e){return arguments.length?(a?e>0?a=e:a=0:e>0&&(r.start({type:"start",alpha:a=e}),d3.timer(n.tick)),n):a},n.start=function(){function e(e,n){var i=t(r),s=-1,o=i.length,u;while(++s<o)if(!isNaN(u=i[s][e]))return u;return Math.random()*n}function t(){if(!p){p=[];for(i=0;i<o;++i)p[i]=[];for(i=0;i<u;++i){var e=g[i];p[e.source.index].push(e.target),p[e.target.index].push(e.source)}}return p[r]}var r,i,o=m.length,u=g.length,a=s[0],f=s[1],p,d;for(r=0;r<o;++r)(d=m[r]).index=r,d.weight=0;y=[],b=[];for(r=0;r<u;++r)d=g[r],typeof d.source=="number"&&(d.source=m[d.source]),typeof d.target=="number"&&(d.target=m[d.target]),y[r]=l.call(this,d,r),b[r]=c.call(this,d,r),++d.source.weight,++d.target.weight;for(r=0;r<o;++r)d=m[r],isNaN(d.x)&&(d.x=e("x",a)),isNaN(d.y)&&(d.y=e("y",f)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);w=[];if(typeof h=="function")for(r=0;r<o;++r)w[r]=+h.call(this,m[r],r);else for(r=0;r<o;++r)w[r]=h;return n.resume()},n.resume=function(){return n.alpha(.1)},n.stop=function(){return n.alpha(0)},n.drag=function(){o||(o=d3.behavior.drag().origin(i).on("dragstart",Vn).on("drag",t).on("dragend",$n)),this.on("mouseover.force",Jn).on("mouseout.force",Kn).call(o)},d3.rebind(n,r,"on")},d3.layout.partition=function(){function e(t,n,r,i){var s=t.children;t.x=n,t.y=t.depth*i,t.dx=r,t.dy=i;if(s&&(u=s.length)){var o=-1,u,a,f;r=t.value?r/t.value:0;while(++o<u)e(a=s[o],n,f=a.value*r,i),n+=f}}function t(e){var n=e.children,r=0;if(n&&(s=n.length)){var i=-1,s;while(++i<s)r=Math.max(r,t(n[i]))}return 1+r}function n(n,s){var o=r.call(this,n,s);return e(o[0],0,i[0],i[1]/t(o[0])),o}var r=d3.layout.hierarchy(),i=[1,1];return n.size=function(e){return arguments.length?(i=e,n):i},lr(n,r)},d3.layout.pie=function(){function e(s,o){var u=s.map(function(n,r){return+t.call(e,n,r)}),a=+(typeof r=="function"?r.apply(this,arguments):r),f=((typeof i=="function"?i.apply(this,arguments):i)-r)/d3.sum(u),l=d3.range(s.length);n!=null&&l.sort(n===co?function(e,t){return u[t]-u[e]}:function(e,t){return n(s[e],s[t])});var c=[];return l.forEach(function(e){var t;c[e]={data:s[e],value:t=u[e],startAngle:a,endAngle:a+=t*f}}),c}var t=Number,n=co,r=0,i=2*Math.PI;return e.value=function(n){return arguments.length?(t=n,e):t},e.sort=function(t){return arguments.length?(n=t,e):n},e.startAngle=function(t){return arguments.length?(r=t,e):r},e.endAngle=function(t){return arguments.length?(i=t,e):i},e};var co={};d3.layout.stack=function(){function e(i,a){var f=i.map(function(n,r){return t.call(e,n,r)}),l=f.map(function(t,n){return t.map(function(t,n){return[o.call(e,t,n),u.call(e,t,n)]})}),c=n.call(e,l,a);f=d3.permute(f,c),l=d3.permute(l,c);var h=r.call(e,l,a),p=f.length,d=f[0].length,v,m,g;for(m=0;m<d;++m){s.call(e,f[0][m],g=h[m],l[0][m][1]);for(v=1;v<p;++v)s.call(e,f[v][m],g+=l[v-1][m][1],l[v][m][1])}return i}var t=i,n=nr,r=rr,s=tr,o=Zn,u=er;return e.values=function(n){return arguments.length?(t=n,e):t},e.order=function(t){return arguments.length?(n=typeof t=="function"?t:ho.get(t)||nr,e):n},e.offset=function(t){return arguments.length?(r=typeof t=="function"?t:po.get(t)||rr,e):r},e.x=function(t){return arguments.length?(o=t,e):o},e.y=function(t){return arguments.length?(u=t,e):u},e.out=function(t){return arguments.length?(s=t,e):s},e};var ho=d3.map({"inside-out":function(e){var t=e.length,n,r,i=e.map(ir),s=e.map(sr),o=d3.range(t).sort(function(e,t){return i[e]-i[t]}),u=0,a=0,f=[],l=[];for(n=0;n<t;++n)r=o[n],u<a?(u+=s[r],f.push(r)):(a+=s[r],l.push(r));return l.reverse().concat(f)},reverse:function(e){return d3.range(e.length).reverse()},"default":nr}),po=d3.map({silhouette:function(e){var t=e.length,n=e[0].length,r=[],i=0,s,o,u,a=[];for(o=0;o<n;++o){for(s=0,u=0;s<t;s++)u+=e[s][o][1];u>i&&(i=u),r.push(u)}for(o=0;o<n;++o)a[o]=(i-r[o])/2;return a},wiggle:function(e){var t=e.length,n=e[0],r=n.length,i=0,s,o,u,a,f,l,c,h,p,d=[];d[0]=h=p=0;for(o=1;o<r;++o){for(s=0,a=0;s<t;++s)a+=e[s][o][1];for(s=0,f=0,c=n[o][0]-n[o-1][0];s<t;++s){for(u=0,l=(e[s][o][1]-e[s][o-1][1])/(2*c);u<s;++u)l+=(e[u][o][1]-e[u][o-1][1])/c;f+=l*e[s][o][1]}d[o]=h-=a?f/a*c:0,h<p&&(p=h)}for(o=0;o<r;++o)d[o]-=p;return d},expand:function(e){var t=e.length,n=e[0].length,r=1/t,i,s,o,u=[];for(s=0;s<n;++s){for(i=0,o=0;i<t;i++)o+=e[i][s][1];if(o)for(i=0;i<t;i++)e[i][s][1]/=o;else for(i=0;i<t;i++)e[i][s][1]=r}for(s=0;s<n;++s)u[s]=0;return u},zero:rr});d3.layout.histogram=function(){function e(e,s){var o=[],u=e.map(n,this),a=r.call(this,u,s),f=i.call(this,a,u,s),l,s=-1,c=u.length,h=f.length-1,p=t?1:1/c,d;while(++s<h)l=o[s]=[],l.dx=f[s+1]-(l.x=f[s]),l.y=0;if(h>0){s=-1;while(++s<c)d=u[s],d>=a[0]&&d<=a[1]&&(l=o[d3.bisect(f,d,1,h)-1],l.y+=p,l.push(e[s]))}return o}var t=!0,n=Number,r=fr,i=ur;return e.value=function(t){return arguments.length?(n=t,e):n},e.range=function(t){return arguments.length?(r=u(t),e):r},e.bins=function(t){return arguments.length?(i=typeof t=="number"?function(e){return ar(e,t)}:u(t),e):i},e.frequency=function(n){return arguments.length?(t=!!n,e):t},e},d3.layout.hierarchy=function(){function e(t,o,u){var a=i.call(n,t,o),f=vo?t:{data:t};f.depth=o,u.push(f);if(a&&(c=a.length)){var l=-1,c,h=f.children=[],p=0,d=o+1,v;while(++l<c)v=e(a[l],d,u),v.parent=f,h.push(v),p+=v.value;r&&h.sort(r),s&&(f.value=p)}else s&&(f.value=+s.call(n,t,o)||0);return f}function t(e,r){var i=e.children,o=0;if(i&&(a=i.length)){var u=-1,a,f=r+1;while(++u<a)o+=t(i[u],f)}else s&&(o=+s.call(n,vo?e:e.data,r)||0);return s&&(e.value=o),o}function n(t){var n=[];return e(t,0,n),n}var r=pr,i=cr,s=hr;return n.sort=function(e){return arguments.length?(r=e,n):r},n.children=function(e){return arguments.length?(i=e,n):i},n.value=function(e){return arguments.length?(s=e,n):s},n.revalue=function(e){return t(e,0),e},n};var vo=!1;d3.layout.pack=function(){function e(e,i){var s=t.call(this,e,i),o=s[0];o.x=0,o.y=0,Hr(o,function(e){e.r=Math.sqrt(e.value)}),Hr(o,br);var u=r[0],a=r[1],f=Math.max(2*o.r/u,2*o.r/a);if(n>0){var l=n*f/2;Hr(o,function(e){e.r+=l}),Hr(o,br),Hr(o,function(e){e.r-=l}),f=Math.max(2*o.r/u,2*o.r/a)}return Sr(o,u/2,a/2,1/f),s}var t=d3.layout.hierarchy().sort(vr),n=0,r=[1,1];return e.size=function(t){return arguments.length?(r=t,e):r},e.padding=function(t){return arguments.length?(n=+t,e):n},lr(e,t)},d3.layout.cluster=function(){function e(e,i){var s=t.call(this,e,i),o=s[0],u,a=0,f,l;Hr(o,function(e){var t=e.children;t&&t.length?(e.x=Nr(t),e.y=Tr(t)):(e.x=u?a+=n(e,u):0,e.y=0,u=e)});var c=Cr(o),h=kr(o),p=c.x-n(c,h)/2,d=h.x+n(h,c)/2;return Hr(o,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=(1-(o.y?e.y/o.y:1))*r[1]}),s}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.tree=function(){function e(e,i){function s(e,t){var r=e.children,i=e._tree;if(r&&(o=r.length)){var o,a=r[0],f,l=a,c,h=-1;while(++h<o)c=r[h],s(c,f),l=u(c,f,l),f=c;Br(e);var p=.5*(a._tree.prelim+c._tree.prelim);t?(i.prelim=t._tree.prelim+n(e,t),i.mod=i.prelim-p):i.prelim=p}else t&&(i.prelim=t._tree.prelim+n(e,t))}function o(e,t){e.x=e._tree.prelim+t;var n=e.children;if(n&&(i=n.length)){var r=-1,i;t+=e._tree.mod;while(++r<i)o(n[r],t)}}function u(e,t,r){if(t){var i=e,s=e,o=t,u=e.parent.children[0],a=i._tree.mod,f=s._tree.mod,l=o._tree.mod,c=u._tree.mod,h;while(o=Or(o),i=Ar(i),o&&i)u=Ar(u),s=Or(s),s._tree.ancestor=e,h=o._tree.prelim+l-i._tree.prelim-a+n(o,i),h>0&&(jr(Fr(o,e,r),e,h),a+=h,f+=h),l+=o._tree.mod,a+=i._tree.mod,c+=u._tree.mod,f+=s._tree.mod;o&&!Or(s)&&(s._tree.thread=o,s._tree.mod+=l-f),i&&!Ar(u)&&(u._tree.thread=i,u._tree.mod+=a-c,r=e)}return r}var a=t.call(this,e,i),f=a[0];Hr(f,function(e,t){e._tree={ancestor:e,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),s(f),o(f,-f._tree.prelim);var l=Mr(f,Dr),c=Mr(f,_r),h=Mr(f,Pr),p=l.x-n(l,c)/2,d=c.x+n(c,l)/2,v=h.depth||1;return Hr(f,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=e.depth/v*r[1],delete e._tree}),a}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.treemap=function(){function e(e,t){var n=-1,r=e.length,i,s;while(++n<r)s=(i=e[n]).value*(t<0?0:t),i.area=isNaN(s)||s<=0?0:s}function t(n){var s=n.children;if(s&&s.length){var o=l(n),u=[],a=s.slice(),f,c=Infinity,h,p=Math.min(o.dx,o.dy),d;e(a,o.dx*o.dy/n.value),u.area=0;while((d=a.length)>0)u.push(f=a[d-1]),u.area+=f.area,(h=r(u,p))<=c?(a.pop(),c=h):(u.area-=u.pop().area,i(u,p,o,!1),p=Math.min(o.dx,o.dy),u.length=u.area=0,c=Infinity);u.length&&(i(u,p,o,!0),u.length=u.area=0),s.forEach(t)}}function n(t){var r=t.children;if(r&&r.length){var s=l(t),o=r.slice(),u,a=[];e(o,s.dx*s.dy/t.value),a.area=0;while(u=o.pop())a.push(u),a.area+=u.area,u.z!=null&&(i(a,u.z?s.dx:s.dy,s,!o.length),a.length=a.area=0);r.forEach(n)}}function r(e,t){var n=e.area,r,i=0,s=Infinity,o=-1,u=e.length;while(++o<u){if(!(r=e[o].area))continue;r<s&&(s=r),r>i&&(i=r)}return n*=n,t*=t,n?Math.max(t*i*p/n,n/(t*s*p)):Infinity}function i(e,t,n,r){var i=-1,s=e.length,o=n.x,a=n.y,f=t?u(e.area/t):0,l;if(t==n.dx){if(r||f>n.dy)f=n.dy;while(++i<s)l=e[i],l.x=o,l.y=a,l.dy=f,o+=l.dx=Math.min(n.x+n.dx-o,f?u(l.area/f):0);l.z=!0,l.dx+=n.x+n.dx-o,n.y+=f,n.dy-=f}else{if(r||f>n.dx)f=n.dx;while(++i<s)l=e[i],l.x=o,l.y=a,l.dx=f,a+=l.dy=Math.min(n.y+n.dy-a,f?u(l.area/f):0);l.z=!1,l.dy+=n.y+n.dy-a,n.x+=f,n.dx-=f}}function s(r){var i=h||o(r),s=i[0];return s.x=0,s.y=0,s.dx=a[0],s.dy=a[1],h&&o.revalue(s),e([s],s.dx*s.dy/s.value),(h?n:t)(s),c&&(h=i),i}var o=d3.layout.hierarchy(),u=Math.round,a=[1,1],f=null,l=Ir,c=!1,h,p=.5*(1+Math.sqrt(5));return s.size=function(e){return arguments.length?(a=e,s):a},s.padding=function(e){function t(t){var n=e.call(s,t,t.depth);return n==null?Ir(t):qr(t,typeof n=="number"?[n,n,n,n]:n)}function n(t){return qr(t,e)}if(!arguments.length)return f;var r;return l=(f=e)==null?Ir:(r=typeof e)==="function"?t:r==="number"?(e=[e,e,e,e],n):n,s},s.round=function(e){return arguments.length?(u=e?Math.round:Number,s):u!=Number},s.sticky=function(e){return arguments.length?(c=e,h=null,s):c},s.ratio=function(e){return arguments.length?(p=e,s):p},lr(s,o)},d3.csv=Rr(",","text/csv"),d3.tsv=Rr(" ","text/tab-separated-values"),d3.geo={};var mo=Math.PI/180;d3.geo.azimuthal=function(){function e(e){var n=e[0]*mo-s,o=e[1]*mo,f=Math.cos(n),l=Math.sin(n),c=Math.cos(o),h=Math.sin(o),p=t!=="orthographic"?a*h+u*c*f:null,d,v=t==="stereographic"?1/(1+p):t==="gnomonic"?1/p:t==="equidistant"?(d=Math.acos(p),d?d/Math.sin(d):0):t==="equalarea"?Math.sqrt(2/(1+p)):1,m=v*c*l,g=v*(a*c*f-u*h);return[r*m+i[0],r*g+i[1]]}var t="orthographic",n,r=200,i=[480,250],s,o,u,a;return e.invert=function(e){var n=(e[0]-i[0])/r,o=(e[1]-i[1])/r,f=Math.sqrt(n*n+o*o),l=t==="stereographic"?2*Math.atan(f):t==="gnomonic"?Math.atan(f):t==="equidistant"?f:t==="equalarea"?2*Math.asin(.5*f):Math.asin(f),c=Math.sin(l),h=Math.cos(l);return[(s+Math.atan2(n*c,f*u*h+o*a*c))/mo,Math.asin(h*a-(f?o*c*u/f:0))/mo]},e.mode=function(n){return arguments.length?(t=n+"",e):t},e.origin=function(t){return arguments.length?(n=t,s=n[0]*mo,o=n[1]*mo,u=Math.cos(o),a=Math.sin(o),e):n},e.scale=function(t){return arguments.length?(r=+t,e):r},e.translate=function(t){return arguments.length?(i=[+t[0],+t[1]],e):i},e.origin([0,0])},d3.geo.albers=function(){function e(e){var t=u*(mo*e[0]-o),n=Math.sqrt(a-2*u*Math.sin(mo*e[1]))/u;return[i*n*Math.sin(t)+s[0],i*(n*Math.cos(t)-f)+s[1]]}function t(){var t=mo*r[0],i=mo*r[1],s=mo*n[1],l=Math.sin(t),c=Math.cos(t);return o=mo*n[0],u=.5*(l+Math.sin(i)),a=c*c+2*u*l,f=Math.sqrt(a-2*u*Math.sin(s))/u,e}var n=[-98,38],r=[29.5,45.5],i=1e3,s=[480,250],o,u,a,f;return e.invert=function(e){var t=(e[0]-s[0])/i,n=(e[1]-s[1])/i,r=f+n,l=Math.atan2(t,r),c=Math.sqrt(t*t+r*r);return[(o+l/u)/mo,Math.asin((a-c*c*u*u)/(2*u))/mo]},e.origin=function(e){return arguments.length?(n=[+e[0],+e[1]],t()):n},e.parallels=function(e){return arguments.length?(r=[+e[0],+e[1]],t()):r},e.scale=function(t){return arguments.length?(i=+t,e):i},e.translate=function(t){return arguments.length?(s=[+t[0],+t[1]],e):s},t()},d3.geo.albersUsa=function(){function e(e){var s=e[0],o=e[1];return(o>50?n:s<-140?r:o<21?i:t)(e)}var t=d3.geo.albers(),n=d3.geo.albers().origin([-160,60]).parallels([55,65]),r=d3.geo.albers().origin([-160,20]).parallels([8,18]),i=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(s){return arguments.length?(t.scale(s),n.scale(s*.6),r.scale(s),i.scale(s*1.5),e.translate(t.translate())):t.scale()},e.translate=function(s){if(!arguments.length)return t.translate();var o=t.scale()/1e3,u=s[0],a=s[1];return t.translate(s),n.translate([u-400*o,a+170*o]),r.translate([u-190*o,a+200*o]),i.translate([u+580*o,a+430*o]),e},e.scale(t.scale())},d3.geo.bonne=function(){function e(e){var u=e[0]*mo-r,a=e[1]*mo-i;if(s){var f=o+s-a,l=u*Math.cos(a)/f;u=f*Math.sin(l),a=f*Math.cos(l)-o}else u*=Math.cos(a),a*=-1;return[t*u+n[0],t*a+n[1]]}var t=200,n=[480,250],r,i,s,o;return e.invert=function(e){var i=(e[0]-n[0])/t,u=(e[1]-n[1])/t;if(s){var a=o+u,f=Math.sqrt(i*i+a*a);u=o+s-f,i=r+f*Math.atan2(i,a)/Math.cos(u)}else u*=-1,i/=Math.cos(u);return[i/mo,u/mo]},e.parallel=function(t){return arguments.length?(o=1/Math.tan(s=t*mo),e):s/mo},e.origin=function(t){return arguments.length?(r=t[0]*mo,i=t[1]*mo,e):[r/mo,i/mo]},e.scale=function( -n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function e(e){var r=e[0]/360,i=-e[1]/360;return[t*r+n[0],t*i+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,-360*i]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.mercator=function(){function e(e){var r=e[0]/360,i=-(Math.log(Math.tan(Math.PI/4+e[1]*mo/2))/mo)/360;return[t*r+n[0],t*Math.max(-0.5,Math.min(.5,i))+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,2*Math.atan(Math.exp(-360*i*mo))/mo-90]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.path=function(){function e(e,t){typeof s=="function"&&(o=zr(s.apply(this,arguments))),f(e);var n=a.length?a.join(""):null;return a=[],n}function t(e){return u(e).join(",")}function n(e){var t=i(e[0]),n=0,r=e.length;while(++n<r)t-=i(e[n]);return t}function r(e){var t=d3.geom.polygon(e[0].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i=r[0],s=r[1],o=n,a=0,f=e.length;while(++a<f)t=d3.geom.polygon(e[a].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i-=r[0],s-=r[1],o-=n;return[i,s,6*o]}function i(e){return Math.abs(d3.geom.polygon(e.map(u)).area())}var s=4.5,o=zr(s),u=d3.geo.albersUsa(),a=[],f=Ur({FeatureCollection:function(e){var t=e.features,n=-1,r=t.length;while(++n<r)a.push(f(t[n].geometry))},Feature:function(e){f(e.geometry)},Point:function(e){a.push("M",t(e.coordinates),o)},MultiPoint:function(e){var n=e.coordinates,r=-1,i=n.length;while(++r<i)a.push("M",t(n[r]),o)},LineString:function(e){var n=e.coordinates,r=-1,i=n.length;a.push("M");while(++r<i)a.push(t(n[r]),"L");a.pop()},MultiLineString:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1,u=s.length,a.push("M");while(++o<u)a.push(t(s[o]),"L");a.pop()}},Polygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1;if((u=s.length-1)>0){a.push("M");while(++o<u)a.push(t(s[o]),"L");a[a.length-1]="Z"}}},MultiPolygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u,f,l,c;while(++r<i){s=n[r],o=-1,u=s.length;while(++o<u){f=s[o],l=-1;if((c=f.length-1)>0){a.push("M");while(++l<c)a.push(t(f[l]),"L");a[a.length-1]="Z"}}}},GeometryCollection:function(e){var t=e.geometries,n=-1,r=t.length;while(++n<r)a.push(f(t[n]))}}),l=e.area=Ur({FeatureCollection:function(e){var t=0,n=e.features,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t},Feature:function(e){return l(e.geometry)},Polygon:function(e){return n(e.coordinates)},MultiPolygon:function(e){var t=0,r=e.coordinates,i=-1,s=r.length;while(++i<s)t+=n(r[i]);return t},GeometryCollection:function(e){var t=0,n=e.geometries,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t}},0),c=e.centroid=Ur({Feature:function(e){return c(e.geometry)},Polygon:function(e){var t=r(e.coordinates);return[t[0]/t[2],t[1]/t[2]]},MultiPolygon:function(e){var t=0,n=e.coordinates,i,s=0,o=0,u=0,a=-1,f=n.length;while(++a<f)i=r(n[a]),s+=i[0],o+=i[1],u+=i[2];return[s/u,o/u]}});return e.projection=function(t){return u=t,e},e.pointRadius=function(t){return typeof t=="function"?s=t:(s=+t,o=zr(s)),e},e},d3.geo.bounds=function(e){var t=Infinity,n=Infinity,r=-Infinity,i=-Infinity;return Wr(e,function(e,s){e<t&&(t=e),e>r&&(r=e),s<n&&(n=s),s>i&&(i=s)}),[[t,n],[r,i]]};var go={Feature:Xr,FeatureCollection:Vr,GeometryCollection:$r,LineString:Jr,MultiLineString:Kr,MultiPoint:Jr,MultiPolygon:Qr,Point:Gr,Polygon:Yr};d3.geo.circle=function(){function e(){}function t(e){return a.distance(e)<u}function n(e){var t=-1,n=e.length,i=[],s,o,f,l,c;while(++t<n)c=a.distance(f=e[t]),c<u?(o&&i.push(ni(o,f)((l-u)/(l-c))),i.push(f),s=o=null):(o=f,!s&&i.length&&(i.push(ni(i[i.length-1],o)((u-l)/(c-l))),s=o)),l=c;return s=e[0],o=i[0],o&&f[0]===s[0]&&f[1]===s[1]&&(f[0]!==o[0]||f[1]!==o[1])&&i.push(o),r(i)}function r(e){var t=0,n=e.length,r,i,s=n?[e[0]]:e,o,u=a.source();while(++t<n){o=a.source(e[t-1])(e[t]).coordinates;for(r=0,i=o.length;++r<i;)s.push(o[r])}return a.source(u),s}var s=[0,0],o=89.99,u=o*mo,a=d3.geo.greatArc().source(s).target(i);e.clip=function(e){return typeof s=="function"&&a.source(s.apply(this,arguments)),f(e)||null};var f=Ur({FeatureCollection:function(e){var t=e.features.map(f).filter(i);return t&&(e=Object.create(e),e.features=t,e)},Feature:function(e){var t=f(e.geometry);return t&&(e=Object.create(e),e.geometry=t,e)},Point:function(e){return t(e.coordinates)&&e},MultiPoint:function(e){var n=e.coordinates.filter(t);return n.length&&{type:e.type,coordinates:n}},LineString:function(e){var t=n(e.coordinates);return t.length&&(e=Object.create(e),e.coordinates=t,e)},MultiLineString:function(e){var t=e.coordinates.map(n).filter(function(e){return e.length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},Polygon:function(e){var t=e.coordinates.map(n);return t[0].length&&(e=Object.create(e),e.coordinates=t,e)},MultiPolygon:function(e){var t=e.coordinates.map(function(e){return e.map(n)}).filter(function(e){return e[0].length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},GeometryCollection:function(e){var t=e.geometries.map(f).filter(i);return t.length&&(e=Object.create(e),e.geometries=t,e)}});return e.origin=function(t){return arguments.length?(s=t,typeof s!="function"&&a.source(s),e):s},e.angle=function(t){return arguments.length?(u=(o=+t)*mo,e):o},d3.rebind(e,a,"precision")},d3.geo.greatArc=function(){function e(){var t=e.distance.apply(this,arguments),r=0,u=s/t,a=[n];while((r+=u)<1)a.push(o(r));return a.push(i),{type:"LineString",coordinates:a}}var t=Zr,n,r=ei,i,s=6*mo,o=ti();return e.distance=function(){return typeof t=="function"&&o.source(n=t.apply(this,arguments)),typeof r=="function"&&o.target(i=r.apply(this,arguments)),o.distance()},e.source=function(r){return arguments.length?(t=r,typeof t!="function"&&o.source(n=t),e):t},e.target=function(t){return arguments.length?(r=t,typeof r!="function"&&o.target(i=r),e):r},e.precision=function(t){return arguments.length?(s=t*mo,e):s/mo},e},d3.geo.greatCircle=d3.geo.circle,d3.geom={},d3.geom.contour=function(e,t){var n=t||ri(e),r=[],i=n[0],s=n[1],o=0,u=0,a=NaN,f=NaN,l=0;do l=0,e(i-1,s-1)&&(l+=1),e(i,s-1)&&(l+=2),e(i-1,s)&&(l+=4),e(i,s)&&(l+=8),l===6?(o=f===-1?-1:1,u=0):l===9?(o=0,u=a===1?-1:1):(o=yo[l],u=bo[l]),o!=a&&u!=f&&(r.push([i,s]),a=o,f=u),i+=o,s+=u;while(n[0]!=i||n[1]!=s);return r};var yo=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],bo=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(e){if(e.length<3)return[];var t=e.length,n=t-1,r=[],i=[],s,o,u=0,a,f,l,c,h,p,d,v;for(s=1;s<t;++s)e[s][1]<e[u][1]?u=s:e[s][1]==e[u][1]&&(u=e[s][0]<e[u][0]?s:u);for(s=0;s<t;++s){if(s===u)continue;f=e[s][1]-e[u][1],a=e[s][0]-e[u][0],r.push({angle:Math.atan2(f,a),index:s})}r.sort(function(e,t){return e.angle-t.angle}),d=r[0].angle,p=r[0].index,h=0;for(s=1;s<n;++s)o=r[s].index,d==r[s].angle?(a=e[p][0]-e[u][0],f=e[p][1]-e[u][1],l=e[o][0]-e[u][0],c=e[o][1]-e[u][1],a*a+f*f>=l*l+c*c?r[s].index=-1:(r[h].index=-1,d=r[s].angle,h=s,p=o)):(d=r[s].angle,h=s,p=o);i.push(u);for(s=0,o=0;s<2;++o)r[o].index!==-1&&(i.push(r[o].index),s++);v=i.length;for(;o<n;++o){if(r[o].index===-1)continue;while(!ii(i[v-2],i[v-1],r[o].index,e))--v;i[v++]=r[o].index}var m=[];for(s=0;s<v;++s)m.push(e[i[s]]);return m},d3.geom.polygon=function(e){return e.area=function(){var t=0,n=e.length,r=e[n-1][0]*e[0][1],i=e[n-1][1]*e[0][0];while(++t<n)r+=e[t-1][0]*e[t][1],i+=e[t-1][1]*e[t][0];return(i-r)*.5},e.centroid=function(t){var n=-1,r=e.length,i=0,s=0,o,u=e[r-1],a;arguments.length||(t=-1/(6*e.area()));while(++n<r)o=u,u=e[n],a=o[0]*u[1]-u[0]*o[1],i+=(o[0]+u[0])*a,s+=(o[1]+u[1])*a;return[i*t,s*t]},e.clip=function(t){var n,r=-1,i=e.length,s,o,u=e[i-1],a,f,l;while(++r<i){n=t.slice(),t.length=0,a=e[r],f=n[(o=n.length)-1],s=-1;while(++s<o)l=n[s],si(l,u,a)?(si(f,u,a)||t.push(oi(f,l,u,a)),t.push(l)):si(f,u,a)&&t.push(oi(f,l,u,a)),f=l;u=a}return t},e},d3.geom.voronoi=function(e){var t=e.map(function(){return[]});return ui(e,function(e){var n,r,i,s,o,u;e.a===1&&e.b>=0?(n=e.ep.r,r=e.ep.l):(n=e.ep.l,r=e.ep.r),e.a===1?(o=n?n.y:-1e6,i=e.c-e.b*o,u=r?r.y:1e6,s=e.c-e.b*u):(i=n?n.x:-1e6,o=e.c-e.a*i,s=r?r.x:1e6,u=e.c-e.a*s);var a=[i,o],f=[s,u];t[e.region.l.index].push(a,f),t[e.region.r.index].push(a,f)}),t.map(function(t,n){var r=e[n][0],i=e[n][1];return t.forEach(function(e){e.angle=Math.atan2(e[0]-r,e[1]-i)}),t.sort(function(e,t){return e.angle-t.angle}).filter(function(e,n){return!n||e.angle-t[n-1].angle>1e-10})})};var wo={l:"r",r:"l"};d3.geom.delaunay=function(e){var t=e.map(function(){return[]}),n=[];return ui(e,function(n){t[n.region.l.index].push(e[n.region.r.index])}),t.forEach(function(t,r){var i=e[r],s=i[0],o=i[1];t.forEach(function(e){e.angle=Math.atan2(e[0]-s,e[1]-o)}),t.sort(function(e,t){return e.angle-t.angle});for(var u=0,a=t.length-1;u<a;u++)n.push([i,t[u],t[u+1]])}),n},d3.geom.quadtree=function(e,t,n,r,i){function s(e,t,n,r,i,s){if(isNaN(t.x)||isNaN(t.y))return;if(e.leaf){var u=e.point;u?Math.abs(u.x-t.x)+Math.abs(u.y-t.y)<.01?o(e,t,n,r,i,s):(e.point=null,o(e,u,n,r,i,s),o(e,t,n,r,i,s)):e.point=t}else o(e,t,n,r,i,s)}function o(e,t,n,r,i,o){var u=(n+i)*.5,a=(r+o)*.5,f=t.x>=u,l=t.y>=a,c=(l<<1)+f;e.leaf=!1,e=e.nodes[c]||(e.nodes[c]=ai()),f?n=u:i=u,l?r=a:o=a,s(e,t,n,r,i,o)}var u,a=-1,f=e.length;f&&isNaN(e[0].x)&&(e=e.map(li));if(arguments.length<5)if(arguments.length===3)i=r=n,n=t;else{t=n=Infinity,r=i=-Infinity;while(++a<f)u=e[a],u.x<t&&(t=u.x),u.y<n&&(n=u.y),u.x>r&&(r=u.x),u.y>i&&(i=u.y);var l=r-t,c=i-n;l>c?i=n+l:r=t+c}var h=ai();return h.add=function(e){s(h,e,t,n,r,i)},h.visit=function(e){fi(e,h,t,n,r,i)},e.forEach(h.add),h},d3.time={};var Eo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ci.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){xo.setUTCDate.apply(this._,arguments)},setDay:function(){xo.setUTCDay.apply(this._,arguments)},setFullYear:function(){xo.setUTCFullYear.apply(this._,arguments)},setHours:function(){xo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){xo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){xo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){xo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){xo.setUTCSeconds.apply(this._,arguments)},setTime:function(){xo.setTime.apply(this._,arguments)}};var xo=Date.prototype,To="%a %b %e %H:%M:%S %Y",No="%m/%d/%y",Co="%H:%M:%S",ko=So,Lo=ko.map(hi),Ao=["January","February","March","April","May","June","July","August","September","October","November","December"],Oo=Ao.map(hi);d3.time.format=function(e){function t(t){var r=[],i=-1,s=0,o,u;while(++i<n)e.charCodeAt(i)==37&&(r.push(e.substring(s,i),(u=Ro[o=e.charAt(++i)])?u(t):o),s=i+1);return r.push(e.substring(s,i)),r.join("")}var n=e.length;return t.parse=function(t){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=pi(n,e,t,0);if(r!=t.length)return null;"p"in n&&(n.H=n.H%12+n.p*12);var i=new Eo;return i.setFullYear(n.y,n.m,n.d),i.setHours(n.H,n.M,n.S,n.L),i},t.toString=function(){return e},t};var Mo=d3.format("02d"),_o=d3.format("03d"),Do=d3.format("04d"),Po=d3.format("2d"),Ho=di(ko),Bo=di(Lo),jo=di(Ao),Fo=vi(Ao),Io=di(Oo),qo=vi(Oo),Ro={a:function(e){return Lo[e.getDay()]},A:function(e){return ko[e.getDay()]},b:function(e){return Oo[e.getMonth()]},B:function(e){return Ao[e.getMonth()]},c:d3.time.format(To),d:function(e){return Mo(e.getDate())},e:function(e){return Po(e.getDate())},H:function(e){return Mo(e.getHours())},I:function(e){return Mo(e.getHours()%12||12)},j:function(e){return _o(1+d3.time.dayOfYear(e))},L:function(e){return _o(e.getMilliseconds())},m:function(e){return Mo(e.getMonth()+1)},M:function(e){return Mo(e.getMinutes())},p:function(e){return e.getHours()>=12?"PM":"AM"},S:function(e){return Mo(e.getSeconds())},U:function(e){return Mo(d3.time.sundayOfYear(e))},w:function(e){return e.getDay()},W:function(e){return Mo(d3.time.mondayOfYear(e))},x:d3.time.format(No),X:d3.time.format(Co),y:function(e){return Mo(e.getFullYear()%100)},Y:function(e){return Do(e.getFullYear()%1e4)},Z:Di,"%":function(e){return"%"}},Uo={a:mi,A:gi,b:yi,B:bi,c:wi,d:ki,e:ki,H:Li,I:Li,L:Mi,m:Ci,M:Ai,p:_i,S:Oi,x:Ei,X:Si,y:Ti,Y:xi},zo=/^\s*\d+/,Wo=d3.map({am:0,pm:1});d3.time.format.utc=function(e){function t(e){try{Eo=ci;var t=new Eo;return t._=e,n(t)}finally{Eo=Date}}var n=d3.time.format(e);return t.parse=function(e){try{Eo=ci;var t=n.parse(e);return t&&t._}finally{Eo=Date}},t.toString=n.toString,t};var Xo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?Pi:Xo,Pi.parse=function(e){var t=new Date(e);return isNaN(t)?null:t},Pi.toString=Xo.toString,d3.time.second=Hi(function(e){return new Eo(Math.floor(e/1e3)*1e3)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*1e3)},function(e){return e.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=Hi(function(e){return new Eo(Math.floor(e/6e4)*6e4)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*6e4)},function(e){return e.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=Hi(function(e){var t=e.getTimezoneOffset()/60;return new Eo((Math.floor(e/36e5-t)+t)*36e5)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*36e5)},function(e){return e.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=Hi(function(e){var t=new Eo(1970,0);return t.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),t},function(e,t){e.setDate(e.getDate()+t)},function(e){return e.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(e){var t=d3.time.year(e);return Math.floor((e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5)},So.forEach(function(e,t){e=e.toLowerCase(),t=7-t;var n=d3.time[e]=Hi(function(e){return(e=d3.time.day(e)).setDate(e.getDate()-(e.getDay()+t)%7),e},function(e,t){e.setDate(e.getDate()+Math.floor(t)*7)},function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)-(n!==t)});d3.time[e+"s"]=n.range,d3.time[e+"s"].utc=n.utc.range,d3.time[e+"OfYear"]=function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=Hi(function(e){return e=d3.time.day(e),e.setDate(1),e},function(e,t){e.setMonth(e.getMonth()+t)},function(e){return e.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=Hi(function(e){return e=d3.time.day(e),e.setMonth(0,1),e},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e){return e.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Vo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],$o=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Jo=[[d3.time.format("%Y"),function(e){return!0}],[d3.time.format("%B"),function(e){return e.getMonth()}],[d3.time.format("%b %d"),function(e){return e.getDate()!=1}],[d3.time.format("%a %d"),function(e){return e.getDay()&&e.getDate()!=1}],[d3.time.format("%I %p"),function(e){return e.getHours()}],[d3.time.format("%I:%M"),function(e){return e.getMinutes()}],[d3.time.format(":%S"),function(e){return e.getSeconds()}],[d3.time.format(".%L"),function(e){return e.getMilliseconds()}]],Ko=d3.scale.linear(),Qo=qi(Jo);$o.year=function(e,t){return Ko.domain(e.map(Ui)).ticks(t).map(Ri)},d3.time.scale=function(){return ji(d3.scale.linear(),$o,Qo)};var Go=$o.map(function(e){return[e[0].utc,e[1]]}),Yo=[[d3.time.format.utc("%Y"),function(e){return!0}],[d3.time.format.utc("%B"),function(e){return e.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(e){return e.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(e){return e.getUTCDay()&&e.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(e){return e.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(e){return e.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(e){return e.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(e){return e.getUTCMilliseconds()}]],Zo=qi(Yo);Go.year=function(e,t){return Ko.domain(e.map(Wi)).ticks(t).map(zi)},d3.time.scale.utc=function(){return ji(d3.scale.linear(),Go,Zo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg deleted file mode 100755 index 811623c73d2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html deleted file mode 100644 index 7288ade93ad..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html +++ /dev/null @@ -1,452 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> - <script type="text/javascript" src="d3.v2.min.js"></script> - <script type="text/javascript" src="jquery-1.8.2.min.js"></script> - <script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> - <script type="text/javascript" src="spin.min.js"></script> - <script type="text/javascript" src="openbis.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - refresh(); - setInterval(refresh, 600000); - }); - - function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; - } - - function enableSubmission() { - $('#submitBtn').prop('disabled', false); - } - - function disableSubmission() { - $('#submitBtn').prop('disabled', true); - } - - function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - //console.log(dataToShow); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return ""; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 0) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - - } - - function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); - } - - function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); - } - - - function callIngestionSetInvoice(piSampleString) { - var sampleIdentifier = context.getEntityIdentifier() - - var piSampleStringList = piSampleString.split("#") - var principalInvestigator = piSampleStringList[0] - var listOfSamples = piSampleStringList.slice(1, piSampleStringList.length) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId: sampleIdentifier, - pI: principalInvestigator, - listOfSamples: listOfSamples - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting 'INVOICE SENT' property of " + listOfSamples + "to TRUE"); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); - } - - - function callIngestionService(method) { - var permIdentifier = context.getEntityIdentifier() - //var mySendEmail = $("#sendEmail").is(':checked') - var clusteroptions = "brutus" - var bowtieParameters = $("#Bowtie2Paramter").val() - - if ($('#brutus').is(':active')) { - clusteroptions = 'brutus'; - } - if ($('#bsseGrid').is(':active')) { - clusteroptions = 'bsseGrid'; - } - - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - myUserId = context.getSessionId().split("-")[0]; - - var parameters = - { - permId: permIdentifier, - //sendEmail: mySendEmail, - bowtieParam: bowtieParameters, - clusteroptionsParam : clusteroptions, - userId : myUserId, - method: method - }; - console.log(parameters) - - //d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggergc3pie", parameters, displayReturnedTable); - } - - function refresh() { - callIngestionService("pollJob") - - } - - - </script> -</head> -<body> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2>Bowtie 2 - <small>Read Alignment</small> - </h2> - </div> - </div> -</div> - -<br> - -<p> - - - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="btn-group"> - <button type="button" class="btn btn-default" id="brutus"> ETHZ Brutus Cluster </button> - <button type="button" class="btn btn-default" id="bsseGrid"> BSSE Grid </button> - - </div> - </div> - </div> -</div> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <form role="form"> - <div class="form-group"> - <label>Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" - placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - </form> - </div> - </div> -</div> -</p> - -<p> -<!-- -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> - </div> - </div> -</div> ---> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" - "createInvoice-button" id="submitBtn" onclick="callIngestionService('startJob');">Start Bowtie2</button> - </div> - <div class="col-md-3"> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> -</div> -</p> - -<br> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h6 div class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" - href="#collapseOne"> - Available Bowtie 2 Parameters - </a> - </div> - </h6> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> - </div> - </div> - </div> - </div> - </div> -</div> -</div> -</div> -</p> -</div> - -<!-- Placeholder for the output coming back from the server --> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"> - </div> - </div> - </div> -</div> - -<!-- Footer ================================================== --> - -<footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="http://bowtie-bio.sourceforge.net/bowtie2/index.shtml" target="_blank">Bowtie 2 Homepage</a> - </div> - </h6> -</footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv deleted file mode 100644 index b777734dc4d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index.html.sv +++ /dev/null @@ -1,314 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> - <script type="text/javascript" src="d3.v2.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> - <script type="text/javascript" src="spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -var vis; -var didCreateVis = false; -var context = new openbisWebAppContext(); - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div") - .data(dataToShow.rows) - .enter() - .append("div") - .html(function(row) { return row[1].value;}) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function(row) { return row[0].value; }) - .attr("class", function(row) { if (row[0].value == 0) {return "btn btn-success";} return "btn btn-danger";}) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function(row) { if (row[0].value == 0) { return "OK"; } return "Fail";}); - -// var invoices = []; -// for (var i=0;i<data.result.rows.length;i++) { -// //var val = data.result.rows[i][1].value.split('#')[0]; -// var val = data.result.rows[i][1].value; -// if (val) { -// invoices.push(val) -// } -// } -} - -function hideButtons(data) -{ - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - - -function callIngestionSetInvoice(piSampleString) -{ - var sampleIdentifier = context.getEntityIdentifier() - - var piSampleStringList = piSampleString.split("#") - var principalInvestigator = piSampleStringList[0] - var listOfSamples = piSampleStringList.slice(1,piSampleStringList.length) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId : sampleIdentifier, - pI : principalInvestigator, - listOfSamples : listOfSamples - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting 'INVOICE SENT' property of " + listOfSamples + "to TRUE"); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); -} - - -function callIngestionService() -{ - var permIdentifier = context.getEntityIdentifier() - var mySendEmail = $("#sendEmail").is(':checked') - var bowtieParameters = $("#Bowtie2Paramter").val() - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - var parameters = - { - permId : permIdentifier, - sendEmail : mySendEmail, - bowtieParam : bowtieParameters - }; - - d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting gc3pie Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggergc3pie", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="container" class="container"> -<h2>Bowtie 2 Alignment</h2> -<div id="main"> - - - -<form role="form"> - <div class="form-group"> - <label for="Bowtie2ParamterLabel">Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> -</form> -<button class="btn btn-default btn-default" type="submit" "createInvoice-button" onclick="callIngestionService();">Start Bowtie2 Alignment</button> - - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h4 class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" href="#collapseOne"> - Available Bowtie 2 Options - </a> - </h4> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> -</div> -</div> -</div> -</div> - -</div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html deleted file mode 100644 index 1ae95d1251d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/index2.html +++ /dev/null @@ -1,14 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <script type="text/css" src="bootstrap3/css/bootstrap.min.css"></script> -</head> -<body> -<div id="main"> - <button class="btn btn-default btn-lg" type="button" "createInvoice-button" onclick="callIngestionService();">Start gc3pie Job</button> -</div> -<p> - <button type="button" class="btn btn-primary btn-sm">Small button</button> - <button type="button" class="btn btn-default btn-sm">Small button</button> -</p> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js deleted file mode 100644 index bc3fbc81b26..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/jquery-1.8.2.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js deleted file mode 100644 index ee2e8171738..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-action-deferrer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A utility class for deferring an action until all of some kind of action has completed - * - * @argument dependencies An array of the keys for the dependencies. - */ - -function openbisActionDeferrer(pendingAction, dependencies) { - this.pendingAction = pendingAction; - this.dependencies = {}; - var newme = this; - dependencies.forEach(function(key) { - newme.dependencies[key] = false; - }); -} - -/** - * Note that a dependency completed. Execute the pending action if appropriate. - */ -openbisActionDeferrer.prototype.dependencyCompleted = function(key) { - this.dependencies[key] = true; - var shouldExecute = true; - for (prop in this.dependencies) { - if (false == this.dependencies[prop]) { - shouldExecute = false; - break; - } - } - if (shouldExecute) { - this.pendingAction(); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js deleted file mode 100644 index 52e7336254a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js deleted file mode 100644 index 7d1ece5965c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-login.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * A module for configuring the login page to openBIS. It hides and shows - * the login form and main content as necessary. It invokes a specified - * function on successful login. - * - * This module assumes that the page follows the structure of our standard - * login page. This means that the Following elements are defined : - * - * div#login-form-div - * form#login-form - * input#username - * input#password - * button#login-button - * div#main - * button#logout-button - * - * Assuming these elements are defined, this module configures their appeareance - * and behavior.The div#main element is initially hidden until the user logs in. - * Once logged in, the div#login-form-div element is hidden and the div#main - * element is made visible. - * - * @module openbis-login - * @requires jquery - */ - - -/** - * Configure the login page to hide and show the login form and main content - * as appropriate - * - * @param openbis The openbis facade object - * @param onLogin The function to be called when login succeeds. - * @function - */ - -function openbisLoginPage(openbis, onLogin) -{ - this.openbis = openbis; - this.onLogin = onLogin; -} - -openbisLoginPage.prototype.configure = function(){ - var loginPage = this; - - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - loginPage.openbis.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - loginPage.openbis.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { loginPage.onLogin(data) }) - }); - - loginPage.openbis.ifRestoredSessionActive(function(data) { loginPage.onLogin(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js deleted file mode 100644 index 29c57a8145e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-request-cache.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Caches openBIS JSON responses into the local browser storage. - * - * Once the local storage is populated with data from real - * server interactions, the UI development can be done offline - * based on the cached server responses. - * - * USAGE : include this script in your app *after* the openbis facade. - * Be careful not to distribute it to your customers. - * - * <script type="text/javascript" src="openbis-request-cache.js"></script> - * - * To clear the cache, you can call "localStorage.clear()" in a browser console. - */ - -var original_ajax_request_func = _openbisInternal.prototype.ajaxRequest; - -_openbisInternal.prototype.ajaxRequest = function(settings) { - - function getCacheId(settings) { - var methodName = settings.data['method'] - if (methodName.toLowerCase().indexOf('authenticate') != -1) { - // do not store sensitive parameters information - // for login methods (e.g. username/password) - return methodName - } else { - var params = settings.data['params'] - return methodName + '-' + JSON.stringify(params) - } - } - - var cacheId = getCacheId(settings) - var cachedResponse = localStorage.getItem(cacheId) - - if (cachedResponse == null) { - var originalCallback = settings.success - settings.success = function(response) { - localStorage.setItem(cacheId, JSON.stringify(response)) - originalCallback(response) - } - original_ajax_request_func(settings); - } else { - // async execution after a delay of 100ms - setTimeout(function() { - settings.success(JSON.parse(cachedResponse)) - }, 100) - - } -} - -alert("This app includes development code. For production, do not forget to remove the reference to openbis-request-cache.js") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js deleted file mode 100644 index a39730902bb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis-screening.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * ======================================================= - * OpenBIS screening facade internal code (DO NOT USE!!!) - * ======================================================= - */ - -if(typeof openbis == 'undefined' || typeof _openbisInternal == 'undefined'){ - alert('Loading of openbis-screening.js failed - openbis.js is missing'); -} - -var _openbisInternalGeneric = _openbisInternal; - -var _openbisInternal = function(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -$.extend(_openbisInternal.prototype, _openbisInternalGeneric.prototype); - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - _openbisInternalGeneric.prototype.init.call(this, openbisUrlOrNull); - this.screeningUrl = this.openbisUrl + "/rmi-screening-api-v1.json" -} - -_openbisInternal.prototype.getScreeningDataStoreApiUrlForDataStoreUrl = function(dataStoreUrl){ - return dataStoreUrl + "/rmi-datastore-server-screening-api-v1.json" -} - -var _openbisGeneric = openbis; - -/** - * ========================= - * OpenBIS screening facade - * ========================= - * - * The facade provides access to the following services: - * - * - all services that the generic OpenBIS facade provides (see openbis.js file) - * - ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer - * - ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening - * - */ - -var openbis = function(openbisUrlOrNull){ - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -$.extend(openbis.prototype, _openbisGeneric.prototype); - -/** - * ==================================================================================== - * ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer methods - * ==================================================================================== - */ - -/** - * @see IScreeningApiServer.listPlates(String) - * @method - */ -openbis.prototype.listPlates = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlates(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.listPlatesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession(), experimentIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateMetadataList(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.getPlateMetadataList = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateMetadataList", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String) - * @method - */ -openbis.prototype.listAllExperiments = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String, String) - * @method - */ -openbis.prototype.listExperimentsVisibleToUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), userId ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listFeatureVectorDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listFeatureVectorDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listFeatureVectorDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listRawImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listRawImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listRawImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listSegmentationImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listSegmentationImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listSegmentationImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getDatasetIdentifiers(String, List<String>) - * @method - */ -openbis.prototype.getDatasetIdentifiers = function(datasetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getDatasetIdentifiers", - "params" : [ this.getSession(), datasetCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, ExperimentIdentifier, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForExperimentAndMaterial = function(experimentIdentifer, materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), experimentIdentifer, materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForMaterial = function(materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, PlateIdentifier) - * @method - */ -openbis.prototype.listPlateWells = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getWellSample(String, WellIdentifier) - * @method - */ -openbis.prototype.getWellSample = function(wellIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getWellSample", - "params" : [ this.getSession(), wellIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateSample(String, PlateIdentifier) - * @method - */ -openbis.prototype.getPlateSample = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateSample", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateMaterialMapping(String, List<PlateIdentifier>, MaterialTypeIdentifier) - * @method - */ -openbis.prototype.listPlateMaterialMapping = function(plateIdentifiers, materialTypeIdentifierOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateMaterialMapping", - "params" : [ this.getSession(), plateIdentifiers, materialTypeIdentifierOrNull ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getExperimentImageMetadata(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.getExperimentImageMetadata = function(experimentIdentifer, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getExperimentImageMetadata", - "params" : [ this.getSession(), experimentIdentifer ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatureCodes(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatureCodes = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatureCodes", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatures(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatures = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatures", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeatures(String, List<FeatureVectorDatasetReference>, List<String>) - * @method - */ -openbis.prototype.loadFeatures = function(featureDatasets, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeatures", - "params" : [ this.getSession(), featureDatasets, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeaturesForDatasetWellReferences(String, List<FeatureVectorDatasetWellReference>, List<String>) - * @method - */ -openbis.prototype.loadFeaturesForDatasetWellReferences = function(datasetWellReferences, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeaturesForDatasetWellReferences", - "params" : [ this.getSession(), datasetWellReferences, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, boolean) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConversion = function(imageReferences, convertToPng, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "convertToPng" : convertToPng - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadThumbnailImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageSize = function(imageReferences, size, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "size" : size - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, LoadImageConfiguration) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConfiguration = function(imageReferences, configuration, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "configuration" : configuration - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "format" : format - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, IImageRepresentationFormatSelectionCriterion...) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormatCriteria = function(imageReferences, criteria, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "criteria" : criteria - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageMetadata(String, List<? extends IImageDatasetIdentifier>) - * @method - */ -openbis.prototype.listImageMetadata = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageMetadata", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableImageRepresentationFormats(String, List<? extends IDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableImageRepresentationFormats = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableImageRepresentationFormats", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadPhysicalThumbnailsBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadPhysicalThumbnailsBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadPhysicalThumbnailsBase64", - "params" : [ this.getSession(), imageReferences, format ] }, - success: action - }); -} - -/** - * ===================================================================================== - * ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening methods - * ===================================================================================== - */ - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, List<WellPosition>, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndWellPositionsAndChannelAndImageSize = function(dataSetIdentifier, wellPositions, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndChannelAndImageSize = function(dataSetIdentifier, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadThumbnailImagesBase64(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, String) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannel = function(dataSetIdentifier, wellPositions, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, List<String>) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannels = function(dataSetIdentifier, wellPositions, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, String) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannel = function(dataSetIdentifier, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listAvailableFeatureLists(String, IFeatureVectorDatasetIdentifier) - * @method - */ -openbis.prototype.listAvailableFeatureLists = function(featureVectorDataSet, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "listAvailableFeatureLists", - params : [this.getSession(), featureVectorDataSet] - }, - success: action - }); -}; - -/** - * @see IDssServiceRpcScreening.getFeatureList(String, IFeatureVectorDatasetIdentifier, String) - * @method - */ -openbis.prototype.getFeatureList = function(featureVectorDataSet, featureListCode, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "getFeatureList", - params : [this.getSession(), featureVectorDataSet, featureListCode] - }, - success: action - }); -}; - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js deleted file mode 100644 index f5476a74d56..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/openbis.js +++ /dev/null @@ -1,1987 +0,0 @@ -/** - * ============================================= - * OpenBIS facade internal code (DO NOT USE!!!) - * ============================================= - */ - -if(typeof $ == 'undefined'){ - alert('Loading of openbis.js failed - jquery.js is missing'); -} - -function _openbisInternal(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - this.openbisUrl = this.normalizeOpenbisUrl(openbisUrlOrNull); - this.generalInfoServiceUrl = this.openbisUrl + "/rmi-general-information-v1.json"; - this.generalInfoChangingServiceUrl = this.openbisUrl + "/rmi-general-information-changing-v1.json"; - this.queryServiceUrl = this.openbisUrl + "/rmi-query-v1.json"; - this.webInfoServiceUrl = this.openbisUrl + "/rmi-web-information-v1.json" -} - -_openbisInternal.prototype.log = function(msg){ - if(console){ - console.log(msg); - } -} - -_openbisInternal.prototype.normalizeOpenbisUrl = function(openbisUrlOrNull){ - var parts = this.parseUri(window.location); - - if(openbisUrlOrNull){ - var openbisParts = this.parseUri(openbisUrlOrNull); - - for(openbisPartName in openbisParts){ - var openbisPartValue = openbisParts[openbisPartName]; - - if(openbisPartValue){ - parts[openbisPartName] = openbisPartValue; - } - } - } - - return parts.protocol + "://" + parts.authority + "/openbis/openbis"; -} - -_openbisInternal.prototype.jsonRequestData = function(params) { - params["id"] = "1"; - params["jsonrpc"] = "2.0"; - return JSON.stringify(params) -} - -_openbisInternal.prototype.ajaxRequest = function(settings) { - settings.type = "POST"; - settings.processData = false; - settings.dataType = "json"; - settings.data = this.jsonRequestData(settings.data); - settings.success = this.ajaxRequestSuccess(settings.success); - // we call the same settings.success function for backward compatibility - settings.error = this.ajaxRequestError(settings.success); - $.ajax(settings) -} - -_openbisInternal.prototype.ajaxRequestSuccess = function(action){ - var openbisObj = this; - return function(response){ - if(response.error){ - openbisObj.log("Request failed: " + JSON.stringify(response.error)); - } - if(action){ - action(response); - } - }; -} - -_openbisInternal.prototype.ajaxRequestError = function(action){ - var openbisObj = this; - return function(xhr, status, error){ - openbisObj.log("Request failed: " + error); - if(action){ - action({ - "error" : "Request failed: " + error - }); - } - }; -} - -// Functions for working with cookies (see http://www.quirksmode.org/js/cookies.html) - -_openbisInternal.prototype.createCookie = function(name,value,days) { - if (days) { - var date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - var expires = "; expires="+date.toGMTString(); - } - else var expires = ""; - document.cookie = name+"="+value+expires+"; path=/"; -} - -_openbisInternal.prototype.readCookie = function(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); - } - return null; -} - -_openbisInternal.prototype.eraseCookie = function(name) { - this.createCookie(name,"",-1); -} - -// parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License (see http://blog.stevenlevithan.com/archives/parseuri) - -_openbisInternal.prototype.parseUri = function(str) { - var options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - var o = options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -} - -_openbisInternal.prototype.listDataStores = function(action){ - this.ajaxRequest({ - url: this.generalInfoServiceUrl, - data: { "method" : "listDataStores", - "params" : [ this.sessionToken ] - }, - success: action - }); -} - -_openbisInternal.prototype.initDataStores = function(action){ - var openbisInternal = this; - - if(typeof this.dataStores === "undefined"){ - this.listDataStores(function(response){ - if(response.result){ - openbisInternal.dataStores = response.result; - }else{ - openbisInternal.dataStores = []; - } - action(); - }); - }else{ - action(); - } -} - -_openbisInternal.prototype.getDataStoreUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else{ - if(dataStoreCodeOrNull){ - var dataStoreUrl = null; - $.each(openbisInternal.dataStores, function(index, dataStore){ - if(dataStore.code == dataStoreCodeOrNull){ - dataStoreUrl = dataStore.downloadUrl; - } - }); - if(dataStoreUrl){ - action(dataStoreUrl); - }else{ - throw "Couldn't get a data store url because data store with " + dataStoreCodeOrNull + " code does not exist."; - } - }else{ - if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - throw "There is more than one data store configured. Please specify a data store code to get a data store url."; - } - } - } - }); -} - -_openbisInternal.prototype.getDataStoreUrlForDataSetCode = function(dataSetCode, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - openbisInternal.ajaxRequest({ - url: openbisInternal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ openbisInternal.sessionToken, dataSetCode ] - }, - success: function(response){ - var hostUrl = response.result; - - if(hostUrl){ - action(hostUrl + "/datastore_server"); - }else{ - throw "Couldn't get a data store url for a data set with " + dataSetCode + " code because the data set does not exist."; - } - } - }); - } - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataSetCode = function(dataSetCode, action) { - this.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreHostForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var parts = openbisObj.parseUri(dataStoreUrl); - action(parts.protocol + "://" + parts.authority); - }); -} - -/** - * =============== - * OpenBIS facade - * =============== - * - * The facade provides access to the following services: - * - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService - * - ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService - * - ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric - * - * @class - * - */ - -function openbis(openbisUrlOrNull) { - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -/** - * ================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService methods - * ================================================================================== - */ - -/** - * Log into openBIS. - * - * @see IGeneralInformationService.tryToAuthenticateForAllServices(String, String) - * @method - */ -openbis.prototype.login = function(userId, userPassword, action) { - var openbisObj = this - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryToAuthenticateForAllServices", - "params" : [ userId, userPassword ] - }, - success: - function(loginResponse) { - if(loginResponse.error){ - alert("Login failed"); - }else{ - openbisObj._internal.sessionToken = loginResponse.result; - openbisObj.rememberSession(); - } - openbisObj._internal.initDataStores(function(){ - action(loginResponse); - }); - } - }); -} - -/** - * Stores the current session in a cookie. - * - * @method - */ -openbis.prototype.rememberSession = function() { - this._internal.createCookie('openbis', this.getSession(), 1); -} - -/** - * Removes the current session from a cookie. - * - * @method - */ -openbis.prototype.forgetSession = function() { - this._internal.eraseCookie('openbis'); -} - -/** - * Restores the current session from a cookie. - * - * @method - */ -openbis.prototype.restoreSession = function() { - this._internal.sessionToken = this._internal.readCookie('openbis'); -} - -/** - * Sets the current session. - * - * @method - */ -openbis.prototype.useSession = function(sessionToken){ - this._internal.sessionToken = sessionToken; -} - -/** - * Returns the current session. - * - * @method - */ -openbis.prototype.getSession = function(){ - return this._internal.sessionToken; -} - -/** - * Checks whether the current session is still active. - * - * @see IGeneralInformationService.isSessionActive(String) - * @method - */ -openbis.prototype.isSessionActive = function(action) { - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "isSessionActive", - "params" : [ this.getSession() ] - }, - success: action - }); - }else{ - action({ result : false }) - } -} - -/** - * Restores the current session from a cookie and executes - * the specified action if the session is still active. - * - * @see restoreSession() - * @see isSessionActive() - * @method - */ -openbis.prototype.ifRestoredSessionActive = function(action) { - this.restoreSession(); - this.isSessionActive(function(data) { if (data.result) action(data) }); -} - -/** - * Log out of openBIS. - * - * @see IGeneralInformationService.logout(String) - * @method - */ -openbis.prototype.logout = function(action) { - this.forgetSession(); - - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "logout", - "params" : [ this.getSession() ] - }, - success: action - }); - }else if(action){ - action({ result : null }); - } -} - -/** - * @see IGeneralInformationService.listNamedRoleSets(String) - * @method - */ -openbis.prototype.listNamedRoleSets = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listNamedRoleSets", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSpacesWithProjectsAndRoleAssignments(String, String) - * @method - */ -openbis.prototype.listSpacesWithProjectsAndRoleAssignments = function(databaseInstanceCodeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSpacesWithProjectsAndRoleAssignments", - "params" : [ this.getSession(), databaseInstanceCodeOrNull ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForSamples = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForSamples", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria, EnumSet<SampleFetchOption>) - * @method - */ -openbis.prototype.searchForSamplesWithFetchOptions = function(searchCriteria, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamples", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamplesOnBehalfOfUser(String, SearchCriteria, EnumSet<SampleFetchOption>, String) - * @method - */ -openbis.prototype.searchForSamplesOnBehalfOfUser = function(searchCriteria, fetchOptions, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamplesOnBehalfOfUser", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterSamplesVisibleToUser(String, List<Sample>, String) - * @method - */ -openbis.prototype.filterSamplesVisibleToUser = function(allSamples, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "filterSamplesVisibleToUser", - "params" : [ - this.getSession(), - allSamples, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperiment(String, String) - * @method - */ -openbis.prototype.listSamplesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperiment", - "params" : [ this.getSession(), experimentIdentifier ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperimentOnBehalfOfUser(String, String, String) - * @method - */ -openbis.prototype.listSamplesForExperimentOnBehalfOfUser = function(experimentIdentifier, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperimentOnBehalfOfUser", - "params" : [ this.getSession(), experimentIdentifier, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>) - * @method - */ -openbis.prototype.listDataSetsForSamples = function(samples, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperiments = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingSamples(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingSamples = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingSamples", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingDataSets(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingDataSets = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingDataSets", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterExperimentsVisibleToUser(String, List<Experiment>, String) - * @method - */ -openbis.prototype.filterExperimentsVisibleToUser = function(allExperiments, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterExperimentsVisibleToUser", - "params" : [ this.getSession(), allExperiments, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForSample(String, Sample, boolean) - * @method - */ -openbis.prototype.listDataSetsForSample = function(sample, restrictToDirectlyConnected, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForSample", - "params" : [ this.getSession(), sample, restrictToDirectlyConnected ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataStores(String) - * @method - */ -openbis.prototype.listDataStores = function(action) { - this._internal.listDataStores(action); -} - -/** - * @see IGeneralInformationService.getDefaultPutDataStoreBaseURL(String) - * @method - */ -openbis.prototype.getDefaultPutDataStoreBaseURL = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDefaultPutDataStoreBaseURL", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.tryGetDataStoreBaseURL(String) - * @method - */ -openbis.prototype.tryGetDataStoreBaseURL = function(dataSetCode, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ this.getSession(), dataSetCode ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataStoreBaseURLs(String, List<String>) - * @method - */ -openbis.prototype.getDataStoreBaseURLs = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataStoreBaseURLs", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetTypes(String) - * @method - */ -openbis.prototype.listDataSetTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSampleTypes(String) - * @method - */ -openbis.prototype.listSampleTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSampleTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentTypes(String) - * @method - */ -openbis.prototype.listExperimentTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listVocabularies(String) - * @method - */ -openbis.prototype.listVocabularies = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listVocabularies", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForSamplesWithConnections = function(samples, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsOnBehalfOfUser(String, List<Sample>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForSamplesOnBehalfOfUser = function(samples, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), samples, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperiments(String, List<Experiment>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForExperiments = function(experiments, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperiments", - "params" : [ this.getSession(), experiments, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperimentsOnBehalfOfUser(String, List<Experiment>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForExperimentsOnBehalfOfUser = function(experiments, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperimentsOnBehalfOfUser", - "params" : [ this.getSession(), experiments, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>) - * @method - */ -openbis.prototype.getDataSetMetaData = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>, EnumSet<DataSetFetchOption>) - * @method - */ -openbis.prototype.getDataSetMetaDataWithFetchOptions = function(dataSetCodes, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes, fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSets(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForDataSets = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSets", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSetsOnBehalfOfUser(String, SearchCriteria, String) - * @method - */ -openbis.prototype.searchForDataSetsOnBehalfOfUser = function(searchCriteria, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), - searchCriteria, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterDataSetsVisibleToUser(String, List<DataSet>, String) - * @method - */ -openbis.prototype.filterDataSetsVisibleToUser = function(allDataSets, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterDataSetsVisibleToUser", - "params" : [ this.getSession(), - allDataSets, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<String>) - * @method - */ -openbis.prototype.listExperimentsForIdentifiers = function(experimentIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), - experimentIdentifiers ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForExperiments(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForExperiments = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForExperiments", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjects(String) - * @method - */ -openbis.prototype.listProjects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listProjectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMaterialByCodes(String, List<MaterialIdentifier>) - * @method - */ -openbis.prototype.getMaterialByCodes = function(materialIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMaterialByCodes", - "params" : [ this.getSession(), materialIdentifiers ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForMaterials(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForMaterials = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForMaterials", - "params" : [ this.getSession(), searchCriteria ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojects(String) - * @method - */ -openbis.prototype.listMetaprojects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listMetaprojectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.getMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaproject", - "params" : [ this.getSession(), metaprojectId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaprojectOnBehalfOfUser(String, IMetaprojectId, String) - * @method - */ -openbis.prototype.getMetaprojectOnBehalfOfUser = function(metaprojectId, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaprojectOnBehalfOfUser", - "params" : [ this.getSession(), metaprojectId, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForProject(String, IProjectId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForProject = function(projectId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForProject", - "params" : [ this.getSession(), projectId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForExperiment(String, IExperimentId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForExperiment = function(experimentId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForExperiment", - "params" : [ this.getSession(), experimentId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForSample(String, ISampleId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForSample = function(sampleId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForSample", - "params" : [ this.getSession(), sampleId, allVersions ] - }, - success: action - }); -} - -/** - * ========================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService methods - * ========================================================================================== - */ - -/** - * @see IGeneralInformationChangingService.updateSampleProperties(String, long, Map<String,String>) - * @method - */ -openbis.prototype.updateSampleProperties = function(sampleId, properties, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateSampleProperties", - "params" : [ this.getSession(), sampleId, properties ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addUnofficialVocabularyTerm(String, Long, NewVocabularyTerm) - * @method - */ -openbis.prototype.addUnofficialVocabularyTerm = function(vocabularyId, term, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addUnofficialVocabularyTerm", - "params" : [ this.getSession(), vocabularyId, term ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.getWebAppSettings(String, String) - * @method - */ -openbis.prototype.getWebAppSettings = function(webappId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "getWebAppSettings", - params : [ this.getSession(), webappId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.setWebAppSettings(String, WebAppSettings) - * @method - */ -openbis.prototype.setWebAppSettings = function(webappSettings, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "setWebAppSettings", - params : [ this.getSession(), webappSettings ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.createMetaproject(String, String, String) - * @method - */ -openbis.prototype.createMetaproject = function(name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "createMetaproject", - params : [ this.getSession(), name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.updateMetaproject(String, IMetaprojectId, String, String) - * @method - */ -openbis.prototype.updateMetaproject = function(metaprojectId, name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateMetaproject", - params : [ this.getSession(), metaprojectId, name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.deleteMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.deleteMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "deleteMetaproject", - params : [ this.getSession(), metaprojectId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addToMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.addToMetaproject = function(metaprojectId, assignmentsToAdd, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addToMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToAdd ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.removeFromMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.removeFromMetaproject = function(metaprojectId, assignmentsToRemove, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "removeFromMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToRemove ] }, - success: action - }); -} - -/** - * ============================================================================ - * ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer methods - * ============================================================================ - */ - -/** - * @see IQueryApiServer.listQueries(String) - * @method - */ -openbis.prototype.listQueries = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listQueries", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.executeQuery(String, long, Map<String, String>) - * @method - */ -openbis.prototype.executeQuery = function(queryId, parameterBindings, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "executeQuery", - "params" : [ this.getSession(), queryId, parameterBindings ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listTableReportDescriptions(String) - * @method - */ -openbis.prototype.listTableReportDescriptions = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listTableReportDescriptions", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromDataSets(String, String, String, List<String>) - * @method - */ -openbis.prototype.createReportFromDataSets = function(dataStoreCode, serviceKey, dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromDataSets", - params : [ this.getSession(), dataStoreCode, serviceKey, dataSetCodes ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listAggregationServices(String) - * @method - */ -openbis.prototype.listAggregationServices = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listAggregationServices", - params : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) - * @method - */ -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.getSession(), dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - - -/** - * ============================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService methods - * ============================================================================== - */ - -/** - * Returns the current server side session. - * - * @see IWebInformationService.getSessionToken() - * @method - */ -openbis.prototype.getSessionTokenFromServer = function(action) { - this._internal.ajaxRequest({ - url: this._internal.webInfoServiceUrl, - data: { "method" : "getSessionToken" }, - success: action - }); -} - -/** - * ================================================================================= - * ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric methods - * ================================================================================= - */ - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.listFilesForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileInSession = function(fileOrFolder, action) { - this.getDownloadUrlForFileForDataSetInSession(fileOrFolder.dataSetCode, fileOrFolder.path, action); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, DataSetFileDTO, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileWithTimeout = function(fileOrFolder, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), fileOrFolder, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, String, String, boolean) - * @method - */ -openbis.prototype.listFilesForDataSet = function(dataSetCode, path, recursive, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path, recursive ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, String, String) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSet = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetInSession = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - var pathWithoutSlash = path.charAt(0) == "/" ? path.substr(1) : path; - var url = dataStoreUrl + "/" + dataSetCode + "/" + pathWithoutSlash + "?sessionID=" + openbisObj.getSession(); - action(url); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, String, String, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetWithTimeout = function(dataSetCode, path, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), dataSetCode, path, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploader = function(uploaderContainer, oncomplete){ - this.createSessionWorkspaceUploaderForDataStore(uploaderContainer, null, oncomplete); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploaderForDataStore = function(uploaderContainer, dataStoreCodeOrNull, oncomplete){ - var uploaderSupported = window.File && window.FileReader && window.XMLHttpRequest; - - if(!uploaderSupported){ - alert("Uploader is not supported by your browser."); - return; - } - - var $this = this; - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - // figure out what is the location of the openbis.js script and assume that uploader resources are served by the same server - var openbisScriptLocation = $('script[src*=openbis\\.js]').attr('src'); - var uploaderDirectoryLocation = jsFileLocation = openbisScriptLocation.replace(/js\/openbis\.js/g, 'uploader'); - - $('head').append('<link rel="stylesheet" media="screen" type="text/css" href="' + uploaderDirectoryLocation + '/css/src/upload.css" />'); - $('head').append('<script charset="utf-8" type="text/javascript" src="' + uploaderDirectoryLocation + '/js/src/upload.js" />'); - - $(uploaderContainer).load(uploaderDirectoryLocation + "/index.html", function(){ - Uploader.init({ - smart_mode: true, - chunk_size: 1000*1024, - file_upload_url: dataStoreUrl + "/session_workspace_file_upload", - form_upload_url: dataStoreUrl + "/session_workspace_form_upload", - file_download_url: dataStoreUrl + "/session_workspace_file_download", - oncomplete: oncomplete, - sessionID: $this.getSession() - }); - }); - }); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrl = function(filePath, action){ - return this.createSessionWorkspaceDownloadUrlForDataStore(filePath, null, action); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrlForDataStore = function(filePath, dataStoreCodeOrNull, action){ - var openbisObj = this; - - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var downloadUrl = dataStoreUrl + "/session_workspace_file_download?sessionID=" + openbisObj.getSession() + "&filePath=" + filePath; - action(downloadUrl); - }); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLink = function(filePath, linkText, action){ - return this.createSessionWorkspaceDownloadLinkForDataStore(filePath, linkText, null, action); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLinkForDataStore = function(filePath, linkText, dataStoreCodeOrNull, action){ - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - var link = $("<a href='" + downloadUrl + "'>" + (linkText ? linkText : filePath) + "</a>"); - action(link); - }); -} - -/** - * Downloads a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFile = function(filePath, action) { - this.downloadSessionWorkspaceFileForDataStore(filePath, null, action); -} - -/** - * Downloads a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - $.ajax({ - type: "GET", - dataType: "text", - url: downloadUrl, - success: openbisObj._internal.ajaxRequestSuccess(action), - error: openbisObj._internal.ajaxRequestError(action) - }); - }); -} - -/** - * Deletes a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFile = function(filePath, action) { - this.deleteSessionWorkspaceFileForDataStore(filePath, null, action) -} - -/** - * Deletes a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "deleteSessionWorkspaceFile", - "params" : [ openbisObj.getSession(), filePath ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.getPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.tryGetPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.tryGetPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "tryGetPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * List shares from the default data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllShares = function(action) { - this.listAllSharesForDataStore(null, action); -} - -/** - * List shares from the specified data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllSharesForDataStore = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "listAllShares", - "params" : [ openbisObj.getSession() ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.shuffleDataSet(String, String, String) - * @method - */ -openbis.prototype.shuffleDataSet = function(dataSetCode, shareId, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "shuffleDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, shareId ] }, - success: action - }); - }); -} - -/** - * Get a validation script from the default data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScript = function(dataSetTypeOrNull, action) { - this.getValidationScriptForDataStore(dataSetTypeOrNull, null, action); -} - -/** - * Get a validation script from the specified data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScriptForDataStore = function(dataSetTypeOrNull, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "getValidationScript", - "params" : [ openbisObj.getSession(), dataSetTypeOrNull ] - }, - success: action - }); - }); -} - -/** - * Get a url that will produce a graph with the given configuration at the default data store. - * - * @method - */ -openbis.prototype.getGraphUrl = function(graphConfig, action) { - this.getGraphUrlForDataStore(graphConfig, null, action); -} - -/** - * Get a url that will produce a graph with the given configuration at the specified data store. - * - * @method - */ -openbis.prototype.getGraphUrlForDataStore = function(graphConfig, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreHostForDataStoreCode(dataStoreCodeOrNull, function(dataStoreHost) { - var graphUrl = dataStoreHost + "/graphservice/?sessionID=" + openbisObj.getSession(); - for (prop in graphConfig) { - graphUrl += "&" + prop + "=" + encodeURIComponent(graphConfig[prop]); - } - action(graphUrl); - }); -} - -/** - * ===================== - * OpenBIS graph config - * ===================== - * - * Defines the configuration for a graph generated by the server's graphservice. - * - * To use, set properties on the object with keys that match the name of the servlet - * parameters of the graphservice and then call the method getGraphUrl on the openbis - * object. Do *not* set the sessionID paramter -- this will be filled in by the openbis - * object. - * - * The graphservice is documented here: https://wiki-bsse.ethz.ch/display/openBISDoc/Configuring+Graphs+and+Plots - * - * @class - * - */ -function openbisGraphConfig(filename, graphtype, title) { - this.file = filename; - this["graph-type"] = graphtype; - this.title = title; -} - - -/** - * ===================================================== - * OpenBIS webapp context internal code (DO NOT USE!!!) - * ===================================================== - */ - -function _openbisWebAppContextInternal(){ - this.webappCode = this.getParameter("webapp-code"); - this.sessionId = this.getParameter("session-id"); - this.entityKind = this.getParameter("entity-kind"); - this.entityType = this.getParameter("entity-type"); - this.entityIdentifier = this.getParameter("entity-identifier"); - this.entityPermId = this.getParameter("entity-perm-id"); -} - -_openbisWebAppContextInternal.prototype.getParameter = function(parameterName){ - var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); - if(match && match[1]){ - return decodeURIComponent(match[1].replace(/\+/g,' ')); - }else{ - return null; - } -} - -/** - * ======================= - * OpenBIS webapp context - * ======================= - * - * Provides a context information for webapps that are embedded inside the OpenBIS UI. - * - * @class - * - */ -function openbisWebAppContext(){ - this._internal = new _openbisWebAppContextInternal(); -} - -openbisWebAppContext.prototype.getWebappCode = function(){ - return this._internal.webappCode; -} - -openbisWebAppContext.prototype.getSessionId = function(){ - return this._internal.sessionId; -} - -openbisWebAppContext.prototype.getEntityKind = function(){ - return this._internal.entityKind; -} - -openbisWebAppContext.prototype.getEntityType = function(){ - return this._internal.entityType; -} - -openbisWebAppContext.prototype.getEntityIdentifier = function(){ - return this._internal.entityIdentifier; -} - -openbisWebAppContext.prototype.getEntityPermId = function(){ - return this._internal.entityPermId; -} - -openbisWebAppContext.prototype.getParameter = function(parameterName){ - return this._internal.getParameter(parameterName); -} - -/** - * ======================= - * OpenBIS Search Criteria - * ======================= - * - * Methods and classes for constructing search criteria objects for use in searches. - */ - -/** - * It is easier to construct instances of match clauses using one of the factory methods: - * - * createPropertyMatch - * createAttributeMatch - * createTimeAttributeMatch - * createAnyPropertyMatch - * createAnyFieldMatch - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause - * @class - */ -function SearchCriteriaMatchClause(type, fieldType, fieldCode, desiredValue) { - this["@type"] = type; - this["fieldType"] = fieldType; - this["fieldCode"] = fieldCode; - this["desiredValue"] = desiredValue; - // compareMode should be one of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - this["compareMode"] = "EQUALS"; -} - -/** - * Factory method to create a match for a property. - * - * @param propertyCode The code of the property to compare against - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createPropertyMatch(String, String) - * @method - */ -SearchCriteriaMatchClause.createPropertyMatch = function(propertyCode, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("PropertyMatchClause", "PROPERTY", propertyCode, desiredValue); - matchClause["propertyCode"] = propertyCode; - return matchClause; -} - -/** - * Factory method to create a match for an attribute. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute. - * It should come from this list: - * // common - * "CODE", "TYPE", "PERM_ID", - * // for sample or experiment - * "SPACE", - * // for experiment - * "PROJECT", - * // for all types of entities - * "METAPROJECT" - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseAttribute, String) - * @method - */ -SearchCriteriaMatchClause.createAttributeMatch = function(attribute, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AttributeMatchClause", "ATTRIBUTE", attribute, desiredValue); - matchClause["attribute"] = attribute; - return matchClause; -} - -/** - * Factory method to create a MatchClause matching against registration or modification - * date. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseTimeAttribute - * It should come from this list: REGISTRATION_DATE, MODIFICATION_DATE - * - * @param mode One of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - * @param date The date to compare against, format YYYY-MM-DD - * @timezone The time zone of the date ("+1", "-5", "0", etc.) - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseTimeAttribute, CompareMode, String, String) - * @method - */ -SearchCriteriaMatchClause.createTimeAttributeMatch = function(attribute, mode, date, timezone) -{ - var matchClause = new SearchCriteriaMatchClause("TimeAttributeMatchClause", "ATTRIBUTE", attribute, date); - matchClause["attribute"] = attribute; - matchClause["compareMode"] = mode; - matchClause["timeZone"] = timezone; - return matchClause; -} - -/** - * Factory method to create a match for against any property. - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyPropertyMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyPropertyMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyPropertyMatchClause", "ANY_PROPERTY", null, desiredValue); - return matchClause; -} - -/** - * Factory method to create a match for against any field (property or attribute). - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyFieldMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyFieldMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyFieldMatchClause", "ANY_FIELD", null, desiredValue); - return matchClause; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria - * @class - */ -function SearchCriteria() { - this["@type"] = "SearchCriteria"; - // operator should be either of "MATCH_ALL_CLAUSES" or "MATCH_ANY_CLAUSES" - this["operator"] = "MATCH_ALL_CLAUSES"; - this["matchClauses"] = []; - this["subCriterias"] = []; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addMatchClause(MatchClause) - * @method - */ -SearchCriteria.prototype.addMatchClause = function(matchClause) { - this["matchClauses"].push(matchClause); -}; - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addSubCriteria(SearchSubCriteria) - * @method - */ -SearchCriteria.prototype.addSubCriteria = function(subCriteria) { - this["subCriterias"].push(subCriteria); -}; - - -/** - * It is easier to construct instances of sub criteria using one of the factory methods: - * - * createSampleParentCriteria - * createSampleChildCriteria - * createSampleContainerCriteria - * createSampleCriteria - * createExperimentCriteria - * createDataSetContainerCriteria - * createDataSetParentCriteria - * createDataSetChildCriteria - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria - * @class - */ -function SearchSubCriteria(targetEntityKind, searchCriteria) { - this["@type"] = "SearchSubCriteria"; - this["targetEntityKind"] = targetEntityKind; - this["criteria"] = searchCriteria; -} - -/** - * Factory method to create a match for a sample parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a sample child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CHILD", searchCriteria) -} - -/** - * Factory method to create a match for a sample container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a sample. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE", searchCriteria) -} - -/** - * Factory method to create a match for an experiment. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createExperimentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createExperimentCriteria = function(searchCriteria) { - return new SearchSubCriteria("EXPERIMENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a data set parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CHILD", searchCriteria) -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js deleted file mode 100644 index 942980c82a0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/html/spin.min.js +++ /dev/null @@ -1,2 +0,0 @@ -//fgnass.github.com/spin.js#v1.2.7 -!function(e,t,n){function o(e,n){var r=t.createElement(e||"div"),i;for(i in n)r[i]=n[i];return r}function u(e){for(var t=1,n=arguments.length;t<n;t++)e.appendChild(arguments[t]);return e}function f(e,t,n,r){var o=["opacity",t,~~(e*100),n,r].join("-"),u=.01+n/r*100,f=Math.max(1-(1-e)/t*(100-u),e),l=s.substring(0,s.indexOf("Animation")).toLowerCase(),c=l&&"-"+l+"-"||"";return i[o]||(a.insertRule("@"+c+"keyframes "+o+"{"+"0%{opacity:"+f+"}"+u+"%{opacity:"+e+"}"+(u+.01)+"%{opacity:1}"+(u+t)%100+"%{opacity:"+e+"}"+"100%{opacity:"+f+"}"+"}",a.cssRules.length),i[o]=1),o}function l(e,t){var i=e.style,s,o;if(i[t]!==n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(o=0;o<r.length;o++){s=r[o]+t;if(i[s]!==n)return s}}function c(e,t){for(var n in t)e.style[l(e,n)||n]=t[n];return e}function h(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)e[i]===n&&(e[i]=r[i])}return e}function p(e){var t={x:e.offsetLeft,y:e.offsetTop};while(e=e.offsetParent)t.x+=e.offsetLeft,t.y+=e.offsetTop;return t}var r=["webkit","Moz","ms","O"],i={},s,a=function(){var e=o("style",{type:"text/css"});return u(t.getElementsByTagName("head")[0],e),e.sheet||e.styleSheet}(),d={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"},v=function m(e){if(!this.spin)return new m(e);this.opts=h(e||{},m.defaults,d)};v.defaults={},h(v.prototype,{spin:function(e){this.stop();var t=this,n=t.opts,r=t.el=c(o(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex}),i=n.radius+n.length+n.width,u,a;e&&(e.insertBefore(r,e.firstChild||null),a=p(e),u=p(r),c(r,{left:(n.left=="auto"?a.x-u.x+(e.offsetWidth>>1):parseInt(n.left,10)+i)+"px",top:(n.top=="auto"?a.y-u.y+(e.offsetHeight>>1):parseInt(n.top,10)+i)+"px"})),r.setAttribute("aria-role","progressbar"),t.lines(r,t.opts);if(!s){var f=0,l=n.fps,h=l/n.speed,d=(1-n.opacity)/(h*n.trail/100),v=h/n.lines;(function m(){f++;for(var e=n.lines;e;e--){var i=Math.max(1-(f+e*v)%h*d,n.opacity);t.opacity(r,n.lines-e,i,n)}t.timeout=t.el&&setTimeout(m,~~(1e3/l))})()}return t},stop:function(){var e=this.el;return e&&(clearTimeout(this.timeout),e.parentNode&&e.parentNode.removeChild(e),this.el=n),this},lines:function(e,t){function i(e,r){return c(o(),{position:"absolute",width:t.length+t.width+"px",height:t.width+"px",background:e,boxShadow:r,transformOrigin:"left",transform:"rotate("+~~(360/t.lines*n+t.rotate)+"deg) translate("+t.radius+"px"+",0)",borderRadius:(t.corners*t.width>>1)+"px"})}var n=0,r;for(;n<t.lines;n++)r=c(o(),{position:"absolute",top:1+~(t.width/2)+"px",transform:t.hwaccel?"translate3d(0,0,0)":"",opacity:t.opacity,animation:s&&f(t.opacity,t.trail,n,t.lines)+" "+1/t.speed+"s linear infinite"}),t.shadow&&u(r,c(i("#000","0 0 4px #000"),{top:"2px"})),u(e,u(r,i(t.color,"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(e,t,n){t<e.childNodes.length&&(e.childNodes[t].style.opacity=n)}}),function(){function e(e,t){return o("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',t)}var t=c(o("group"),{behavior:"url(#default#VML)"});!l(t,"transform")&&t.adj?(a.addRule(".spin-vml","behavior:url(#default#VML)"),v.prototype.lines=function(t,n){function s(){return c(e("group",{coordsize:i+" "+i,coordorigin:-r+" "+ -r}),{width:i,height:i})}function l(t,i,o){u(a,u(c(s(),{rotation:360/n.lines*t+"deg",left:~~i}),u(c(e("roundrect",{arcsize:n.corners}),{width:r,height:n.width,left:n.radius,top:-n.width>>1,filter:o}),e("fill",{color:n.color,opacity:n.opacity}),e("stroke",{opacity:0}))))}var r=n.length+n.width,i=2*r,o=-(n.width+n.length)*2+"px",a=c(s(),{position:"absolute",top:o,left:o}),f;if(n.shadow)for(f=1;f<=n.lines;f++)l(f,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(f=1;f<=n.lines;f++)l(f);return u(t,a)},v.prototype.opacity=function(e,t,n,r){var i=e.firstChild;r=r.shadow&&r.lines||0,i&&t+r<i.childNodes.length&&(i=i.childNodes[t+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}):s=l(t,"animation")}(),typeof define=="function"&&define.amd?define(function(){return v}):e.Spinner=v}(window,document); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties deleted file mode 100644 index fdd65d79fa0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/.gc3pie/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = data-set-details-view -data-set-entity-types = FASTQ_GZ -label = Bowtie2 Alignment diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html deleted file mode 100644 index 330d7af0d6b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/html/index.html +++ /dev/null @@ -1,428 +0,0 @@ -<head> - <title>Quantitative Genomics Facility</title> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - refresh(); - setInterval(refresh, 600000); - }); - - function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; - } - - function enableSubmission() { - $('#submitBtn').prop('disabled', false); - } - - function disableSubmission() { - $('#submitBtn').prop('disabled', true); - } - - function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - console.log(dataToShow.rows[0][0].value); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return "alert alert-success"; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 100) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - - } - - function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); - } - - function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); - } - - - function callIngestionService(method) { - var permIdentifier = context.getEntityIdentifier() - //var mySendEmail = $("#sendEmail").is(':checked') - var clusteroptions = "brutus" - var bowtieParameters = $("#Bowtie2Paramter").val() - - if ($('#brutus').is(':active')) { - clusteroptions = 'brutus'; - } - if ($('#bsseGrid').is(':active')) { - clusteroptions = 'bsseGrid'; - } - - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - myUserId = context.getSessionId().split("-")[0]; - - var parameters = - { - permId: permIdentifier, - //sendEmail: mySendEmail, - bowtieParam: bowtieParameters, - clusteroptionsParam : clusteroptions, - userId : myUserId, - method: method - }; - console.log(parameters) - - //d3.select("#main").append("div").attr("id", "progress").append("p").text("Starting Job..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggerbee", parameters, displayReturnedTable); - } - - function refresh() { - callIngestionService("pollJob") - - } - - - </script> -</head> -<body> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2>Bowtie 2 - <small>Read Alignment</small> - </h2> - </div> - </div> -</div> - -<br> - -<p> - - - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="btn-group"> - <button type="button" class="btn btn-default" id="brutus"> ETHZ Brutus Cluster </button> - <button type="button" class="btn btn-default" id="bsseGrid"> BSSE Grid </button> - - </div> - </div> - </div> -</div> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <form role="form"> - <div class="form-group"> - <label>Parameters</label> - <input type="text" class="form-control" id="Bowtie2Paramter" - placeholder="e.g. --very-sensitive --phred33 -q"> - </div> - </form> - </div> - </div> -</div> -</p> - -<p> -<!-- -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sendEmail"> Send Email when job finished - </label> - </div> - </div> - </div> -</div> ---> -</p> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" - "createInvoice-button" id="submitBtn" onclick="callIngestionService('startJob');">Start Bowtie2</button> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> -</div> -</p> - -<br> - -<p> - -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div class="panel-group" id="accordion"> - <div class="panel panel-default"> - <div class="panel-heading"> - <h6 div class="panel-title"> - <a class="accordion-toggle" data-toggle="collapse" data-parent="#accordion" - href="#collapseOne"> - Available Bowtie 2 Parameters - </a> - </div> - </h6> - </div> - <div id="collapseOne" class="panel-collapse collapse"> - <div class="panel-body"> - <pre> -Usage: - bowtie2 [options]* -x <bt2-idx> {-1 <m1> -2 <m2> | -U <r>} [-S <sam>] - - <bt2-idx> Index filename prefix (minus trailing .X.bt2). - NOTE: Bowtie 1 and Bowtie 2 indexes are not compatible. - <m1> Files with #1 mates, paired with files in <m2>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <m2> Files with #2 mates, paired with files in <m1>. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <r> Files with unpaired reads. - Could be gzip'ed (extension: .gz) or bzip2'ed (extension: .bz2). - <sam> File for SAM output (default: stdout) - - <m1>, <m2>, <r> can be comma-separated lists (no whitespace) and can be - specified many times. E.g. '-U file1.fq,file2.fq -U file3.fq'. - -Options (defaults in parentheses): - - Input: - -q query input files are FASTQ .fq/.fastq (default) - --qseq query input files are in Illumina's qseq format - -f query input files are (multi-)FASTA .fa/.mfa - -r query input files are raw one-sequence-per-line - -c <m1>, <m2>, <r> are sequences themselves, not files - -s/--skip <int> skip the first <int> reads/pairs in the input (none) - -u/--upto <int> stop after first <int> reads/pairs (no limit) - -5/--trim5 <int> trim <int> bases from 5'/left end of reads (0) - -3/--trim3 <int> trim <int> bases from 3'/right end of reads (0) - --phred33 qualities are Phred+33 (default) - --phred64 qualities are Phred+64 - --int-quals qualities encoded as space-delimited integers - - Presets: Same as: - For --end-to-end: - --very-fast -D 5 -R 1 -N 0 -L 22 -i S,0,2.50 - --fast -D 10 -R 2 -N 0 -L 22 -i S,0,2.50 - --sensitive -D 15 -R 2 -N 0 -L 22 -i S,1,1.15 (default) - --very-sensitive -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - For --local: - --very-fast-local -D 5 -R 1 -N 0 -L 25 -i S,1,2.00 - --fast-local -D 10 -R 2 -N 0 -L 22 -i S,1,1.75 - --sensitive-local -D 15 -R 2 -N 0 -L 20 -i S,1,0.75 (default) - --very-sensitive-local -D 20 -R 3 -N 0 -L 20 -i S,1,0.50 - - Alignment: - -N <int> max # mismatches in seed alignment; can be 0 or 1 (0) - -L <int> length of seed substrings; must be >3, <32 (22) - -i <func> interval between seed substrings w/r/t read len (S,1,1.15) - --n-ceil <func> func for max # non-A/C/G/Ts permitted in aln (L,0,0.15) - --dpad <int> include <int> extra ref chars on sides of DP table (15) - --gbar <int> disallow gaps within <int> nucs of read extremes (4) - --ignore-quals treat all quality values as 30 on Phred scale (off) - --nofw do not align forward (original) version of read (off) - --norc do not align reverse-complement version of read (off) - - --end-to-end entire read must align; no clipping (on) - OR - --local local alignment; ends might be soft clipped (off) - - Scoring: - --ma <int> match bonus (0 for --end-to-end, 2 for --local) - --mp <int> max penalty for mismatch; lower qual = lower penalty (6) - --np <int> penalty for non-A/C/G/Ts in read/ref (1) - --rdg <int>,<int> read gap open, extend penalties (5,3) - --rfg <int>,<int> reference gap open, extend penalties (5,3) - --score-min <func> min acceptable alignment score w/r/t read length - (G,20,8 for local, L,-0.6,-0.6 for end-to-end) - - Reporting: - (default) look for multiple alignments, report best, with MAPQ - OR - -k <int> report up to <int> alns per read; MAPQ not meaningful - OR - -a/--all report all alignments; very slow, MAPQ not meaningful - - Effort: - -D <int> give up extending after <int> failed extends in a row (15) - -R <int> for reads w/ repetitive seeds, try <int> sets of seeds (2) - - Paired-end: - -I/--minins <int> minimum fragment length (0) - -X/--maxins <int> maximum fragment length (500) - --fr/--rf/--ff -1, -2 mates align fw/rev, rev/fw, fw/fw (--fr) - --no-mixed suppress unpaired alignments for paired reads - --no-discordant suppress discordant alignments for paired reads - --no-dovetail not concordant when mates extend past each other - --no-contain not concordant when one mate alignment contains other - --no-overlap not concordant when mates overlap at all - - Output: - -t/--time print wall-clock time taken by search phases - --un <path> write unpaired reads that didn't align to <path> - --al <path> write unpaired reads that aligned at least once to <path> - --un-conc <path> write pairs that didn't align concordantly to <path> - --al-conc <path> write pairs that aligned concordantly at least once to <path> - (Note: for --un, --al, --un-conc, or --al-conc, add '-gz' to the option name, e.g. - --un-gz <path>, to gzip compress output, or add '-bz2' to bzip2 compress output.) - --quiet print nothing to stderr except serious errors - --met-file <path> send metrics to file at <path> (off) - --met-stderr send metrics to stderr (off) - --met <int> report internal counters & metrics every <int> secs (1) - --no-head supppress header lines, i.e. lines starting with @ - --no-sq supppress @SQ header lines - --rg-id <text> set read group id, reflected in @RG line and RG:Z: opt field - --rg <text> add <text> ("lab:value") to @RG line of SAM header. - Note: @RG line only printed when --rg-id is set. - --omit-sec-seq put '*' in SEQ and QUAL fields for secondary alignments. - - Performance: - -o/--offrate <int> override offrate of index; must be >= index's offrate - -p/--threads <int> number of alignment threads to launch (1) - --reorder force SAM output order to match order of input reads - --mm use memory-mapped I/O for index; many 'bowtie's can share - - Other: - --qc-filter filter out reads that are bad according to QSEQ filter - --seed <int> seed for random number generator (0) - --non-deterministic seed rand. gen. arbitrarily instead of using read attributes - --version print version information and quit - -h/--help print this usage message -</pre> - </div> - </div> - </div> - </div> - </div> -</div> -</div> -</div> -</p> -</div> - -<!-- Placeholder for the output coming back from the server --> -<div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"> - </div> - </div> - </div> -</div> - -<!-- Footer ================================================== --> - -<footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="http://bowtie-bio.sourceforge.net/bowtie2/index.shtml" target="_blank">Bowtie 2 Homepage</a> - </div> - </h6> -</footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties deleted file mode 100644 index fdd65d79fa0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/bee/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = data-set-details-view -data-set-entity-types = FASTQ_GZ -label = Bowtie2 Alignment diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html deleted file mode 100644 index 127a1899a18..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/index.html +++ /dev/null @@ -1,324 +0,0 @@ -<!DOCTYPE html> -<html> - <head> - <title>Flowcell Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - - </head> - <body> - <div id="container" class="container"> - <script> - - var formatThousands = d3.format(","); - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - var prop; - var flowcellProperties = []; - var myArray = []; - var sumArray = []; - var sumArrayNOINDEX = []; - var sumsArray = [] - - loadData() - - /* ------- General functions -------------------------------------------*/ - - // used for sorting by lane of the final array of objects - function compare(a,b) { - if (a.lane < b.lane) - return -1; - if (a.lane > b.lane) - return 1; - return 0; - } - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); - } - - if (typeof String.prototype.startsWith != 'function') { - // see below for better implementation! - String.prototype.startsWith = function (str){ - return this.indexOf(str) === 0; - }; - } - - - /* -------------------------------------------------------------------*/ - -function loadData () { - var dataSetProperties; - var prop; - - dsu.retrieveSample(webAppContext.getEntityIdentifier(), function(response) { - - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - - var sampleCodes = []; - for (i = 1; i <= numberOfLanes; i++) { - sampleCodes.push(webAppContext.getEntityIdentifier() + ":" + i); - } - - var clusters = "" - // just take the first lane to read out the BCL version - dsu.retrieveSampleWithPropertiesCode(sampleCodes[0], function(laneResponse) { - // console.log(laneResponse) - bclVersion = laneResponse.result[0].properties.BCL_VERSION - if (bclVersion !== undefined) { - if (bclVersion.startsWith("bcl2fastq v2")) { - clusters = "Clusters"; - } - else { - clusters = "Reads"; - } - } - else { clusters = "Reads"}; - }); - - var deferrer = new openbisActionDeferrer(function(){ - sumArray.sort(compare); - sumArrayNOINDEX.sort(compare); - plotLaneTable (sumArrayNOINDEX, true, clusters); - placeholder() - plotLaneTable (sumArray, false, clusters); - downloadButton ("tableStats"); - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - }, sampleCodes, clusters); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveDataSetsForSample(sampleCode, function(response){ - getProperties(response); - //console.log("got response " + sampleCode); - var sums = calculateSum(myArray, sampleCode, true); - var sumsNOINDEX = calculateSum(myArray, sampleCode, false); - sumArray.push(sums[0]); - sumArrayNOINDEX.push(sumsNOINDEX[0]); - myArray = []; - deferrer.dependencyCompleted(sampleCode); - }); - }); - - function getProperties(dataSetProperties) { - for (var i = 0; i < dataSetProperties.result.length; i++) { - myArray.push({ - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE) - }); - }; - }; - }); -}; - -function plotLaneTable (sumArray, withNOINDEX, clusters) { - - //d3.select("body").append("text") - // .text("Summary Table") - // .attr("class", "h3"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return " All " + clusters;} return " Without Undetermined " + clusters;}) - .attr("class", "h3"); - - d3.select("body") - .append("p") - ; - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - header = {} - header["Lane"] = 1 - header["# of Samples"] = 1 - header["AVG Passed Filtering (PF)"] = 1 - header["Sum Raw " + clusters] = 1 - header["Sum PF " + clusters] = 1 - header["Sum Raw Bases"] = 1 - header["Sum PF Bases"] = 1 - header["AVG Raw Clusters in % per Index"] = 1 - header["AVG PF Phred Score"] = 1 - header["AVG > 30 Phred Score"] = 1 - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - ; - - // create rows - // console.log("Sumarray") - // console.log(sumArray) - //sumArray.splice(1,3) - - - // litte hack which removes three lanes of the FC view, as the NextSeq has four lanes - // as specified by Illumina, but logically it is only one lane - // So if the FC has four lanes we assume it is a NextSeq run and therefore we remove the last three - // lanes via the splice method - if (sumArray.length == 4) { - sumArray.splice(1,3) - } - - /* - for (i=0; i< sumArray.length; i++) { - console.log(sumArray[i].numberOfSamples) - if (sumArray[i].numberOfSamples == 0) { - console.log("NO samples in "+ i) - sumArray.splice(i,1) - } - } - */ - - var tr = laneTableStats.selectAll("tr") - .data(sumArray).enter().append("tr") - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 0) - .attr("height", 100) - ; -} - -function calculateSum(statisticsArray, sampleCode, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane / Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'lane' : sampleCode.split("/")[2].split(":")[1], - 'numberOfSamples' : statisticsArray.length, - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - return sums; -} - - - function downloadButton (buttonName) { - - var div = d3.select("body").append("button") - .attr("class", "btn btn-default btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; - } - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.entityIdentifier - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_" + svgName + "." + output_format); - - } - - </script> - </div> - </body> -</html> - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css deleted file mode 100644 index 985d8ac6db0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/html/style.css +++ /dev/null @@ -1,47 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - font-family: sans-serif; - font-size: 14px; - border-collapse:collapse; - } - - .tableStats th { - padding:6px 10px; - color:#444; - font-weight:bold; - text-shadow:1px 1px 1px #fff; - border-bottom:2px solid #444; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - - padding:0px 10px 10px 10px; - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties deleted file mode 100644 index 19629033996..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/cellStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Flow Cell Statistics diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css deleted file mode 100644 index f860bbc069d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css +++ /dev/null @@ -1,442 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -.btn-default, -.btn-primary, -.btn-success, -.btn-info, -.btn-warning, -.btn-danger { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); -} -.btn-default:active, -.btn-primary:active, -.btn-success:active, -.btn-info:active, -.btn-warning:active, -.btn-danger:active, -.btn-default.active, -.btn-primary.active, -.btn-success.active, -.btn-info.active, -.btn-warning.active, -.btn-danger.active { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn:active, -.btn.active { - background-image: none; -} -.btn-default { - text-shadow: 0 1px 0 #fff; - background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); - background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #dbdbdb; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus { - background-color: #e0e0e0; - background-position: 0 -15px; -} -.btn-default:active, -.btn-default.active { - background-color: #e0e0e0; - border-color: #dbdbdb; -} -.btn-default:disabled, -.btn-default[disabled] { - background-color: #e0e0e0; - background-image: none; -} -.btn-primary { - background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2)); - background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #2b669a; -} -.btn-primary:hover, -.btn-primary:focus { - background-color: #2d6ca2; - background-position: 0 -15px; -} -.btn-primary:active, -.btn-primary.active { - background-color: #2d6ca2; - border-color: #2b669a; -} -.btn-primary:disabled, -.btn-primary[disabled] { - background-color: #2d6ca2; - background-image: none; -} -.btn-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #3e8f3e; -} -.btn-success:hover, -.btn-success:focus { - background-color: #419641; - background-position: 0 -15px; -} -.btn-success:active, -.btn-success.active { - background-color: #419641; - border-color: #3e8f3e; -} -.btn-success:disabled, -.btn-success[disabled] { - background-color: #419641; - background-image: none; -} -.btn-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #28a4c9; -} -.btn-info:hover, -.btn-info:focus { - background-color: #2aabd2; - background-position: 0 -15px; -} -.btn-info:active, -.btn-info.active { - background-color: #2aabd2; - border-color: #28a4c9; -} -.btn-info:disabled, -.btn-info[disabled] { - background-color: #2aabd2; - background-image: none; -} -.btn-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #e38d13; -} -.btn-warning:hover, -.btn-warning:focus { - background-color: #eb9316; - background-position: 0 -15px; -} -.btn-warning:active, -.btn-warning.active { - background-color: #eb9316; - border-color: #e38d13; -} -.btn-warning:disabled, -.btn-warning[disabled] { - background-color: #eb9316; - background-image: none; -} -.btn-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-color: #b92c28; -} -.btn-danger:hover, -.btn-danger:focus { - background-color: #c12e2a; - background-position: 0 -15px; -} -.btn-danger:active, -.btn-danger.active { - background-color: #c12e2a; - border-color: #b92c28; -} -.btn-danger:disabled, -.btn-danger[disabled] { - background-color: #c12e2a; - background-image: none; -} -.thumbnail, -.img-thumbnail { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - background-color: #e8e8e8; - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - background-color: #357ebd; - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.navbar-default { - background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); - background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); -} -.navbar-default .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); -} -.navbar-brand, -.navbar-nav > li > a { - text-shadow: 0 1px 0 rgba(255, 255, 255, .25); -} -.navbar-inverse { - background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); - background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); - background-repeat: repeat-x; -} -.navbar-inverse .navbar-nav > .active > a { - background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); - background-image: -o-linear-gradient(top, #222 0%, #282828 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828)); - background-image: linear-gradient(to bottom, #222 0%, #282828 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); - background-repeat: repeat-x; - -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); - box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); -} -.navbar-inverse .navbar-brand, -.navbar-inverse .navbar-nav > li > a { - text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); -} -.navbar-static-top, -.navbar-fixed-top, -.navbar-fixed-bottom { - border-radius: 0; -} -.alert { - text-shadow: 0 1px 0 rgba(255, 255, 255, .2); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); -} -.alert-success { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); - background-repeat: repeat-x; - border-color: #b2dba1; -} -.alert-info { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); - background-repeat: repeat-x; - border-color: #9acfea; -} -.alert-warning { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); - background-repeat: repeat-x; - border-color: #f5e79e; -} -.alert-danger { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); - background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); - background-repeat: repeat-x; - border-color: #dca7a7; -} -.progress { - background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar { - background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9)); - background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-success { - background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); - background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-info { - background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); - background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-warning { - background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); - background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-danger { - background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); - background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); - background-repeat: repeat-x; -} -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.list-group { - border-radius: 4px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); - box-shadow: 0 1px 2px rgba(0, 0, 0, .075); -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - text-shadow: 0 -1px 0 #3071a9; - background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3)); - background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); - background-repeat: repeat-x; - border-color: #3278b3; -} -.panel { - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); - box-shadow: 0 1px 2px rgba(0, 0, 0, .05); -} -.panel-default > .panel-heading { - background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); - background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); - background-repeat: repeat-x; -} -.panel-primary > .panel-heading { - background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd)); - background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); - background-repeat: repeat-x; -} -.panel-success > .panel-heading { - background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); - background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); - background-repeat: repeat-x; -} -.panel-info > .panel-heading { - background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); - background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); - background-repeat: repeat-x; -} -.panel-warning > .panel-heading { - background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); - background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); - background-repeat: repeat-x; -} -.panel-danger > .panel-heading { - background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); - background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); - background-repeat: repeat-x; -} -.well { - background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); - background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); - background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); - background-repeat: repeat-x; - border-color: #dcdcdc; - -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); -} -/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map deleted file mode 100644 index 4cc41ab001a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap-theme.css","sources":["less/theme.less","less/mixins/vendor-prefixes.less","bootstrap-theme.css","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAeA;;;;;;EAME,0CAAA;EC+CA,6FAAA;EACQ,qFAAA;EC5DT;AFiBC;;;;;;;;;;;;EC0CA,0DAAA;EACQ,kDAAA;EC7CT;AFqCC;;EAEE,wBAAA;EEnCH;AFwCD;EG/CI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EA+B2C,2BAAA;EAA2B,oBAAA;EE7BvE;AFAC;;EAEE,2BAAA;EACA,8BAAA;EEEH;AFCC;;EAEE,2BAAA;EACA,uBAAA;EECH;AFEC;;EAEE,2BAAA;EACA,wBAAA;EEAH;AFeD;EGhDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0BD;AFxBC;;EAEE,2BAAA;EACA,8BAAA;EE0BH;AFvBC;;EAEE,2BAAA;EACA,uBAAA;EEyBH;AFtBC;;EAEE,2BAAA;EACA,wBAAA;EEwBH;AFRD;EGjDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkDD;AFhDC;;EAEE,2BAAA;EACA,8BAAA;EEkDH;AF/CC;;EAEE,2BAAA;EACA,uBAAA;EEiDH;AF9CC;;EAEE,2BAAA;EACA,wBAAA;EEgDH;AF/BD;EGlDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0ED;AFxEC;;EAEE,2BAAA;EACA,8BAAA;EE0EH;AFvEC;;EAEE,2BAAA;EACA,uBAAA;EEyEH;AFtEC;;EAEE,2BAAA;EACA,wBAAA;EEwEH;AFtDD;EGnDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EEkGD;AFhGC;;EAEE,2BAAA;EACA,8BAAA;EEkGH;AF/FC;;EAEE,2BAAA;EACA,uBAAA;EEiGH;AF9FC;;EAEE,2BAAA;EACA,wBAAA;EEgGH;AF7ED;EGpDI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EAEA,wHAAA;ECnBF,qEAAA;EJ8BA,6BAAA;EACA,uBAAA;EE0HD;AFxHC;;EAEE,2BAAA;EACA,8BAAA;EE0HH;AFvHC;;EAEE,2BAAA;EACA,uBAAA;EEyHH;AFtHC;;EAEE,2BAAA;EACA,wBAAA;EEwHH;AF7FD;;ECbE,oDAAA;EACQ,4CAAA;EC8GT;AFvFD;;EGvEI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHsEF,2BAAA;EE6FD;AF3FD;;;EG5EI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH4EF,2BAAA;EEiGD;AFvFD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EJ4GA,oBAAA;EC9CA,6FAAA;EACQ,qFAAA;EC4IT;AFlGD;EG1FI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,0DAAA;EACQ,kDAAA;ECqJT;AF/FD;;EAEE,gDAAA;EEiGD;AF7FD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ECnBF,qEAAA;EFgOD;AFrGD;EG5GI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EF2CF,yDAAA;EACQ,iDAAA;EC0KT;AF9GD;;EAWI,2CAAA;EEuGH;AFlGD;;;EAGE,kBAAA;EEoGD;AF1FD;EACE,+CAAA;EC3FA,4FAAA;EACQ,oFAAA;ECwLT;AFlFD;EGtJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8FD;AFzFD;EGvJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsGD;AFhGD;EGxJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EE8GD;AFvGD;EGzJI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EH8IF,uBAAA;EEsHD;AFtGD;EGlKI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED2QH;AFnGD;EG5KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDkRH;AFzGD;EG7KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDyRH;AF/GD;EG9KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDgSH;AFrHD;EG/KI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDuSH;AF3HD;EGhLI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8SH;AF9HD;EGnJI,+MAAA;EACA,0MAAA;EACA,uMAAA;EDoRH;AF1HD;EACE,oBAAA;EC/IA,oDAAA;EACQ,4CAAA;EC4QT;AF3HD;;;EAGE,+BAAA;EGpME,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHkMF,uBAAA;EEiID;AFvHD;ECjKE,mDAAA;EACQ,2CAAA;EC2RT;AFjHD;EG1NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED8UH;AFvHD;EG3NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDqVH;AF7HD;EG5NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED4VH;AFnID;EG7NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDmWH;AFzID;EG9NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;ED0WH;AF/ID;EG/NI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EDiXH;AF9ID;EGvOI,0EAAA;EACA,qEAAA;EACA,+FAAA;EAAA,wEAAA;EACA,6BAAA;EACA,wHAAA;EHqOF,uBAAA;EC1LA,2FAAA;EACQ,mFAAA;EC+UT","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &:disabled,\n &[disabled] {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n",null,"// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css deleted file mode 100644 index 2e97597c876..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap-theme.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */.btn-default,.btn-primary,.btn-success,.btn-info,.btn-warning,.btn-danger{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-default:active,.btn-primary:active,.btn-success:active,.btn-info:active,.btn-warning:active,.btn-danger:active,.btn-default.active,.btn-primary.active,.btn-success.active,.btn-info.active,.btn-warning.active,.btn-danger.active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:active,.btn.active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:hover,.btn-default:focus{background-color:#e0e0e0;background-position:0 -15px}.btn-default:active,.btn-default.active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default:disabled,.btn-default[disabled]{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-o-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#2d6ca2));background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-primary:disabled,.btn-primary[disabled]{background-color:#2d6ca2;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:hover,.btn-success:focus{background-color:#419641;background-position:0 -15px}.btn-success:active,.btn-success.active{background-color:#419641;border-color:#3e8f3e}.btn-success:disabled,.btn-success[disabled]{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:hover,.btn-info:focus{background-color:#2aabd2;background-position:0 -15px}.btn-info:active,.btn-info.active{background-color:#2aabd2;border-color:#28a4c9}.btn-info:disabled,.btn-info[disabled]{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:hover,.btn-warning:focus{background-color:#eb9316;background-position:0 -15px}.btn-warning:active,.btn-warning.active{background-color:#eb9316;border-color:#e38d13}.btn-warning:disabled,.btn-warning[disabled]{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:hover,.btn-danger:focus{background-color:#c12e2a;background-position:0 -15px}.btn-danger:active,.btn-danger.active{background-color:#c12e2a;border-color:#b92c28}.btn-danger:disabled,.btn-danger[disabled]{background-color:#c12e2a;background-image:none}.thumbnail,.img-thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-color:#357ebd;background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f3f3f3));background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:-o-linear-gradient(top,#222 0,#282828 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#222),to(#282828));background-image:linear-gradient(to bottom,#222 0,#282828 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-static-top,.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-o-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3071a9));background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{text-shadow:0 -1px 0 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-o-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#3278b3));background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);background-repeat:repeat-x;border-color:#3278b3}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-o-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#428bca),to(#357ebd));background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css deleted file mode 100644 index 037dd056151..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css +++ /dev/null @@ -1,6203 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -/*! normalize.css v3.0.1 | MIT License | git.io/normalize */ -html { - font-family: sans-serif; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -body { - margin: 0; -} -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} -audio, -canvas, -progress, -video { - display: inline-block; - vertical-align: baseline; -} -audio:not([controls]) { - display: none; - height: 0; -} -[hidden], -template { - display: none; -} -a { - background: transparent; -} -a:active, -a:hover { - outline: 0; -} -abbr[title] { - border-bottom: 1px dotted; -} -b, -strong { - font-weight: bold; -} -dfn { - font-style: italic; -} -h1 { - margin: .67em 0; - font-size: 2em; -} -mark { - color: #000; - background: #ff0; -} -small { - font-size: 80%; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -.5em; -} -sub { - bottom: -.25em; -} -img { - border: 0; -} -svg:not(:root) { - overflow: hidden; -} -figure { - margin: 1em 40px; -} -hr { - height: 0; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -pre { - overflow: auto; -} -code, -kbd, -pre, -samp { - font-family: monospace, monospace; - font-size: 1em; -} -button, -input, -optgroup, -select, -textarea { - margin: 0; - font: inherit; - color: inherit; -} -button { - overflow: visible; -} -button, -select { - text-transform: none; -} -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; - cursor: pointer; -} -button[disabled], -html input[disabled] { - cursor: default; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -input { - line-height: normal; -} -input[type="checkbox"], -input[type="radio"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; -} -input[type="number"]::-webkit-inner-spin-button, -input[type="number"]::-webkit-outer-spin-button { - height: auto; -} -input[type="search"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - -webkit-appearance: textfield; -} -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} -fieldset { - padding: .35em .625em .75em; - margin: 0 2px; - border: 1px solid #c0c0c0; -} -legend { - padding: 0; - border: 0; -} -textarea { - overflow: auto; -} -optgroup { - font-weight: bold; -} -table { - border-spacing: 0; - border-collapse: collapse; -} -td, -th { - padding: 0; -} -@media print { - * { - color: #000 !important; - text-shadow: none !important; - background: transparent !important; - -webkit-box-shadow: none !important; - box-shadow: none !important; - } - a, - a:visited { - text-decoration: underline; - } - a[href]:after { - content: " (" attr(href) ")"; - } - abbr[title]:after { - content: " (" attr(title) ")"; - } - a[href^="javascript:"]:after, - a[href^="#"]:after { - content: ""; - } - pre, - blockquote { - border: 1px solid #999; - - page-break-inside: avoid; - } - thead { - display: table-header-group; - } - tr, - img { - page-break-inside: avoid; - } - img { - max-width: 100% !important; - } - p, - h2, - h3 { - orphans: 3; - widows: 3; - } - h2, - h3 { - page-break-after: avoid; - } - select { - background: #fff !important; - } - .navbar { - display: none; - } - .table td, - .table th { - background-color: #fff !important; - } - .btn > .caret, - .dropup > .btn > .caret { - border-top-color: #000 !important; - } - .label { - border: 1px solid #000; - } - .table { - border-collapse: collapse !important; - } - .table-bordered th, - .table-bordered td { - border: 1px solid #ddd !important; - } -} -@font-face { - font-family: 'Glyphicons Halflings'; - - src: url('../fonts/glyphicons-halflings-regular.eot'); - src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); -} -.glyphicon { - position: relative; - top: 1px; - display: inline-block; - font-family: 'Glyphicons Halflings'; - font-style: normal; - font-weight: normal; - line-height: 1; - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.glyphicon-asterisk:before { - content: "\2a"; -} -.glyphicon-plus:before { - content: "\2b"; -} -.glyphicon-euro:before { - content: "\20ac"; -} -.glyphicon-minus:before { - content: "\2212"; -} -.glyphicon-cloud:before { - content: "\2601"; -} -.glyphicon-envelope:before { - content: "\2709"; -} -.glyphicon-pencil:before { - content: "\270f"; -} -.glyphicon-glass:before { - content: "\e001"; -} -.glyphicon-music:before { - content: "\e002"; -} -.glyphicon-search:before { - content: "\e003"; -} -.glyphicon-heart:before { - content: "\e005"; -} -.glyphicon-star:before { - content: "\e006"; -} -.glyphicon-star-empty:before { - content: "\e007"; -} -.glyphicon-user:before { - content: "\e008"; -} -.glyphicon-film:before { - content: "\e009"; -} -.glyphicon-th-large:before { - content: "\e010"; -} -.glyphicon-th:before { - content: "\e011"; -} -.glyphicon-th-list:before { - content: "\e012"; -} -.glyphicon-ok:before { - content: "\e013"; -} -.glyphicon-remove:before { - content: "\e014"; -} -.glyphicon-zoom-in:before { - content: "\e015"; -} -.glyphicon-zoom-out:before { - content: "\e016"; -} -.glyphicon-off:before { - content: "\e017"; -} -.glyphicon-signal:before { - content: "\e018"; -} -.glyphicon-cog:before { - content: "\e019"; -} -.glyphicon-trash:before { - content: "\e020"; -} -.glyphicon-home:before { - content: "\e021"; -} -.glyphicon-file:before { - content: "\e022"; -} -.glyphicon-time:before { - content: "\e023"; -} -.glyphicon-road:before { - content: "\e024"; -} -.glyphicon-download-alt:before { - content: "\e025"; -} -.glyphicon-download:before { - content: "\e026"; -} -.glyphicon-upload:before { - content: "\e027"; -} -.glyphicon-inbox:before { - content: "\e028"; -} -.glyphicon-play-circle:before { - content: "\e029"; -} -.glyphicon-repeat:before { - content: "\e030"; -} -.glyphicon-refresh:before { - content: "\e031"; -} -.glyphicon-list-alt:before { - content: "\e032"; -} -.glyphicon-lock:before { - content: "\e033"; -} -.glyphicon-flag:before { - content: "\e034"; -} -.glyphicon-headphones:before { - content: "\e035"; -} -.glyphicon-volume-off:before { - content: "\e036"; -} -.glyphicon-volume-down:before { - content: "\e037"; -} -.glyphicon-volume-up:before { - content: "\e038"; -} -.glyphicon-qrcode:before { - content: "\e039"; -} -.glyphicon-barcode:before { - content: "\e040"; -} -.glyphicon-tag:before { - content: "\e041"; -} -.glyphicon-tags:before { - content: "\e042"; -} -.glyphicon-book:before { - content: "\e043"; -} -.glyphicon-bookmark:before { - content: "\e044"; -} -.glyphicon-print:before { - content: "\e045"; -} -.glyphicon-camera:before { - content: "\e046"; -} -.glyphicon-font:before { - content: "\e047"; -} -.glyphicon-bold:before { - content: "\e048"; -} -.glyphicon-italic:before { - content: "\e049"; -} -.glyphicon-text-height:before { - content: "\e050"; -} -.glyphicon-text-width:before { - content: "\e051"; -} -.glyphicon-align-left:before { - content: "\e052"; -} -.glyphicon-align-center:before { - content: "\e053"; -} -.glyphicon-align-right:before { - content: "\e054"; -} -.glyphicon-align-justify:before { - content: "\e055"; -} -.glyphicon-list:before { - content: "\e056"; -} -.glyphicon-indent-left:before { - content: "\e057"; -} -.glyphicon-indent-right:before { - content: "\e058"; -} -.glyphicon-facetime-video:before { - content: "\e059"; -} -.glyphicon-picture:before { - content: "\e060"; -} -.glyphicon-map-marker:before { - content: "\e062"; -} -.glyphicon-adjust:before { - content: "\e063"; -} -.glyphicon-tint:before { - content: "\e064"; -} -.glyphicon-edit:before { - content: "\e065"; -} -.glyphicon-share:before { - content: "\e066"; -} -.glyphicon-check:before { - content: "\e067"; -} -.glyphicon-move:before { - content: "\e068"; -} -.glyphicon-step-backward:before { - content: "\e069"; -} -.glyphicon-fast-backward:before { - content: "\e070"; -} -.glyphicon-backward:before { - content: "\e071"; -} -.glyphicon-play:before { - content: "\e072"; -} -.glyphicon-pause:before { - content: "\e073"; -} -.glyphicon-stop:before { - content: "\e074"; -} -.glyphicon-forward:before { - content: "\e075"; -} -.glyphicon-fast-forward:before { - content: "\e076"; -} -.glyphicon-step-forward:before { - content: "\e077"; -} -.glyphicon-eject:before { - content: "\e078"; -} -.glyphicon-chevron-left:before { - content: "\e079"; -} -.glyphicon-chevron-right:before { - content: "\e080"; -} -.glyphicon-plus-sign:before { - content: "\e081"; -} -.glyphicon-minus-sign:before { - content: "\e082"; -} -.glyphicon-remove-sign:before { - content: "\e083"; -} -.glyphicon-ok-sign:before { - content: "\e084"; -} -.glyphicon-question-sign:before { - content: "\e085"; -} -.glyphicon-info-sign:before { - content: "\e086"; -} -.glyphicon-screenshot:before { - content: "\e087"; -} -.glyphicon-remove-circle:before { - content: "\e088"; -} -.glyphicon-ok-circle:before { - content: "\e089"; -} -.glyphicon-ban-circle:before { - content: "\e090"; -} -.glyphicon-arrow-left:before { - content: "\e091"; -} -.glyphicon-arrow-right:before { - content: "\e092"; -} -.glyphicon-arrow-up:before { - content: "\e093"; -} -.glyphicon-arrow-down:before { - content: "\e094"; -} -.glyphicon-share-alt:before { - content: "\e095"; -} -.glyphicon-resize-full:before { - content: "\e096"; -} -.glyphicon-resize-small:before { - content: "\e097"; -} -.glyphicon-exclamation-sign:before { - content: "\e101"; -} -.glyphicon-gift:before { - content: "\e102"; -} -.glyphicon-leaf:before { - content: "\e103"; -} -.glyphicon-fire:before { - content: "\e104"; -} -.glyphicon-eye-open:before { - content: "\e105"; -} -.glyphicon-eye-close:before { - content: "\e106"; -} -.glyphicon-warning-sign:before { - content: "\e107"; -} -.glyphicon-plane:before { - content: "\e108"; -} -.glyphicon-calendar:before { - content: "\e109"; -} -.glyphicon-random:before { - content: "\e110"; -} -.glyphicon-comment:before { - content: "\e111"; -} -.glyphicon-magnet:before { - content: "\e112"; -} -.glyphicon-chevron-up:before { - content: "\e113"; -} -.glyphicon-chevron-down:before { - content: "\e114"; -} -.glyphicon-retweet:before { - content: "\e115"; -} -.glyphicon-shopping-cart:before { - content: "\e116"; -} -.glyphicon-folder-close:before { - content: "\e117"; -} -.glyphicon-folder-open:before { - content: "\e118"; -} -.glyphicon-resize-vertical:before { - content: "\e119"; -} -.glyphicon-resize-horizontal:before { - content: "\e120"; -} -.glyphicon-hdd:before { - content: "\e121"; -} -.glyphicon-bullhorn:before { - content: "\e122"; -} -.glyphicon-bell:before { - content: "\e123"; -} -.glyphicon-certificate:before { - content: "\e124"; -} -.glyphicon-thumbs-up:before { - content: "\e125"; -} -.glyphicon-thumbs-down:before { - content: "\e126"; -} -.glyphicon-hand-right:before { - content: "\e127"; -} -.glyphicon-hand-left:before { - content: "\e128"; -} -.glyphicon-hand-up:before { - content: "\e129"; -} -.glyphicon-hand-down:before { - content: "\e130"; -} -.glyphicon-circle-arrow-right:before { - content: "\e131"; -} -.glyphicon-circle-arrow-left:before { - content: "\e132"; -} -.glyphicon-circle-arrow-up:before { - content: "\e133"; -} -.glyphicon-circle-arrow-down:before { - content: "\e134"; -} -.glyphicon-globe:before { - content: "\e135"; -} -.glyphicon-wrench:before { - content: "\e136"; -} -.glyphicon-tasks:before { - content: "\e137"; -} -.glyphicon-filter:before { - content: "\e138"; -} -.glyphicon-briefcase:before { - content: "\e139"; -} -.glyphicon-fullscreen:before { - content: "\e140"; -} -.glyphicon-dashboard:before { - content: "\e141"; -} -.glyphicon-paperclip:before { - content: "\e142"; -} -.glyphicon-heart-empty:before { - content: "\e143"; -} -.glyphicon-link:before { - content: "\e144"; -} -.glyphicon-phone:before { - content: "\e145"; -} -.glyphicon-pushpin:before { - content: "\e146"; -} -.glyphicon-usd:before { - content: "\e148"; -} -.glyphicon-gbp:before { - content: "\e149"; -} -.glyphicon-sort:before { - content: "\e150"; -} -.glyphicon-sort-by-alphabet:before { - content: "\e151"; -} -.glyphicon-sort-by-alphabet-alt:before { - content: "\e152"; -} -.glyphicon-sort-by-order:before { - content: "\e153"; -} -.glyphicon-sort-by-order-alt:before { - content: "\e154"; -} -.glyphicon-sort-by-attributes:before { - content: "\e155"; -} -.glyphicon-sort-by-attributes-alt:before { - content: "\e156"; -} -.glyphicon-unchecked:before { - content: "\e157"; -} -.glyphicon-expand:before { - content: "\e158"; -} -.glyphicon-collapse-down:before { - content: "\e159"; -} -.glyphicon-collapse-up:before { - content: "\e160"; -} -.glyphicon-log-in:before { - content: "\e161"; -} -.glyphicon-flash:before { - content: "\e162"; -} -.glyphicon-log-out:before { - content: "\e163"; -} -.glyphicon-new-window:before { - content: "\e164"; -} -.glyphicon-record:before { - content: "\e165"; -} -.glyphicon-save:before { - content: "\e166"; -} -.glyphicon-open:before { - content: "\e167"; -} -.glyphicon-saved:before { - content: "\e168"; -} -.glyphicon-import:before { - content: "\e169"; -} -.glyphicon-export:before { - content: "\e170"; -} -.glyphicon-send:before { - content: "\e171"; -} -.glyphicon-floppy-disk:before { - content: "\e172"; -} -.glyphicon-floppy-saved:before { - content: "\e173"; -} -.glyphicon-floppy-remove:before { - content: "\e174"; -} -.glyphicon-floppy-save:before { - content: "\e175"; -} -.glyphicon-floppy-open:before { - content: "\e176"; -} -.glyphicon-credit-card:before { - content: "\e177"; -} -.glyphicon-transfer:before { - content: "\e178"; -} -.glyphicon-cutlery:before { - content: "\e179"; -} -.glyphicon-header:before { - content: "\e180"; -} -.glyphicon-compressed:before { - content: "\e181"; -} -.glyphicon-earphone:before { - content: "\e182"; -} -.glyphicon-phone-alt:before { - content: "\e183"; -} -.glyphicon-tower:before { - content: "\e184"; -} -.glyphicon-stats:before { - content: "\e185"; -} -.glyphicon-sd-video:before { - content: "\e186"; -} -.glyphicon-hd-video:before { - content: "\e187"; -} -.glyphicon-subtitles:before { - content: "\e188"; -} -.glyphicon-sound-stereo:before { - content: "\e189"; -} -.glyphicon-sound-dolby:before { - content: "\e190"; -} -.glyphicon-sound-5-1:before { - content: "\e191"; -} -.glyphicon-sound-6-1:before { - content: "\e192"; -} -.glyphicon-sound-7-1:before { - content: "\e193"; -} -.glyphicon-copyright-mark:before { - content: "\e194"; -} -.glyphicon-registration-mark:before { - content: "\e195"; -} -.glyphicon-cloud-download:before { - content: "\e197"; -} -.glyphicon-cloud-upload:before { - content: "\e198"; -} -.glyphicon-tree-conifer:before { - content: "\e199"; -} -.glyphicon-tree-deciduous:before { - content: "\e200"; -} -* { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -*:before, -*:after { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -html { - font-size: 10px; - - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -} -body { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 14px; - line-height: 1.42857143; - color: #333; - background-color: #fff; -} -input, -button, -select, -textarea { - font-family: inherit; - font-size: inherit; - line-height: inherit; -} -a { - color: #428bca; - text-decoration: none; -} -a:hover, -a:focus { - color: #2a6496; - text-decoration: underline; -} -a:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -figure { - margin: 0; -} -img { - vertical-align: middle; -} -.img-responsive, -.thumbnail > img, -.thumbnail a > img, -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - display: block; - width: 100% \9; - max-width: 100%; - height: auto; -} -.img-rounded { - border-radius: 6px; -} -.img-thumbnail { - display: inline-block; - width: 100% \9; - max-width: 100%; - height: auto; - padding: 4px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.img-circle { - border-radius: 50%; -} -hr { - margin-top: 20px; - margin-bottom: 20px; - border: 0; - border-top: 1px solid #eee; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} -h1, -h2, -h3, -h4, -h5, -h6, -.h1, -.h2, -.h3, -.h4, -.h5, -.h6 { - font-family: inherit; - font-weight: 500; - line-height: 1.1; - color: inherit; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small, -.h1 small, -.h2 small, -.h3 small, -.h4 small, -.h5 small, -.h6 small, -h1 .small, -h2 .small, -h3 .small, -h4 .small, -h5 .small, -h6 .small, -.h1 .small, -.h2 .small, -.h3 .small, -.h4 .small, -.h5 .small, -.h6 .small { - font-weight: normal; - line-height: 1; - color: #777; -} -h1, -.h1, -h2, -.h2, -h3, -.h3 { - margin-top: 20px; - margin-bottom: 10px; -} -h1 small, -.h1 small, -h2 small, -.h2 small, -h3 small, -.h3 small, -h1 .small, -.h1 .small, -h2 .small, -.h2 .small, -h3 .small, -.h3 .small { - font-size: 65%; -} -h4, -.h4, -h5, -.h5, -h6, -.h6 { - margin-top: 10px; - margin-bottom: 10px; -} -h4 small, -.h4 small, -h5 small, -.h5 small, -h6 small, -.h6 small, -h4 .small, -.h4 .small, -h5 .small, -.h5 .small, -h6 .small, -.h6 .small { - font-size: 75%; -} -h1, -.h1 { - font-size: 36px; -} -h2, -.h2 { - font-size: 30px; -} -h3, -.h3 { - font-size: 24px; -} -h4, -.h4 { - font-size: 18px; -} -h5, -.h5 { - font-size: 14px; -} -h6, -.h6 { - font-size: 12px; -} -p { - margin: 0 0 10px; -} -.lead { - margin-bottom: 20px; - font-size: 16px; - font-weight: 300; - line-height: 1.4; -} -@media (min-width: 768px) { - .lead { - font-size: 21px; - } -} -small, -.small { - font-size: 85%; -} -cite { - font-style: normal; -} -mark, -.mark { - padding: .2em; - background-color: #fcf8e3; -} -.text-left { - text-align: left; -} -.text-right { - text-align: right; -} -.text-center { - text-align: center; -} -.text-justify { - text-align: justify; -} -.text-nowrap { - white-space: nowrap; -} -.text-lowercase { - text-transform: lowercase; -} -.text-uppercase { - text-transform: uppercase; -} -.text-capitalize { - text-transform: capitalize; -} -.text-muted { - color: #777; -} -.text-primary { - color: #428bca; -} -a.text-primary:hover { - color: #3071a9; -} -.text-success { - color: #3c763d; -} -a.text-success:hover { - color: #2b542c; -} -.text-info { - color: #31708f; -} -a.text-info:hover { - color: #245269; -} -.text-warning { - color: #8a6d3b; -} -a.text-warning:hover { - color: #66512c; -} -.text-danger { - color: #a94442; -} -a.text-danger:hover { - color: #843534; -} -.bg-primary { - color: #fff; - background-color: #428bca; -} -a.bg-primary:hover { - background-color: #3071a9; -} -.bg-success { - background-color: #dff0d8; -} -a.bg-success:hover { - background-color: #c1e2b3; -} -.bg-info { - background-color: #d9edf7; -} -a.bg-info:hover { - background-color: #afd9ee; -} -.bg-warning { - background-color: #fcf8e3; -} -a.bg-warning:hover { - background-color: #f7ecb5; -} -.bg-danger { - background-color: #f2dede; -} -a.bg-danger:hover { - background-color: #e4b9b9; -} -.page-header { - padding-bottom: 9px; - margin: 40px 0 20px; - border-bottom: 1px solid #eee; -} -ul, -ol { - margin-top: 0; - margin-bottom: 10px; -} -ul ul, -ol ul, -ul ol, -ol ol { - margin-bottom: 0; -} -.list-unstyled { - padding-left: 0; - list-style: none; -} -.list-inline { - padding-left: 0; - margin-left: -5px; - list-style: none; -} -.list-inline > li { - display: inline-block; - padding-right: 5px; - padding-left: 5px; -} -dl { - margin-top: 0; - margin-bottom: 20px; -} -dt, -dd { - line-height: 1.42857143; -} -dt { - font-weight: bold; -} -dd { - margin-left: 0; -} -@media (min-width: 768px) { - .dl-horizontal dt { - float: left; - width: 160px; - overflow: hidden; - clear: left; - text-align: right; - text-overflow: ellipsis; - white-space: nowrap; - } - .dl-horizontal dd { - margin-left: 180px; - } -} -abbr[title], -abbr[data-original-title] { - cursor: help; - border-bottom: 1px dotted #777; -} -.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 10px 20px; - margin: 0 0 20px; - font-size: 17.5px; - border-left: 5px solid #eee; -} -blockquote p:last-child, -blockquote ul:last-child, -blockquote ol:last-child { - margin-bottom: 0; -} -blockquote footer, -blockquote small, -blockquote .small { - display: block; - font-size: 80%; - line-height: 1.42857143; - color: #777; -} -blockquote footer:before, -blockquote small:before, -blockquote .small:before { - content: '\2014 \00A0'; -} -.blockquote-reverse, -blockquote.pull-right { - padding-right: 15px; - padding-left: 0; - text-align: right; - border-right: 5px solid #eee; - border-left: 0; -} -.blockquote-reverse footer:before, -blockquote.pull-right footer:before, -.blockquote-reverse small:before, -blockquote.pull-right small:before, -.blockquote-reverse .small:before, -blockquote.pull-right .small:before { - content: ''; -} -.blockquote-reverse footer:after, -blockquote.pull-right footer:after, -.blockquote-reverse small:after, -blockquote.pull-right small:after, -.blockquote-reverse .small:after, -blockquote.pull-right .small:after { - content: '\00A0 \2014'; -} -blockquote:before, -blockquote:after { - content: ""; -} -address { - margin-bottom: 20px; - font-style: normal; - line-height: 1.42857143; -} -code, -kbd, -pre, -samp { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; -} -code { - padding: 2px 4px; - font-size: 90%; - color: #c7254e; - background-color: #f9f2f4; - border-radius: 4px; -} -kbd { - padding: 2px 4px; - font-size: 90%; - color: #fff; - background-color: #333; - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); -} -kbd kbd { - padding: 0; - font-size: 100%; - -webkit-box-shadow: none; - box-shadow: none; -} -pre { - display: block; - padding: 9.5px; - margin: 0 0 10px; - font-size: 13px; - line-height: 1.42857143; - color: #333; - word-break: break-all; - word-wrap: break-word; - background-color: #f5f5f5; - border: 1px solid #ccc; - border-radius: 4px; -} -pre code { - padding: 0; - font-size: inherit; - color: inherit; - white-space: pre-wrap; - background-color: transparent; - border-radius: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -.container { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -@media (min-width: 768px) { - .container { - width: 750px; - } -} -@media (min-width: 992px) { - .container { - width: 970px; - } -} -@media (min-width: 1200px) { - .container { - width: 1170px; - } -} -.container-fluid { - padding-right: 15px; - padding-left: 15px; - margin-right: auto; - margin-left: auto; -} -.row { - margin-right: -15px; - margin-left: -15px; -} -.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { - position: relative; - min-height: 1px; - padding-right: 15px; - padding-left: 15px; -} -.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { - float: left; -} -.col-xs-12 { - width: 100%; -} -.col-xs-11 { - width: 91.66666667%; -} -.col-xs-10 { - width: 83.33333333%; -} -.col-xs-9 { - width: 75%; -} -.col-xs-8 { - width: 66.66666667%; -} -.col-xs-7 { - width: 58.33333333%; -} -.col-xs-6 { - width: 50%; -} -.col-xs-5 { - width: 41.66666667%; -} -.col-xs-4 { - width: 33.33333333%; -} -.col-xs-3 { - width: 25%; -} -.col-xs-2 { - width: 16.66666667%; -} -.col-xs-1 { - width: 8.33333333%; -} -.col-xs-pull-12 { - right: 100%; -} -.col-xs-pull-11 { - right: 91.66666667%; -} -.col-xs-pull-10 { - right: 83.33333333%; -} -.col-xs-pull-9 { - right: 75%; -} -.col-xs-pull-8 { - right: 66.66666667%; -} -.col-xs-pull-7 { - right: 58.33333333%; -} -.col-xs-pull-6 { - right: 50%; -} -.col-xs-pull-5 { - right: 41.66666667%; -} -.col-xs-pull-4 { - right: 33.33333333%; -} -.col-xs-pull-3 { - right: 25%; -} -.col-xs-pull-2 { - right: 16.66666667%; -} -.col-xs-pull-1 { - right: 8.33333333%; -} -.col-xs-pull-0 { - right: auto; -} -.col-xs-push-12 { - left: 100%; -} -.col-xs-push-11 { - left: 91.66666667%; -} -.col-xs-push-10 { - left: 83.33333333%; -} -.col-xs-push-9 { - left: 75%; -} -.col-xs-push-8 { - left: 66.66666667%; -} -.col-xs-push-7 { - left: 58.33333333%; -} -.col-xs-push-6 { - left: 50%; -} -.col-xs-push-5 { - left: 41.66666667%; -} -.col-xs-push-4 { - left: 33.33333333%; -} -.col-xs-push-3 { - left: 25%; -} -.col-xs-push-2 { - left: 16.66666667%; -} -.col-xs-push-1 { - left: 8.33333333%; -} -.col-xs-push-0 { - left: auto; -} -.col-xs-offset-12 { - margin-left: 100%; -} -.col-xs-offset-11 { - margin-left: 91.66666667%; -} -.col-xs-offset-10 { - margin-left: 83.33333333%; -} -.col-xs-offset-9 { - margin-left: 75%; -} -.col-xs-offset-8 { - margin-left: 66.66666667%; -} -.col-xs-offset-7 { - margin-left: 58.33333333%; -} -.col-xs-offset-6 { - margin-left: 50%; -} -.col-xs-offset-5 { - margin-left: 41.66666667%; -} -.col-xs-offset-4 { - margin-left: 33.33333333%; -} -.col-xs-offset-3 { - margin-left: 25%; -} -.col-xs-offset-2 { - margin-left: 16.66666667%; -} -.col-xs-offset-1 { - margin-left: 8.33333333%; -} -.col-xs-offset-0 { - margin-left: 0; -} -@media (min-width: 768px) { - .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { - float: left; - } - .col-sm-12 { - width: 100%; - } - .col-sm-11 { - width: 91.66666667%; - } - .col-sm-10 { - width: 83.33333333%; - } - .col-sm-9 { - width: 75%; - } - .col-sm-8 { - width: 66.66666667%; - } - .col-sm-7 { - width: 58.33333333%; - } - .col-sm-6 { - width: 50%; - } - .col-sm-5 { - width: 41.66666667%; - } - .col-sm-4 { - width: 33.33333333%; - } - .col-sm-3 { - width: 25%; - } - .col-sm-2 { - width: 16.66666667%; - } - .col-sm-1 { - width: 8.33333333%; - } - .col-sm-pull-12 { - right: 100%; - } - .col-sm-pull-11 { - right: 91.66666667%; - } - .col-sm-pull-10 { - right: 83.33333333%; - } - .col-sm-pull-9 { - right: 75%; - } - .col-sm-pull-8 { - right: 66.66666667%; - } - .col-sm-pull-7 { - right: 58.33333333%; - } - .col-sm-pull-6 { - right: 50%; - } - .col-sm-pull-5 { - right: 41.66666667%; - } - .col-sm-pull-4 { - right: 33.33333333%; - } - .col-sm-pull-3 { - right: 25%; - } - .col-sm-pull-2 { - right: 16.66666667%; - } - .col-sm-pull-1 { - right: 8.33333333%; - } - .col-sm-pull-0 { - right: auto; - } - .col-sm-push-12 { - left: 100%; - } - .col-sm-push-11 { - left: 91.66666667%; - } - .col-sm-push-10 { - left: 83.33333333%; - } - .col-sm-push-9 { - left: 75%; - } - .col-sm-push-8 { - left: 66.66666667%; - } - .col-sm-push-7 { - left: 58.33333333%; - } - .col-sm-push-6 { - left: 50%; - } - .col-sm-push-5 { - left: 41.66666667%; - } - .col-sm-push-4 { - left: 33.33333333%; - } - .col-sm-push-3 { - left: 25%; - } - .col-sm-push-2 { - left: 16.66666667%; - } - .col-sm-push-1 { - left: 8.33333333%; - } - .col-sm-push-0 { - left: auto; - } - .col-sm-offset-12 { - margin-left: 100%; - } - .col-sm-offset-11 { - margin-left: 91.66666667%; - } - .col-sm-offset-10 { - margin-left: 83.33333333%; - } - .col-sm-offset-9 { - margin-left: 75%; - } - .col-sm-offset-8 { - margin-left: 66.66666667%; - } - .col-sm-offset-7 { - margin-left: 58.33333333%; - } - .col-sm-offset-6 { - margin-left: 50%; - } - .col-sm-offset-5 { - margin-left: 41.66666667%; - } - .col-sm-offset-4 { - margin-left: 33.33333333%; - } - .col-sm-offset-3 { - margin-left: 25%; - } - .col-sm-offset-2 { - margin-left: 16.66666667%; - } - .col-sm-offset-1 { - margin-left: 8.33333333%; - } - .col-sm-offset-0 { - margin-left: 0; - } -} -@media (min-width: 992px) { - .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { - float: left; - } - .col-md-12 { - width: 100%; - } - .col-md-11 { - width: 91.66666667%; - } - .col-md-10 { - width: 83.33333333%; - } - .col-md-9 { - width: 75%; - } - .col-md-8 { - width: 66.66666667%; - } - .col-md-7 { - width: 58.33333333%; - } - .col-md-6 { - width: 50%; - } - .col-md-5 { - width: 41.66666667%; - } - .col-md-4 { - width: 33.33333333%; - } - .col-md-3 { - width: 25%; - } - .col-md-2 { - width: 16.66666667%; - } - .col-md-1 { - width: 8.33333333%; - } - .col-md-pull-12 { - right: 100%; - } - .col-md-pull-11 { - right: 91.66666667%; - } - .col-md-pull-10 { - right: 83.33333333%; - } - .col-md-pull-9 { - right: 75%; - } - .col-md-pull-8 { - right: 66.66666667%; - } - .col-md-pull-7 { - right: 58.33333333%; - } - .col-md-pull-6 { - right: 50%; - } - .col-md-pull-5 { - right: 41.66666667%; - } - .col-md-pull-4 { - right: 33.33333333%; - } - .col-md-pull-3 { - right: 25%; - } - .col-md-pull-2 { - right: 16.66666667%; - } - .col-md-pull-1 { - right: 8.33333333%; - } - .col-md-pull-0 { - right: auto; - } - .col-md-push-12 { - left: 100%; - } - .col-md-push-11 { - left: 91.66666667%; - } - .col-md-push-10 { - left: 83.33333333%; - } - .col-md-push-9 { - left: 75%; - } - .col-md-push-8 { - left: 66.66666667%; - } - .col-md-push-7 { - left: 58.33333333%; - } - .col-md-push-6 { - left: 50%; - } - .col-md-push-5 { - left: 41.66666667%; - } - .col-md-push-4 { - left: 33.33333333%; - } - .col-md-push-3 { - left: 25%; - } - .col-md-push-2 { - left: 16.66666667%; - } - .col-md-push-1 { - left: 8.33333333%; - } - .col-md-push-0 { - left: auto; - } - .col-md-offset-12 { - margin-left: 100%; - } - .col-md-offset-11 { - margin-left: 91.66666667%; - } - .col-md-offset-10 { - margin-left: 83.33333333%; - } - .col-md-offset-9 { - margin-left: 75%; - } - .col-md-offset-8 { - margin-left: 66.66666667%; - } - .col-md-offset-7 { - margin-left: 58.33333333%; - } - .col-md-offset-6 { - margin-left: 50%; - } - .col-md-offset-5 { - margin-left: 41.66666667%; - } - .col-md-offset-4 { - margin-left: 33.33333333%; - } - .col-md-offset-3 { - margin-left: 25%; - } - .col-md-offset-2 { - margin-left: 16.66666667%; - } - .col-md-offset-1 { - margin-left: 8.33333333%; - } - .col-md-offset-0 { - margin-left: 0; - } -} -@media (min-width: 1200px) { - .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { - float: left; - } - .col-lg-12 { - width: 100%; - } - .col-lg-11 { - width: 91.66666667%; - } - .col-lg-10 { - width: 83.33333333%; - } - .col-lg-9 { - width: 75%; - } - .col-lg-8 { - width: 66.66666667%; - } - .col-lg-7 { - width: 58.33333333%; - } - .col-lg-6 { - width: 50%; - } - .col-lg-5 { - width: 41.66666667%; - } - .col-lg-4 { - width: 33.33333333%; - } - .col-lg-3 { - width: 25%; - } - .col-lg-2 { - width: 16.66666667%; - } - .col-lg-1 { - width: 8.33333333%; - } - .col-lg-pull-12 { - right: 100%; - } - .col-lg-pull-11 { - right: 91.66666667%; - } - .col-lg-pull-10 { - right: 83.33333333%; - } - .col-lg-pull-9 { - right: 75%; - } - .col-lg-pull-8 { - right: 66.66666667%; - } - .col-lg-pull-7 { - right: 58.33333333%; - } - .col-lg-pull-6 { - right: 50%; - } - .col-lg-pull-5 { - right: 41.66666667%; - } - .col-lg-pull-4 { - right: 33.33333333%; - } - .col-lg-pull-3 { - right: 25%; - } - .col-lg-pull-2 { - right: 16.66666667%; - } - .col-lg-pull-1 { - right: 8.33333333%; - } - .col-lg-pull-0 { - right: auto; - } - .col-lg-push-12 { - left: 100%; - } - .col-lg-push-11 { - left: 91.66666667%; - } - .col-lg-push-10 { - left: 83.33333333%; - } - .col-lg-push-9 { - left: 75%; - } - .col-lg-push-8 { - left: 66.66666667%; - } - .col-lg-push-7 { - left: 58.33333333%; - } - .col-lg-push-6 { - left: 50%; - } - .col-lg-push-5 { - left: 41.66666667%; - } - .col-lg-push-4 { - left: 33.33333333%; - } - .col-lg-push-3 { - left: 25%; - } - .col-lg-push-2 { - left: 16.66666667%; - } - .col-lg-push-1 { - left: 8.33333333%; - } - .col-lg-push-0 { - left: auto; - } - .col-lg-offset-12 { - margin-left: 100%; - } - .col-lg-offset-11 { - margin-left: 91.66666667%; - } - .col-lg-offset-10 { - margin-left: 83.33333333%; - } - .col-lg-offset-9 { - margin-left: 75%; - } - .col-lg-offset-8 { - margin-left: 66.66666667%; - } - .col-lg-offset-7 { - margin-left: 58.33333333%; - } - .col-lg-offset-6 { - margin-left: 50%; - } - .col-lg-offset-5 { - margin-left: 41.66666667%; - } - .col-lg-offset-4 { - margin-left: 33.33333333%; - } - .col-lg-offset-3 { - margin-left: 25%; - } - .col-lg-offset-2 { - margin-left: 16.66666667%; - } - .col-lg-offset-1 { - margin-left: 8.33333333%; - } - .col-lg-offset-0 { - margin-left: 0; - } -} -table { - background-color: transparent; -} -th { - text-align: left; -} -.table { - width: 100%; - max-width: 100%; - margin-bottom: 20px; -} -.table > thead > tr > th, -.table > tbody > tr > th, -.table > tfoot > tr > th, -.table > thead > tr > td, -.table > tbody > tr > td, -.table > tfoot > tr > td { - padding: 8px; - line-height: 1.42857143; - vertical-align: top; - border-top: 1px solid #ddd; -} -.table > thead > tr > th { - vertical-align: bottom; - border-bottom: 2px solid #ddd; -} -.table > caption + thead > tr:first-child > th, -.table > colgroup + thead > tr:first-child > th, -.table > thead:first-child > tr:first-child > th, -.table > caption + thead > tr:first-child > td, -.table > colgroup + thead > tr:first-child > td, -.table > thead:first-child > tr:first-child > td { - border-top: 0; -} -.table > tbody + tbody { - border-top: 2px solid #ddd; -} -.table .table { - background-color: #fff; -} -.table-condensed > thead > tr > th, -.table-condensed > tbody > tr > th, -.table-condensed > tfoot > tr > th, -.table-condensed > thead > tr > td, -.table-condensed > tbody > tr > td, -.table-condensed > tfoot > tr > td { - padding: 5px; -} -.table-bordered { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > tbody > tr > th, -.table-bordered > tfoot > tr > th, -.table-bordered > thead > tr > td, -.table-bordered > tbody > tr > td, -.table-bordered > tfoot > tr > td { - border: 1px solid #ddd; -} -.table-bordered > thead > tr > th, -.table-bordered > thead > tr > td { - border-bottom-width: 2px; -} -.table-striped > tbody > tr:nth-child(odd) > td, -.table-striped > tbody > tr:nth-child(odd) > th { - background-color: #f9f9f9; -} -.table-hover > tbody > tr:hover > td, -.table-hover > tbody > tr:hover > th { - background-color: #f5f5f5; -} -table col[class*="col-"] { - position: static; - display: table-column; - float: none; -} -table td[class*="col-"], -table th[class*="col-"] { - position: static; - display: table-cell; - float: none; -} -.table > thead > tr > td.active, -.table > tbody > tr > td.active, -.table > tfoot > tr > td.active, -.table > thead > tr > th.active, -.table > tbody > tr > th.active, -.table > tfoot > tr > th.active, -.table > thead > tr.active > td, -.table > tbody > tr.active > td, -.table > tfoot > tr.active > td, -.table > thead > tr.active > th, -.table > tbody > tr.active > th, -.table > tfoot > tr.active > th { - background-color: #f5f5f5; -} -.table-hover > tbody > tr > td.active:hover, -.table-hover > tbody > tr > th.active:hover, -.table-hover > tbody > tr.active:hover > td, -.table-hover > tbody > tr:hover > .active, -.table-hover > tbody > tr.active:hover > th { - background-color: #e8e8e8; -} -.table > thead > tr > td.success, -.table > tbody > tr > td.success, -.table > tfoot > tr > td.success, -.table > thead > tr > th.success, -.table > tbody > tr > th.success, -.table > tfoot > tr > th.success, -.table > thead > tr.success > td, -.table > tbody > tr.success > td, -.table > tfoot > tr.success > td, -.table > thead > tr.success > th, -.table > tbody > tr.success > th, -.table > tfoot > tr.success > th { - background-color: #dff0d8; -} -.table-hover > tbody > tr > td.success:hover, -.table-hover > tbody > tr > th.success:hover, -.table-hover > tbody > tr.success:hover > td, -.table-hover > tbody > tr:hover > .success, -.table-hover > tbody > tr.success:hover > th { - background-color: #d0e9c6; -} -.table > thead > tr > td.info, -.table > tbody > tr > td.info, -.table > tfoot > tr > td.info, -.table > thead > tr > th.info, -.table > tbody > tr > th.info, -.table > tfoot > tr > th.info, -.table > thead > tr.info > td, -.table > tbody > tr.info > td, -.table > tfoot > tr.info > td, -.table > thead > tr.info > th, -.table > tbody > tr.info > th, -.table > tfoot > tr.info > th { - background-color: #d9edf7; -} -.table-hover > tbody > tr > td.info:hover, -.table-hover > tbody > tr > th.info:hover, -.table-hover > tbody > tr.info:hover > td, -.table-hover > tbody > tr:hover > .info, -.table-hover > tbody > tr.info:hover > th { - background-color: #c4e3f3; -} -.table > thead > tr > td.warning, -.table > tbody > tr > td.warning, -.table > tfoot > tr > td.warning, -.table > thead > tr > th.warning, -.table > tbody > tr > th.warning, -.table > tfoot > tr > th.warning, -.table > thead > tr.warning > td, -.table > tbody > tr.warning > td, -.table > tfoot > tr.warning > td, -.table > thead > tr.warning > th, -.table > tbody > tr.warning > th, -.table > tfoot > tr.warning > th { - background-color: #fcf8e3; -} -.table-hover > tbody > tr > td.warning:hover, -.table-hover > tbody > tr > th.warning:hover, -.table-hover > tbody > tr.warning:hover > td, -.table-hover > tbody > tr:hover > .warning, -.table-hover > tbody > tr.warning:hover > th { - background-color: #faf2cc; -} -.table > thead > tr > td.danger, -.table > tbody > tr > td.danger, -.table > tfoot > tr > td.danger, -.table > thead > tr > th.danger, -.table > tbody > tr > th.danger, -.table > tfoot > tr > th.danger, -.table > thead > tr.danger > td, -.table > tbody > tr.danger > td, -.table > tfoot > tr.danger > td, -.table > thead > tr.danger > th, -.table > tbody > tr.danger > th, -.table > tfoot > tr.danger > th { - background-color: #f2dede; -} -.table-hover > tbody > tr > td.danger:hover, -.table-hover > tbody > tr > th.danger:hover, -.table-hover > tbody > tr.danger:hover > td, -.table-hover > tbody > tr:hover > .danger, -.table-hover > tbody > tr.danger:hover > th { - background-color: #ebcccc; -} -@media screen and (max-width: 767px) { - .table-responsive { - width: 100%; - margin-bottom: 15px; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - -ms-overflow-style: -ms-autohiding-scrollbar; - border: 1px solid #ddd; - } - .table-responsive > .table { - margin-bottom: 0; - } - .table-responsive > .table > thead > tr > th, - .table-responsive > .table > tbody > tr > th, - .table-responsive > .table > tfoot > tr > th, - .table-responsive > .table > thead > tr > td, - .table-responsive > .table > tbody > tr > td, - .table-responsive > .table > tfoot > tr > td { - white-space: nowrap; - } - .table-responsive > .table-bordered { - border: 0; - } - .table-responsive > .table-bordered > thead > tr > th:first-child, - .table-responsive > .table-bordered > tbody > tr > th:first-child, - .table-responsive > .table-bordered > tfoot > tr > th:first-child, - .table-responsive > .table-bordered > thead > tr > td:first-child, - .table-responsive > .table-bordered > tbody > tr > td:first-child, - .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; - } - .table-responsive > .table-bordered > thead > tr > th:last-child, - .table-responsive > .table-bordered > tbody > tr > th:last-child, - .table-responsive > .table-bordered > tfoot > tr > th:last-child, - .table-responsive > .table-bordered > thead > tr > td:last-child, - .table-responsive > .table-bordered > tbody > tr > td:last-child, - .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; - } - .table-responsive > .table-bordered > tbody > tr:last-child > th, - .table-responsive > .table-bordered > tfoot > tr:last-child > th, - .table-responsive > .table-bordered > tbody > tr:last-child > td, - .table-responsive > .table-bordered > tfoot > tr:last-child > td { - border-bottom: 0; - } -} -fieldset { - min-width: 0; - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 20px; - font-size: 21px; - line-height: inherit; - color: #333; - border: 0; - border-bottom: 1px solid #e5e5e5; -} -label { - display: inline-block; - max-width: 100%; - margin-bottom: 5px; - font-weight: bold; -} -input[type="search"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} -input[type="radio"], -input[type="checkbox"] { - margin: 4px 0 0; - margin-top: 1px \9; - line-height: normal; -} -input[type="file"] { - display: block; -} -input[type="range"] { - display: block; - width: 100%; -} -select[multiple], -select[size] { - height: auto; -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -output { - display: block; - padding-top: 7px; - font-size: 14px; - line-height: 1.42857143; - color: #555; -} -.form-control { - display: block; - width: 100%; - height: 34px; - padding: 6px 12px; - font-size: 14px; - line-height: 1.42857143; - color: #555; - background-color: #fff; - background-image: none; - border: 1px solid #ccc; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; - -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; -} -.form-control:focus { - border-color: #66afe9; - outline: 0; - -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); - box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); -} -.form-control::-moz-placeholder { - color: #777; - opacity: 1; -} -.form-control:-ms-input-placeholder { - color: #777; -} -.form-control::-webkit-input-placeholder { - color: #777; -} -.form-control[disabled], -.form-control[readonly], -fieldset[disabled] .form-control { - cursor: not-allowed; - background-color: #eee; - opacity: 1; -} -textarea.form-control { - height: auto; -} -input[type="search"] { - -webkit-appearance: none; -} -input[type="date"], -input[type="time"], -input[type="datetime-local"], -input[type="month"] { - line-height: 34px; - line-height: 1.42857143 \0; -} -input[type="date"].input-sm, -input[type="time"].input-sm, -input[type="datetime-local"].input-sm, -input[type="month"].input-sm { - line-height: 30px; -} -input[type="date"].input-lg, -input[type="time"].input-lg, -input[type="datetime-local"].input-lg, -input[type="month"].input-lg { - line-height: 46px; -} -.form-group { - margin-bottom: 15px; -} -.radio, -.checkbox { - position: relative; - display: block; - min-height: 20px; - margin-top: 10px; - margin-bottom: 10px; -} -.radio label, -.checkbox label { - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - cursor: pointer; -} -.radio input[type="radio"], -.radio-inline input[type="radio"], -.checkbox input[type="checkbox"], -.checkbox-inline input[type="checkbox"] { - position: absolute; - margin-top: 4px \9; - margin-left: -20px; -} -.radio + .radio, -.checkbox + .checkbox { - margin-top: -5px; -} -.radio-inline, -.checkbox-inline { - display: inline-block; - padding-left: 20px; - margin-bottom: 0; - font-weight: normal; - vertical-align: middle; - cursor: pointer; -} -.radio-inline + .radio-inline, -.checkbox-inline + .checkbox-inline { - margin-top: 0; - margin-left: 10px; -} -input[type="radio"][disabled], -input[type="checkbox"][disabled], -input[type="radio"].disabled, -input[type="checkbox"].disabled, -fieldset[disabled] input[type="radio"], -fieldset[disabled] input[type="checkbox"] { - cursor: not-allowed; -} -.radio-inline.disabled, -.checkbox-inline.disabled, -fieldset[disabled] .radio-inline, -fieldset[disabled] .checkbox-inline { - cursor: not-allowed; -} -.radio.disabled label, -.checkbox.disabled label, -fieldset[disabled] .radio label, -fieldset[disabled] .checkbox label { - cursor: not-allowed; -} -.form-control-static { - padding-top: 7px; - padding-bottom: 7px; - margin-bottom: 0; -} -.form-control-static.input-lg, -.form-control-static.input-sm { - padding-right: 0; - padding-left: 0; -} -.input-sm, -.form-horizontal .form-group-sm .form-control { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-sm { - height: 30px; - line-height: 30px; -} -textarea.input-sm, -select[multiple].input-sm { - height: auto; -} -.input-lg, -.form-horizontal .form-group-lg .form-control { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-lg { - height: 46px; - line-height: 46px; -} -textarea.input-lg, -select[multiple].input-lg { - height: auto; -} -.has-feedback { - position: relative; -} -.has-feedback .form-control { - padding-right: 42.5px; -} -.form-control-feedback { - position: absolute; - top: 25px; - right: 0; - z-index: 2; - display: block; - width: 34px; - height: 34px; - line-height: 34px; - text-align: center; -} -.input-lg + .form-control-feedback { - width: 46px; - height: 46px; - line-height: 46px; -} -.input-sm + .form-control-feedback { - width: 30px; - height: 30px; - line-height: 30px; -} -.has-success .help-block, -.has-success .control-label, -.has-success .radio, -.has-success .checkbox, -.has-success .radio-inline, -.has-success .checkbox-inline { - color: #3c763d; -} -.has-success .form-control { - border-color: #3c763d; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-success .form-control:focus { - border-color: #2b542c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; -} -.has-success .input-group-addon { - color: #3c763d; - background-color: #dff0d8; - border-color: #3c763d; -} -.has-success .form-control-feedback { - color: #3c763d; -} -.has-warning .help-block, -.has-warning .control-label, -.has-warning .radio, -.has-warning .checkbox, -.has-warning .radio-inline, -.has-warning .checkbox-inline { - color: #8a6d3b; -} -.has-warning .form-control { - border-color: #8a6d3b; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-warning .form-control:focus { - border-color: #66512c; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; -} -.has-warning .input-group-addon { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #8a6d3b; -} -.has-warning .form-control-feedback { - color: #8a6d3b; -} -.has-error .help-block, -.has-error .control-label, -.has-error .radio, -.has-error .checkbox, -.has-error .radio-inline, -.has-error .checkbox-inline { - color: #a94442; -} -.has-error .form-control { - border-color: #a94442; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); -} -.has-error .form-control:focus { - border-color: #843534; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; -} -.has-error .input-group-addon { - color: #a94442; - background-color: #f2dede; - border-color: #a94442; -} -.has-error .form-control-feedback { - color: #a94442; -} -.has-feedback label.sr-only ~ .form-control-feedback { - top: 0; -} -.help-block { - display: block; - margin-top: 5px; - margin-bottom: 10px; - color: #737373; -} -@media (min-width: 768px) { - .form-inline .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .form-inline .input-group { - display: inline-table; - vertical-align: middle; - } - .form-inline .input-group .input-group-addon, - .form-inline .input-group .input-group-btn, - .form-inline .input-group .form-control { - width: auto; - } - .form-inline .input-group > .form-control { - width: 100%; - } - .form-inline .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio, - .form-inline .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .form-inline .radio label, - .form-inline .checkbox label { - padding-left: 0; - } - .form-inline .radio input[type="radio"], - .form-inline .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .form-inline .has-feedback .form-control-feedback { - top: 0; - } -} -.form-horizontal .radio, -.form-horizontal .checkbox, -.form-horizontal .radio-inline, -.form-horizontal .checkbox-inline { - padding-top: 7px; - margin-top: 0; - margin-bottom: 0; -} -.form-horizontal .radio, -.form-horizontal .checkbox { - min-height: 27px; -} -.form-horizontal .form-group { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .form-horizontal .control-label { - padding-top: 7px; - margin-bottom: 0; - text-align: right; - } -} -.form-horizontal .has-feedback .form-control-feedback { - top: 0; - right: 15px; -} -@media (min-width: 768px) { - .form-horizontal .form-group-lg .control-label { - padding-top: 14.3px; - } -} -@media (min-width: 768px) { - .form-horizontal .form-group-sm .control-label { - padding-top: 6px; - } -} -.btn { - display: inline-block; - padding: 6px 12px; - margin-bottom: 0; - font-size: 14px; - font-weight: normal; - line-height: 1.42857143; - text-align: center; - white-space: nowrap; - vertical-align: middle; - cursor: pointer; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.btn:focus, -.btn:active:focus, -.btn.active:focus { - outline: thin dotted; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn:hover, -.btn:focus { - color: #333; - text-decoration: none; -} -.btn:active, -.btn.active { - background-image: none; - outline: 0; - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn.disabled, -.btn[disabled], -fieldset[disabled] .btn { - pointer-events: none; - cursor: not-allowed; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - box-shadow: none; - opacity: .65; -} -.btn-default { - color: #333; - background-color: #fff; - border-color: #ccc; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - color: #333; - background-color: #e6e6e6; - border-color: #adadad; -} -.btn-default:active, -.btn-default.active, -.open > .dropdown-toggle.btn-default { - background-image: none; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #fff; - border-color: #ccc; -} -.btn-default .badge { - color: #fff; - background-color: #333; -} -.btn-primary { - color: #fff; - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3071a9; - border-color: #285e8e; -} -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - background-image: none; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #428bca; - border-color: #357ebd; -} -.btn-primary .badge { - color: #428bca; - background-color: #fff; -} -.btn-success { - color: #fff; - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - color: #fff; - background-color: #449d44; - border-color: #398439; -} -.btn-success:active, -.btn-success.active, -.open > .dropdown-toggle.btn-success { - background-image: none; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #5cb85c; - border-color: #4cae4c; -} -.btn-success .badge { - color: #5cb85c; - background-color: #fff; -} -.btn-info { - color: #fff; - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - color: #fff; - background-color: #31b0d5; - border-color: #269abc; -} -.btn-info:active, -.btn-info.active, -.open > .dropdown-toggle.btn-info { - background-image: none; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #5bc0de; - border-color: #46b8da; -} -.btn-info .badge { - color: #5bc0de; - background-color: #fff; -} -.btn-warning { - color: #fff; - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - color: #fff; - background-color: #ec971f; - border-color: #d58512; -} -.btn-warning:active, -.btn-warning.active, -.open > .dropdown-toggle.btn-warning { - background-image: none; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f0ad4e; - border-color: #eea236; -} -.btn-warning .badge { - color: #f0ad4e; - background-color: #fff; -} -.btn-danger { - color: #fff; - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - color: #fff; - background-color: #c9302c; - border-color: #ac2925; -} -.btn-danger:active, -.btn-danger.active, -.open > .dropdown-toggle.btn-danger { - background-image: none; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #d9534f; - border-color: #d43f3a; -} -.btn-danger .badge { - color: #d9534f; - background-color: #fff; -} -.btn-link { - font-weight: normal; - color: #428bca; - cursor: pointer; - border-radius: 0; -} -.btn-link, -.btn-link:active, -.btn-link[disabled], -fieldset[disabled] .btn-link { - background-color: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} -.btn-link, -.btn-link:hover, -.btn-link:focus, -.btn-link:active { - border-color: transparent; -} -.btn-link:hover, -.btn-link:focus { - color: #2a6496; - text-decoration: underline; - background-color: transparent; -} -.btn-link[disabled]:hover, -fieldset[disabled] .btn-link:hover, -.btn-link[disabled]:focus, -fieldset[disabled] .btn-link:focus { - color: #777; - text-decoration: none; -} -.btn-lg, -.btn-group-lg > .btn { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -.btn-sm, -.btn-group-sm > .btn { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-xs, -.btn-group-xs > .btn { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -.btn-block { - display: block; - width: 100%; -} -.btn-block + .btn-block { - margin-top: 5px; -} -input[type="submit"].btn-block, -input[type="reset"].btn-block, -input[type="button"].btn-block { - width: 100%; -} -.fade { - opacity: 0; - -webkit-transition: opacity .15s linear; - -o-transition: opacity .15s linear; - transition: opacity .15s linear; -} -.fade.in { - opacity: 1; -} -.collapse { - display: none; -} -.collapse.in { - display: block; -} -tr.collapse.in { - display: table-row; -} -tbody.collapse.in { - display: table-row-group; -} -.collapsing { - position: relative; - height: 0; - overflow: hidden; - -webkit-transition: height .35s ease; - -o-transition: height .35s ease; - transition: height .35s ease; -} -.caret { - display: inline-block; - width: 0; - height: 0; - margin-left: 2px; - vertical-align: middle; - border-top: 4px solid; - border-right: 4px solid transparent; - border-left: 4px solid transparent; -} -.dropdown { - position: relative; -} -.dropdown-toggle:focus { - outline: 0; -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - display: none; - float: left; - min-width: 160px; - padding: 5px 0; - margin: 2px 0 0; - font-size: 14px; - text-align: left; - list-style: none; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .15); - border-radius: 4px; - -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); - box-shadow: 0 6px 12px rgba(0, 0, 0, .175); -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.dropdown-menu > li > a { - display: block; - padding: 3px 20px; - clear: both; - font-weight: normal; - line-height: 1.42857143; - color: #333; - white-space: nowrap; -} -.dropdown-menu > li > a:hover, -.dropdown-menu > li > a:focus { - color: #262626; - text-decoration: none; - background-color: #f5f5f5; -} -.dropdown-menu > .active > a, -.dropdown-menu > .active > a:hover, -.dropdown-menu > .active > a:focus { - color: #fff; - text-decoration: none; - background-color: #428bca; - outline: 0; -} -.dropdown-menu > .disabled > a, -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - color: #777; -} -.dropdown-menu > .disabled > a:hover, -.dropdown-menu > .disabled > a:focus { - text-decoration: none; - cursor: not-allowed; - background-color: transparent; - background-image: none; - filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -} -.open > .dropdown-menu { - display: block; -} -.open > a { - outline: 0; -} -.dropdown-menu-right { - right: 0; - left: auto; -} -.dropdown-menu-left { - right: auto; - left: 0; -} -.dropdown-header { - display: block; - padding: 3px 20px; - font-size: 12px; - line-height: 1.42857143; - color: #777; - white-space: nowrap; -} -.dropdown-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 990; -} -.pull-right > .dropdown-menu { - right: 0; - left: auto; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - content: ""; - border-top: 0; - border-bottom: 4px solid; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -@media (min-width: 768px) { - .navbar-right .dropdown-menu { - right: 0; - left: auto; - } - .navbar-right .dropdown-menu-left { - right: auto; - left: 0; - } -} -.btn-group, -.btn-group-vertical { - position: relative; - display: inline-block; - vertical-align: middle; -} -.btn-group > .btn, -.btn-group-vertical > .btn { - position: relative; - float: left; -} -.btn-group > .btn:hover, -.btn-group-vertical > .btn:hover, -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus, -.btn-group > .btn:active, -.btn-group-vertical > .btn:active, -.btn-group > .btn.active, -.btn-group-vertical > .btn.active { - z-index: 2; -} -.btn-group > .btn:focus, -.btn-group-vertical > .btn:focus { - outline: 0; -} -.btn-group .btn + .btn, -.btn-group .btn + .btn-group, -.btn-group .btn-group + .btn, -.btn-group .btn-group + .btn-group { - margin-left: -1px; -} -.btn-toolbar { - margin-left: -5px; -} -.btn-toolbar .btn-group, -.btn-toolbar .input-group { - float: left; -} -.btn-toolbar > .btn, -.btn-toolbar > .btn-group, -.btn-toolbar > .input-group { - margin-left: 5px; -} -.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { - border-radius: 0; -} -.btn-group > .btn:first-child { - margin-left: 0; -} -.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn:last-child:not(:first-child), -.btn-group > .dropdown-toggle:not(:first-child) { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group > .btn-group { - float: left; -} -.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group > .btn-group:first-child > .btn:last-child, -.btn-group > .btn-group:first-child > .dropdown-toggle { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.btn-group > .btn-group:last-child > .btn:first-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group > .btn + .dropdown-toggle { - padding-right: 8px; - padding-left: 8px; -} -.btn-group > .btn-lg + .dropdown-toggle { - padding-right: 12px; - padding-left: 12px; -} -.btn-group.open .dropdown-toggle { - -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); - box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); -} -.btn-group.open .dropdown-toggle.btn-link { - -webkit-box-shadow: none; - box-shadow: none; -} -.btn .caret { - margin-left: 0; -} -.btn-lg .caret { - border-width: 5px 5px 0; - border-bottom-width: 0; -} -.dropup .btn-lg .caret { - border-width: 0 5px 5px; -} -.btn-group-vertical > .btn, -.btn-group-vertical > .btn-group, -.btn-group-vertical > .btn-group > .btn { - display: block; - float: none; - width: 100%; - max-width: 100%; -} -.btn-group-vertical > .btn-group > .btn { - float: none; -} -.btn-group-vertical > .btn + .btn, -.btn-group-vertical > .btn + .btn-group, -.btn-group-vertical > .btn-group + .btn, -.btn-group-vertical > .btn-group + .btn-group { - margin-top: -1px; - margin-left: 0; -} -.btn-group-vertical > .btn:not(:first-child):not(:last-child) { - border-radius: 0; -} -.btn-group-vertical > .btn:first-child:not(:last-child) { - border-top-right-radius: 4px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn:last-child:not(:first-child) { - border-top-left-radius: 0; - border-top-right-radius: 0; - border-bottom-left-radius: 4px; -} -.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { - border-radius: 0; -} -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, -.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.btn-group-justified { - display: table; - width: 100%; - table-layout: fixed; - border-collapse: separate; -} -.btn-group-justified > .btn, -.btn-group-justified > .btn-group { - display: table-cell; - float: none; - width: 1%; -} -.btn-group-justified > .btn-group .btn { - width: 100%; -} -.btn-group-justified > .btn-group .dropdown-menu { - left: auto; -} -[data-toggle="buttons"] > .btn > input[type="radio"], -[data-toggle="buttons"] > .btn > input[type="checkbox"] { - position: absolute; - z-index: -1; - filter: alpha(opacity=0); - opacity: 0; -} -.input-group { - position: relative; - display: table; - border-collapse: separate; -} -.input-group[class*="col-"] { - float: none; - padding-right: 0; - padding-left: 0; -} -.input-group .form-control { - position: relative; - z-index: 2; - float: left; - width: 100%; - margin-bottom: 0; -} -.input-group-lg > .form-control, -.input-group-lg > .input-group-addon, -.input-group-lg > .input-group-btn > .btn { - height: 46px; - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; - border-radius: 6px; -} -select.input-group-lg > .form-control, -select.input-group-lg > .input-group-addon, -select.input-group-lg > .input-group-btn > .btn { - height: 46px; - line-height: 46px; -} -textarea.input-group-lg > .form-control, -textarea.input-group-lg > .input-group-addon, -textarea.input-group-lg > .input-group-btn > .btn, -select[multiple].input-group-lg > .form-control, -select[multiple].input-group-lg > .input-group-addon, -select[multiple].input-group-lg > .input-group-btn > .btn { - height: auto; -} -.input-group-sm > .form-control, -.input-group-sm > .input-group-addon, -.input-group-sm > .input-group-btn > .btn { - height: 30px; - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - border-radius: 3px; -} -select.input-group-sm > .form-control, -select.input-group-sm > .input-group-addon, -select.input-group-sm > .input-group-btn > .btn { - height: 30px; - line-height: 30px; -} -textarea.input-group-sm > .form-control, -textarea.input-group-sm > .input-group-addon, -textarea.input-group-sm > .input-group-btn > .btn, -select[multiple].input-group-sm > .form-control, -select[multiple].input-group-sm > .input-group-addon, -select[multiple].input-group-sm > .input-group-btn > .btn { - height: auto; -} -.input-group-addon, -.input-group-btn, -.input-group .form-control { - display: table-cell; -} -.input-group-addon:not(:first-child):not(:last-child), -.input-group-btn:not(:first-child):not(:last-child), -.input-group .form-control:not(:first-child):not(:last-child) { - border-radius: 0; -} -.input-group-addon, -.input-group-btn { - width: 1%; - white-space: nowrap; - vertical-align: middle; -} -.input-group-addon { - padding: 6px 12px; - font-size: 14px; - font-weight: normal; - line-height: 1; - color: #555; - text-align: center; - background-color: #eee; - border: 1px solid #ccc; - border-radius: 4px; -} -.input-group-addon.input-sm { - padding: 5px 10px; - font-size: 12px; - border-radius: 3px; -} -.input-group-addon.input-lg { - padding: 10px 16px; - font-size: 18px; - border-radius: 6px; -} -.input-group-addon input[type="radio"], -.input-group-addon input[type="checkbox"] { - margin-top: 0; -} -.input-group .form-control:first-child, -.input-group-addon:first-child, -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group > .btn, -.input-group-btn:first-child > .dropdown-toggle, -.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), -.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} -.input-group-addon:first-child { - border-right: 0; -} -.input-group .form-control:last-child, -.input-group-addon:last-child, -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group > .btn, -.input-group-btn:last-child > .dropdown-toggle, -.input-group-btn:first-child > .btn:not(:first-child), -.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} -.input-group-addon:last-child { - border-left: 0; -} -.input-group-btn { - position: relative; - font-size: 0; - white-space: nowrap; -} -.input-group-btn > .btn { - position: relative; -} -.input-group-btn > .btn + .btn { - margin-left: -1px; -} -.input-group-btn > .btn:hover, -.input-group-btn > .btn:focus, -.input-group-btn > .btn:active { - z-index: 2; -} -.input-group-btn:first-child > .btn, -.input-group-btn:first-child > .btn-group { - margin-right: -1px; -} -.input-group-btn:last-child > .btn, -.input-group-btn:last-child > .btn-group { - margin-left: -1px; -} -.nav { - padding-left: 0; - margin-bottom: 0; - list-style: none; -} -.nav > li { - position: relative; - display: block; -} -.nav > li > a { - position: relative; - display: block; - padding: 10px 15px; -} -.nav > li > a:hover, -.nav > li > a:focus { - text-decoration: none; - background-color: #eee; -} -.nav > li.disabled > a { - color: #777; -} -.nav > li.disabled > a:hover, -.nav > li.disabled > a:focus { - color: #777; - text-decoration: none; - cursor: not-allowed; - background-color: transparent; -} -.nav .open > a, -.nav .open > a:hover, -.nav .open > a:focus { - background-color: #eee; - border-color: #428bca; -} -.nav .nav-divider { - height: 1px; - margin: 9px 0; - overflow: hidden; - background-color: #e5e5e5; -} -.nav > li > a > img { - max-width: none; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - float: left; - margin-bottom: -1px; -} -.nav-tabs > li > a { - margin-right: 2px; - line-height: 1.42857143; - border: 1px solid transparent; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eee #eee #ddd; -} -.nav-tabs > li.active > a, -.nav-tabs > li.active > a:hover, -.nav-tabs > li.active > a:focus { - color: #555; - cursor: default; - background-color: #fff; - border: 1px solid #ddd; - border-bottom-color: transparent; -} -.nav-tabs.nav-justified { - width: 100%; - border-bottom: 0; -} -.nav-tabs.nav-justified > li { - float: none; -} -.nav-tabs.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-tabs.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-tabs.nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs.nav-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs.nav-justified > .active > a, -.nav-tabs.nav-justified > .active > a:hover, -.nav-tabs.nav-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs.nav-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs.nav-justified > .active > a, - .nav-tabs.nav-justified > .active > a:hover, - .nav-tabs.nav-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.nav-pills > li { - float: left; -} -.nav-pills > li > a { - border-radius: 4px; -} -.nav-pills > li + li { - margin-left: 2px; -} -.nav-pills > li.active > a, -.nav-pills > li.active > a:hover, -.nav-pills > li.active > a:focus { - color: #fff; - background-color: #428bca; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li + li { - margin-top: 2px; - margin-left: 0; -} -.nav-justified { - width: 100%; -} -.nav-justified > li { - float: none; -} -.nav-justified > li > a { - margin-bottom: 5px; - text-align: center; -} -.nav-justified > .dropdown .dropdown-menu { - top: auto; - left: auto; -} -@media (min-width: 768px) { - .nav-justified > li { - display: table-cell; - width: 1%; - } - .nav-justified > li > a { - margin-bottom: 0; - } -} -.nav-tabs-justified { - border-bottom: 0; -} -.nav-tabs-justified > li > a { - margin-right: 0; - border-radius: 4px; -} -.nav-tabs-justified > .active > a, -.nav-tabs-justified > .active > a:hover, -.nav-tabs-justified > .active > a:focus { - border: 1px solid #ddd; -} -@media (min-width: 768px) { - .nav-tabs-justified > li > a { - border-bottom: 1px solid #ddd; - border-radius: 4px 4px 0 0; - } - .nav-tabs-justified > .active > a, - .nav-tabs-justified > .active > a:hover, - .nav-tabs-justified > .active > a:focus { - border-bottom-color: #fff; - } -} -.tab-content > .tab-pane { - display: none; -} -.tab-content > .active { - display: block; -} -.nav-tabs .dropdown-menu { - margin-top: -1px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar { - position: relative; - min-height: 50px; - margin-bottom: 20px; - border: 1px solid transparent; -} -@media (min-width: 768px) { - .navbar { - border-radius: 4px; - } -} -@media (min-width: 768px) { - .navbar-header { - float: left; - } -} -.navbar-collapse { - padding-right: 15px; - padding-left: 15px; - overflow-x: visible; - -webkit-overflow-scrolling: touch; - border-top: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); -} -.navbar-collapse.in { - overflow-y: auto; -} -@media (min-width: 768px) { - .navbar-collapse { - width: auto; - border-top: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-collapse.collapse { - display: block !important; - height: auto !important; - padding-bottom: 0; - overflow: visible !important; - } - .navbar-collapse.in { - overflow-y: visible; - } - .navbar-fixed-top .navbar-collapse, - .navbar-static-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - padding-right: 0; - padding-left: 0; - } -} -.navbar-fixed-top .navbar-collapse, -.navbar-fixed-bottom .navbar-collapse { - max-height: 340px; -} -@media (max-width: 480px) and (orientation: landscape) { - .navbar-fixed-top .navbar-collapse, - .navbar-fixed-bottom .navbar-collapse { - max-height: 200px; - } -} -.container > .navbar-header, -.container-fluid > .navbar-header, -.container > .navbar-collapse, -.container-fluid > .navbar-collapse { - margin-right: -15px; - margin-left: -15px; -} -@media (min-width: 768px) { - .container > .navbar-header, - .container-fluid > .navbar-header, - .container > .navbar-collapse, - .container-fluid > .navbar-collapse { - margin-right: 0; - margin-left: 0; - } -} -.navbar-static-top { - z-index: 1000; - border-width: 0 0 1px; -} -@media (min-width: 768px) { - .navbar-static-top { - border-radius: 0; - } -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@media (min-width: 768px) { - .navbar-fixed-top, - .navbar-fixed-bottom { - border-radius: 0; - } -} -.navbar-fixed-top { - top: 0; - border-width: 0 0 1px; -} -.navbar-fixed-bottom { - bottom: 0; - margin-bottom: 0; - border-width: 1px 0 0; -} -.navbar-brand { - float: left; - height: 50px; - padding: 15px 15px; - font-size: 18px; - line-height: 20px; -} -.navbar-brand:hover, -.navbar-brand:focus { - text-decoration: none; -} -@media (min-width: 768px) { - .navbar > .container .navbar-brand, - .navbar > .container-fluid .navbar-brand { - margin-left: -15px; - } -} -.navbar-toggle { - position: relative; - float: right; - padding: 9px 10px; - margin-top: 8px; - margin-right: 15px; - margin-bottom: 8px; - background-color: transparent; - background-image: none; - border: 1px solid transparent; - border-radius: 4px; -} -.navbar-toggle:focus { - outline: 0; -} -.navbar-toggle .icon-bar { - display: block; - width: 22px; - height: 2px; - border-radius: 1px; -} -.navbar-toggle .icon-bar + .icon-bar { - margin-top: 4px; -} -@media (min-width: 768px) { - .navbar-toggle { - display: none; - } -} -.navbar-nav { - margin: 7.5px -15px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 20px; -} -@media (max-width: 767px) { - .navbar-nav .open .dropdown-menu { - position: static; - float: none; - width: auto; - margin-top: 0; - background-color: transparent; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-nav .open .dropdown-menu > li > a, - .navbar-nav .open .dropdown-menu .dropdown-header { - padding: 5px 15px 5px 25px; - } - .navbar-nav .open .dropdown-menu > li > a { - line-height: 20px; - } - .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-nav .open .dropdown-menu > li > a:focus { - background-image: none; - } -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 15px; - padding-bottom: 15px; - } - .navbar-nav.navbar-right:last-child { - margin-right: -15px; - } -} -@media (min-width: 768px) { - .navbar-left { - float: left !important; - } - .navbar-right { - float: right !important; - } -} -.navbar-form { - padding: 10px 15px; - margin-top: 8px; - margin-right: -15px; - margin-bottom: 8px; - margin-left: -15px; - border-top: 1px solid transparent; - border-bottom: 1px solid transparent; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); -} -@media (min-width: 768px) { - .navbar-form .form-group { - display: inline-block; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .form-control { - display: inline-block; - width: auto; - vertical-align: middle; - } - .navbar-form .input-group { - display: inline-table; - vertical-align: middle; - } - .navbar-form .input-group .input-group-addon, - .navbar-form .input-group .input-group-btn, - .navbar-form .input-group .form-control { - width: auto; - } - .navbar-form .input-group > .form-control { - width: 100%; - } - .navbar-form .control-label { - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio, - .navbar-form .checkbox { - display: inline-block; - margin-top: 0; - margin-bottom: 0; - vertical-align: middle; - } - .navbar-form .radio label, - .navbar-form .checkbox label { - padding-left: 0; - } - .navbar-form .radio input[type="radio"], - .navbar-form .checkbox input[type="checkbox"] { - position: relative; - margin-left: 0; - } - .navbar-form .has-feedback .form-control-feedback { - top: 0; - } -} -@media (max-width: 767px) { - .navbar-form .form-group { - margin-bottom: 5px; - } -} -@media (min-width: 768px) { - .navbar-form { - width: auto; - padding-top: 0; - padding-bottom: 0; - margin-right: 0; - margin-left: 0; - border: 0; - -webkit-box-shadow: none; - box-shadow: none; - } - .navbar-form.navbar-right:last-child { - margin-right: -15px; - } -} -.navbar-nav > li > .dropdown-menu { - margin-top: 0; - border-top-left-radius: 0; - border-top-right-radius: 0; -} -.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} -.navbar-btn { - margin-top: 8px; - margin-bottom: 8px; -} -.navbar-btn.btn-sm { - margin-top: 10px; - margin-bottom: 10px; -} -.navbar-btn.btn-xs { - margin-top: 14px; - margin-bottom: 14px; -} -.navbar-text { - margin-top: 15px; - margin-bottom: 15px; -} -@media (min-width: 768px) { - .navbar-text { - float: left; - margin-right: 15px; - margin-left: 15px; - } - .navbar-text.navbar-right:last-child { - margin-right: 0; - } -} -.navbar-default { - background-color: #f8f8f8; - border-color: #e7e7e7; -} -.navbar-default .navbar-brand { - color: #777; -} -.navbar-default .navbar-brand:hover, -.navbar-default .navbar-brand:focus { - color: #5e5e5e; - background-color: transparent; -} -.navbar-default .navbar-text { - color: #777; -} -.navbar-default .navbar-nav > li > a { - color: #777; -} -.navbar-default .navbar-nav > li > a:hover, -.navbar-default .navbar-nav > li > a:focus { - color: #333; - background-color: transparent; -} -.navbar-default .navbar-nav > .active > a, -.navbar-default .navbar-nav > .active > a:hover, -.navbar-default .navbar-nav > .active > a:focus { - color: #555; - background-color: #e7e7e7; -} -.navbar-default .navbar-nav > .disabled > a, -.navbar-default .navbar-nav > .disabled > a:hover, -.navbar-default .navbar-nav > .disabled > a:focus { - color: #ccc; - background-color: transparent; -} -.navbar-default .navbar-toggle { - border-color: #ddd; -} -.navbar-default .navbar-toggle:hover, -.navbar-default .navbar-toggle:focus { - background-color: #ddd; -} -.navbar-default .navbar-toggle .icon-bar { - background-color: #888; -} -.navbar-default .navbar-collapse, -.navbar-default .navbar-form { - border-color: #e7e7e7; -} -.navbar-default .navbar-nav > .open > a, -.navbar-default .navbar-nav > .open > a:hover, -.navbar-default .navbar-nav > .open > a:focus { - color: #555; - background-color: #e7e7e7; -} -@media (max-width: 767px) { - .navbar-default .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { - color: #333; - background-color: transparent; - } - .navbar-default .navbar-nav .open .dropdown-menu > .active > a, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #555; - background-color: #e7e7e7; - } - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #ccc; - background-color: transparent; - } -} -.navbar-default .navbar-link { - color: #777; -} -.navbar-default .navbar-link:hover { - color: #333; -} -.navbar-default .btn-link { - color: #777; -} -.navbar-default .btn-link:hover, -.navbar-default .btn-link:focus { - color: #333; -} -.navbar-default .btn-link[disabled]:hover, -fieldset[disabled] .navbar-default .btn-link:hover, -.navbar-default .btn-link[disabled]:focus, -fieldset[disabled] .navbar-default .btn-link:focus { - color: #ccc; -} -.navbar-inverse { - background-color: #222; - border-color: #080808; -} -.navbar-inverse .navbar-brand { - color: #777; -} -.navbar-inverse .navbar-brand:hover, -.navbar-inverse .navbar-brand:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-text { - color: #777; -} -.navbar-inverse .navbar-nav > li > a { - color: #777; -} -.navbar-inverse .navbar-nav > li > a:hover, -.navbar-inverse .navbar-nav > li > a:focus { - color: #fff; - background-color: transparent; -} -.navbar-inverse .navbar-nav > .active > a, -.navbar-inverse .navbar-nav > .active > a:hover, -.navbar-inverse .navbar-nav > .active > a:focus { - color: #fff; - background-color: #080808; -} -.navbar-inverse .navbar-nav > .disabled > a, -.navbar-inverse .navbar-nav > .disabled > a:hover, -.navbar-inverse .navbar-nav > .disabled > a:focus { - color: #444; - background-color: transparent; -} -.navbar-inverse .navbar-toggle { - border-color: #333; -} -.navbar-inverse .navbar-toggle:hover, -.navbar-inverse .navbar-toggle:focus { - background-color: #333; -} -.navbar-inverse .navbar-toggle .icon-bar { - background-color: #fff; -} -.navbar-inverse .navbar-collapse, -.navbar-inverse .navbar-form { - border-color: #101010; -} -.navbar-inverse .navbar-nav > .open > a, -.navbar-inverse .navbar-nav > .open > a:hover, -.navbar-inverse .navbar-nav > .open > a:focus { - color: #fff; - background-color: #080808; -} -@media (max-width: 767px) { - .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { - border-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu .divider { - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { - color: #777; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { - color: #fff; - background-color: transparent; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { - color: #fff; - background-color: #080808; - } - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, - .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { - color: #444; - background-color: transparent; - } -} -.navbar-inverse .navbar-link { - color: #777; -} -.navbar-inverse .navbar-link:hover { - color: #fff; -} -.navbar-inverse .btn-link { - color: #777; -} -.navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link:focus { - color: #fff; -} -.navbar-inverse .btn-link[disabled]:hover, -fieldset[disabled] .navbar-inverse .btn-link:hover, -.navbar-inverse .btn-link[disabled]:focus, -fieldset[disabled] .navbar-inverse .btn-link:focus { - color: #444; -} -.breadcrumb { - padding: 8px 15px; - margin-bottom: 20px; - list-style: none; - background-color: #f5f5f5; - border-radius: 4px; -} -.breadcrumb > li { - display: inline-block; -} -.breadcrumb > li + li:before { - padding: 0 5px; - color: #ccc; - content: "/\00a0"; -} -.breadcrumb > .active { - color: #777; -} -.pagination { - display: inline-block; - padding-left: 0; - margin: 20px 0; - border-radius: 4px; -} -.pagination > li { - display: inline; -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #428bca; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li:first-child > a, -.pagination > li:first-child > span { - margin-left: 0; - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; -} -.pagination > li:last-child > a, -.pagination > li:last-child > span { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #2a6496; - background-color: #eee; - border-color: #ddd; -} -.pagination > .active > a, -.pagination > .active > span, -.pagination > .active > a:hover, -.pagination > .active > span:hover, -.pagination > .active > a:focus, -.pagination > .active > span:focus { - z-index: 2; - color: #fff; - cursor: default; - background-color: #428bca; - border-color: #428bca; -} -.pagination > .disabled > span, -.pagination > .disabled > span:hover, -.pagination > .disabled > span:focus, -.pagination > .disabled > a, -.pagination > .disabled > a:hover, -.pagination > .disabled > a:focus { - color: #777; - cursor: not-allowed; - background-color: #fff; - border-color: #ddd; -} -.pagination-lg > li > a, -.pagination-lg > li > span { - padding: 10px 16px; - font-size: 18px; -} -.pagination-lg > li:first-child > a, -.pagination-lg > li:first-child > span { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} -.pagination-lg > li:last-child > a, -.pagination-lg > li:last-child > span { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} -.pagination-sm > li > a, -.pagination-sm > li > span { - padding: 5px 10px; - font-size: 12px; -} -.pagination-sm > li:first-child > a, -.pagination-sm > li:first-child > span { - border-top-left-radius: 3px; - border-bottom-left-radius: 3px; -} -.pagination-sm > li:last-child > a, -.pagination-sm > li:last-child > span { - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} -.pager { - padding-left: 0; - margin: 20px 0; - text-align: center; - list-style: none; -} -.pager li { - display: inline; -} -.pager li > a, -.pager li > span { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 15px; -} -.pager li > a:hover, -.pager li > a:focus { - text-decoration: none; - background-color: #eee; -} -.pager .next > a, -.pager .next > span { - float: right; -} -.pager .previous > a, -.pager .previous > span { - float: left; -} -.pager .disabled > a, -.pager .disabled > a:hover, -.pager .disabled > a:focus, -.pager .disabled > span { - color: #777; - cursor: not-allowed; - background-color: #fff; -} -.label { - display: inline; - padding: .2em .6em .3em; - font-size: 75%; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - border-radius: .25em; -} -a.label:hover, -a.label:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -.label:empty { - display: none; -} -.btn .label { - position: relative; - top: -1px; -} -.label-default { - background-color: #777; -} -.label-default[href]:hover, -.label-default[href]:focus { - background-color: #5e5e5e; -} -.label-primary { - background-color: #428bca; -} -.label-primary[href]:hover, -.label-primary[href]:focus { - background-color: #3071a9; -} -.label-success { - background-color: #5cb85c; -} -.label-success[href]:hover, -.label-success[href]:focus { - background-color: #449d44; -} -.label-info { - background-color: #5bc0de; -} -.label-info[href]:hover, -.label-info[href]:focus { - background-color: #31b0d5; -} -.label-warning { - background-color: #f0ad4e; -} -.label-warning[href]:hover, -.label-warning[href]:focus { - background-color: #ec971f; -} -.label-danger { - background-color: #d9534f; -} -.label-danger[href]:hover, -.label-danger[href]:focus { - background-color: #c9302c; -} -.badge { - display: inline-block; - min-width: 10px; - padding: 3px 7px; - font-size: 12px; - font-weight: bold; - line-height: 1; - color: #fff; - text-align: center; - white-space: nowrap; - vertical-align: baseline; - background-color: #777; - border-radius: 10px; -} -.badge:empty { - display: none; -} -.btn .badge { - position: relative; - top: -1px; -} -.btn-xs .badge { - top: 0; - padding: 1px 5px; -} -a.badge:hover, -a.badge:focus { - color: #fff; - text-decoration: none; - cursor: pointer; -} -a.list-group-item.active > .badge, -.nav-pills > .active > a > .badge { - color: #428bca; - background-color: #fff; -} -.nav-pills > li > a > .badge { - margin-left: 3px; -} -.jumbotron { - padding: 30px; - margin-bottom: 30px; - color: inherit; - background-color: #eee; -} -.jumbotron h1, -.jumbotron .h1 { - color: inherit; -} -.jumbotron p { - margin-bottom: 15px; - font-size: 21px; - font-weight: 200; -} -.jumbotron > hr { - border-top-color: #d5d5d5; -} -.container .jumbotron { - border-radius: 6px; -} -.jumbotron .container { - max-width: 100%; -} -@media screen and (min-width: 768px) { - .jumbotron { - padding-top: 48px; - padding-bottom: 48px; - } - .container .jumbotron { - padding-right: 60px; - padding-left: 60px; - } - .jumbotron h1, - .jumbotron .h1 { - font-size: 63px; - } -} -.thumbnail { - display: block; - padding: 4px; - margin-bottom: 20px; - line-height: 1.42857143; - background-color: #fff; - border: 1px solid #ddd; - border-radius: 4px; - -webkit-transition: all .2s ease-in-out; - -o-transition: all .2s ease-in-out; - transition: all .2s ease-in-out; -} -.thumbnail > img, -.thumbnail a > img { - margin-right: auto; - margin-left: auto; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #428bca; -} -.thumbnail .caption { - padding: 9px; - color: #333; -} -.alert { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; -} -.alert h4 { - margin-top: 0; - color: inherit; -} -.alert .alert-link { - font-weight: bold; -} -.alert > p, -.alert > ul { - margin-bottom: 0; -} -.alert > p + p { - margin-top: 5px; -} -.alert-dismissable, -.alert-dismissible { - padding-right: 35px; -} -.alert-dismissable .close, -.alert-dismissible .close { - position: relative; - top: -2px; - right: -21px; - color: inherit; -} -.alert-success { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.alert-success hr { - border-top-color: #c9e2b3; -} -.alert-success .alert-link { - color: #2b542c; -} -.alert-info { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.alert-info hr { - border-top-color: #a6e1ec; -} -.alert-info .alert-link { - color: #245269; -} -.alert-warning { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.alert-warning hr { - border-top-color: #f7e1b5; -} -.alert-warning .alert-link { - color: #66512c; -} -.alert-danger { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.alert-danger hr { - border-top-color: #e4b9c0; -} -.alert-danger .alert-link { - color: #843534; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@-o-keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 40px 0; - } - to { - background-position: 0 0; - } -} -.progress { - height: 20px; - margin-bottom: 20px; - overflow: hidden; - background-color: #f5f5f5; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); -} -.progress-bar { - float: left; - width: 0; - height: 100%; - font-size: 12px; - line-height: 20px; - color: #fff; - text-align: center; - background-color: #428bca; - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); - -webkit-transition: width .6s ease; - -o-transition: width .6s ease; - transition: width .6s ease; -} -.progress-striped .progress-bar, -.progress-bar-striped { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .progress-bar, -.progress-bar.active { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -o-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-bar[aria-valuenow="1"], -.progress-bar[aria-valuenow="2"] { - min-width: 30px; -} -.progress-bar[aria-valuenow="0"] { - min-width: 30px; - color: #777; - background-color: transparent; - background-image: none; - -webkit-box-shadow: none; - box-shadow: none; -} -.progress-bar-success { - background-color: #5cb85c; -} -.progress-striped .progress-bar-success { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-info { - background-color: #5bc0de; -} -.progress-striped .progress-bar-info { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-warning { - background-color: #f0ad4e; -} -.progress-striped .progress-bar-warning { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.progress-bar-danger { - background-color: #d9534f; -} -.progress-striped .progress-bar-danger { - background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); - background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); -} -.media, -.media-body { - overflow: hidden; - zoom: 1; -} -.media, -.media .media { - margin-top: 15px; -} -.media:first-child { - margin-top: 0; -} -.media-object { - display: block; -} -.media-heading { - margin: 0 0 5px; -} -.media > .pull-left { - margin-right: 10px; -} -.media > .pull-right { - margin-left: 10px; -} -.media-list { - padding-left: 0; - list-style: none; -} -.list-group { - padding-left: 0; - margin-bottom: 20px; -} -.list-group-item { - position: relative; - display: block; - padding: 10px 15px; - margin-bottom: -1px; - background-color: #fff; - border: 1px solid #ddd; -} -.list-group-item:first-child { - border-top-left-radius: 4px; - border-top-right-radius: 4px; -} -.list-group-item:last-child { - margin-bottom: 0; - border-bottom-right-radius: 4px; - border-bottom-left-radius: 4px; -} -.list-group-item > .badge { - float: right; -} -.list-group-item > .badge + .badge { - margin-right: 5px; -} -a.list-group-item { - color: #555; -} -a.list-group-item .list-group-item-heading { - color: #333; -} -a.list-group-item:hover, -a.list-group-item:focus { - color: #555; - text-decoration: none; - background-color: #f5f5f5; -} -.list-group-item.disabled, -.list-group-item.disabled:hover, -.list-group-item.disabled:focus { - color: #777; - background-color: #eee; -} -.list-group-item.disabled .list-group-item-heading, -.list-group-item.disabled:hover .list-group-item-heading, -.list-group-item.disabled:focus .list-group-item-heading { - color: inherit; -} -.list-group-item.disabled .list-group-item-text, -.list-group-item.disabled:hover .list-group-item-text, -.list-group-item.disabled:focus .list-group-item-text { - color: #777; -} -.list-group-item.active, -.list-group-item.active:hover, -.list-group-item.active:focus { - z-index: 2; - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.list-group-item.active .list-group-item-heading, -.list-group-item.active:hover .list-group-item-heading, -.list-group-item.active:focus .list-group-item-heading, -.list-group-item.active .list-group-item-heading > small, -.list-group-item.active:hover .list-group-item-heading > small, -.list-group-item.active:focus .list-group-item-heading > small, -.list-group-item.active .list-group-item-heading > .small, -.list-group-item.active:hover .list-group-item-heading > .small, -.list-group-item.active:focus .list-group-item-heading > .small { - color: inherit; -} -.list-group-item.active .list-group-item-text, -.list-group-item.active:hover .list-group-item-text, -.list-group-item.active:focus .list-group-item-text { - color: #e1edf7; -} -.list-group-item-success { - color: #3c763d; - background-color: #dff0d8; -} -a.list-group-item-success { - color: #3c763d; -} -a.list-group-item-success .list-group-item-heading { - color: inherit; -} -a.list-group-item-success:hover, -a.list-group-item-success:focus { - color: #3c763d; - background-color: #d0e9c6; -} -a.list-group-item-success.active, -a.list-group-item-success.active:hover, -a.list-group-item-success.active:focus { - color: #fff; - background-color: #3c763d; - border-color: #3c763d; -} -.list-group-item-info { - color: #31708f; - background-color: #d9edf7; -} -a.list-group-item-info { - color: #31708f; -} -a.list-group-item-info .list-group-item-heading { - color: inherit; -} -a.list-group-item-info:hover, -a.list-group-item-info:focus { - color: #31708f; - background-color: #c4e3f3; -} -a.list-group-item-info.active, -a.list-group-item-info.active:hover, -a.list-group-item-info.active:focus { - color: #fff; - background-color: #31708f; - border-color: #31708f; -} -.list-group-item-warning { - color: #8a6d3b; - background-color: #fcf8e3; -} -a.list-group-item-warning { - color: #8a6d3b; -} -a.list-group-item-warning .list-group-item-heading { - color: inherit; -} -a.list-group-item-warning:hover, -a.list-group-item-warning:focus { - color: #8a6d3b; - background-color: #faf2cc; -} -a.list-group-item-warning.active, -a.list-group-item-warning.active:hover, -a.list-group-item-warning.active:focus { - color: #fff; - background-color: #8a6d3b; - border-color: #8a6d3b; -} -.list-group-item-danger { - color: #a94442; - background-color: #f2dede; -} -a.list-group-item-danger { - color: #a94442; -} -a.list-group-item-danger .list-group-item-heading { - color: inherit; -} -a.list-group-item-danger:hover, -a.list-group-item-danger:focus { - color: #a94442; - background-color: #ebcccc; -} -a.list-group-item-danger.active, -a.list-group-item-danger.active:hover, -a.list-group-item-danger.active:focus { - color: #fff; - background-color: #a94442; - border-color: #a94442; -} -.list-group-item-heading { - margin-top: 0; - margin-bottom: 5px; -} -.list-group-item-text { - margin-bottom: 0; - line-height: 1.3; -} -.panel { - margin-bottom: 20px; - background-color: #fff; - border: 1px solid transparent; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: 0 1px 1px rgba(0, 0, 0, .05); -} -.panel-body { - padding: 15px; -} -.panel-heading { - padding: 10px 15px; - border-bottom: 1px solid transparent; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel-heading > .dropdown .dropdown-toggle { - color: inherit; -} -.panel-title { - margin-top: 0; - margin-bottom: 0; - font-size: 16px; - color: inherit; -} -.panel-title > a { - color: inherit; -} -.panel-footer { - padding: 10px 15px; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .list-group { - margin-bottom: 0; -} -.panel > .list-group .list-group-item { - border-width: 1px 0; - border-radius: 0; -} -.panel > .list-group:first-child .list-group-item:first-child { - border-top: 0; - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .list-group:last-child .list-group-item:last-child { - border-bottom: 0; - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel-heading + .list-group .list-group-item:first-child { - border-top-width: 0; -} -.list-group + .panel-footer { - border-top-width: 0; -} -.panel > .table, -.panel > .table-responsive > .table, -.panel > .panel-collapse > .table { - margin-bottom: 0; -} -.panel > .table:first-child, -.panel > .table-responsive:first-child > .table:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { - border-top-left-radius: 3px; -} -.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, -.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, -.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, -.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { - border-top-right-radius: 3px; -} -.panel > .table:last-child, -.panel > .table-responsive:last-child > .table:last-child { - border-bottom-right-radius: 3px; - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { - border-bottom-left-radius: 3px; -} -.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, -.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, -.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, -.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { - border-bottom-right-radius: 3px; -} -.panel > .panel-body + .table, -.panel > .panel-body + .table-responsive { - border-top: 1px solid #ddd; -} -.panel > .table > tbody:first-child > tr:first-child th, -.panel > .table > tbody:first-child > tr:first-child td { - border-top: 0; -} -.panel > .table-bordered, -.panel > .table-responsive > .table-bordered { - border: 0; -} -.panel > .table-bordered > thead > tr > th:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, -.panel > .table-bordered > tbody > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, -.panel > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, -.panel > .table-bordered > thead > tr > td:first-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, -.panel > .table-bordered > tbody > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, -.panel > .table-bordered > tfoot > tr > td:first-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { - border-left: 0; -} -.panel > .table-bordered > thead > tr > th:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, -.panel > .table-bordered > tbody > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, -.panel > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, -.panel > .table-bordered > thead > tr > td:last-child, -.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, -.panel > .table-bordered > tbody > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, -.panel > .table-bordered > tfoot > tr > td:last-child, -.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { - border-right: 0; -} -.panel > .table-bordered > thead > tr:first-child > td, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, -.panel > .table-bordered > tbody > tr:first-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, -.panel > .table-bordered > thead > tr:first-child > th, -.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, -.panel > .table-bordered > tbody > tr:first-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { - border-bottom: 0; -} -.panel > .table-bordered > tbody > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, -.panel > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, -.panel > .table-bordered > tbody > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, -.panel > .table-bordered > tfoot > tr:last-child > th, -.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { - border-bottom: 0; -} -.panel > .table-responsive { - margin-bottom: 0; - border: 0; -} -.panel-group { - margin-bottom: 20px; -} -.panel-group .panel { - margin-bottom: 0; - border-radius: 4px; -} -.panel-group .panel + .panel { - margin-top: 5px; -} -.panel-group .panel-heading { - border-bottom: 0; -} -.panel-group .panel-heading + .panel-collapse > .panel-body { - border-top: 1px solid #ddd; -} -.panel-group .panel-footer { - border-top: 0; -} -.panel-group .panel-footer + .panel-collapse .panel-body { - border-bottom: 1px solid #ddd; -} -.panel-default { - border-color: #ddd; -} -.panel-default > .panel-heading { - color: #333; - background-color: #f5f5f5; - border-color: #ddd; -} -.panel-default > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ddd; -} -.panel-default > .panel-heading .badge { - color: #f5f5f5; - background-color: #333; -} -.panel-default > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ddd; -} -.panel-primary { - border-color: #428bca; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #428bca; - border-color: #428bca; -} -.panel-primary > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #428bca; -} -.panel-primary > .panel-heading .badge { - color: #428bca; - background-color: #fff; -} -.panel-primary > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #428bca; -} -.panel-success { - border-color: #d6e9c6; -} -.panel-success > .panel-heading { - color: #3c763d; - background-color: #dff0d8; - border-color: #d6e9c6; -} -.panel-success > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #d6e9c6; -} -.panel-success > .panel-heading .badge { - color: #dff0d8; - background-color: #3c763d; -} -.panel-success > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #d6e9c6; -} -.panel-info { - border-color: #bce8f1; -} -.panel-info > .panel-heading { - color: #31708f; - background-color: #d9edf7; - border-color: #bce8f1; -} -.panel-info > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #bce8f1; -} -.panel-info > .panel-heading .badge { - color: #d9edf7; - background-color: #31708f; -} -.panel-info > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #bce8f1; -} -.panel-warning { - border-color: #faebcc; -} -.panel-warning > .panel-heading { - color: #8a6d3b; - background-color: #fcf8e3; - border-color: #faebcc; -} -.panel-warning > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #faebcc; -} -.panel-warning > .panel-heading .badge { - color: #fcf8e3; - background-color: #8a6d3b; -} -.panel-warning > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #faebcc; -} -.panel-danger { - border-color: #ebccd1; -} -.panel-danger > .panel-heading { - color: #a94442; - background-color: #f2dede; - border-color: #ebccd1; -} -.panel-danger > .panel-heading + .panel-collapse > .panel-body { - border-top-color: #ebccd1; -} -.panel-danger > .panel-heading .badge { - color: #f2dede; - background-color: #a94442; -} -.panel-danger > .panel-footer + .panel-collapse > .panel-body { - border-bottom-color: #ebccd1; -} -.embed-responsive { - position: relative; - display: block; - height: 0; - padding: 0; - overflow: hidden; -} -.embed-responsive .embed-responsive-item, -.embed-responsive iframe, -.embed-responsive embed, -.embed-responsive object { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 100%; - height: 100%; - border: 0; -} -.embed-responsive.embed-responsive-16by9 { - padding-bottom: 56.25%; -} -.embed-responsive.embed-responsive-4by3 { - padding-bottom: 75%; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #e3e3e3; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, .15); -} -.well-lg { - padding: 24px; - border-radius: 6px; -} -.well-sm { - padding: 9px; - border-radius: 3px; -} -.close { - float: right; - font-size: 21px; - font-weight: bold; - line-height: 1; - color: #000; - text-shadow: 0 1px 0 #fff; - filter: alpha(opacity=20); - opacity: .2; -} -.close:hover, -.close:focus { - color: #000; - text-decoration: none; - cursor: pointer; - filter: alpha(opacity=50); - opacity: .5; -} -button.close { - -webkit-appearance: none; - padding: 0; - cursor: pointer; - background: transparent; - border: 0; -} -.modal-open { - overflow: hidden; -} -.modal { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1050; - display: none; - overflow: hidden; - -webkit-overflow-scrolling: touch; - outline: 0; -} -.modal.fade .modal-dialog { - -webkit-transition: -webkit-transform .3s ease-out; - -o-transition: -o-transform .3s ease-out; - transition: transform .3s ease-out; - -webkit-transform: translate3d(0, -25%, 0); - -o-transform: translate3d(0, -25%, 0); - transform: translate3d(0, -25%, 0); -} -.modal.in .modal-dialog { - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -.modal-open .modal { - overflow-x: hidden; - overflow-y: auto; -} -.modal-dialog { - position: relative; - width: auto; - margin: 10px; -} -.modal-content { - position: relative; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - outline: 0; - -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); - box-shadow: 0 3px 9px rgba(0, 0, 0, .5); -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000; -} -.modal-backdrop.fade { - filter: alpha(opacity=0); - opacity: 0; -} -.modal-backdrop.in { - filter: alpha(opacity=50); - opacity: .5; -} -.modal-header { - min-height: 16.42857143px; - padding: 15px; - border-bottom: 1px solid #e5e5e5; -} -.modal-header .close { - margin-top: -2px; -} -.modal-title { - margin: 0; - line-height: 1.42857143; -} -.modal-body { - position: relative; - padding: 15px; -} -.modal-footer { - padding: 15px; - text-align: right; - border-top: 1px solid #e5e5e5; -} -.modal-footer .btn + .btn { - margin-bottom: 0; - margin-left: 5px; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.modal-footer .btn-block + .btn-block { - margin-left: 0; -} -.modal-scrollbar-measure { - position: absolute; - top: -9999px; - width: 50px; - height: 50px; - overflow: scroll; -} -@media (min-width: 768px) { - .modal-dialog { - width: 600px; - margin: 30px auto; - } - .modal-content { - -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - box-shadow: 0 5px 15px rgba(0, 0, 0, .5); - } - .modal-sm { - width: 300px; - } -} -@media (min-width: 992px) { - .modal-lg { - width: 900px; - } -} -.tooltip { - position: absolute; - z-index: 1070; - display: block; - font-size: 12px; - line-height: 1.4; - visibility: visible; - filter: alpha(opacity=0); - opacity: 0; -} -.tooltip.in { - filter: alpha(opacity=90); - opacity: .9; -} -.tooltip.top { - padding: 5px 0; - margin-top: -3px; -} -.tooltip.right { - padding: 0 5px; - margin-left: 3px; -} -.tooltip.bottom { - padding: 5px 0; - margin-top: 3px; -} -.tooltip.left { - padding: 0 5px; - margin-left: -3px; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #fff; - text-align: center; - text-decoration: none; - background-color: #000; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-left .tooltip-arrow { - bottom: 0; - left: 5px; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.top-right .tooltip-arrow { - right: 5px; - bottom: 0; - border-width: 5px 5px 0; - border-top-color: #000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-width: 5px 5px 5px 0; - border-right-color: #000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-width: 5px 0 5px 5px; - border-left-color: #000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-left .tooltip-arrow { - top: 0; - left: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.tooltip.bottom-right .tooltip-arrow { - top: 0; - right: 5px; - border-width: 0 5px 5px; - border-bottom-color: #000; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1060; - display: none; - max-width: 276px; - padding: 1px; - text-align: left; - white-space: normal; - background-color: #fff; - -webkit-background-clip: padding-box; - background-clip: padding-box; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, .2); - border-radius: 6px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); - box-shadow: 0 5px 10px rgba(0, 0, 0, .2); -} -.popover.top { - margin-top: -10px; -} -.popover.right { - margin-left: 10px; -} -.popover.bottom { - margin-top: 10px; -} -.popover.left { - margin-left: -10px; -} -.popover-title { - padding: 8px 14px; - margin: 0; - font-size: 14px; - font-weight: normal; - line-height: 18px; - background-color: #f7f7f7; - border-bottom: 1px solid #ebebeb; - border-radius: 5px 5px 0 0; -} -.popover-content { - padding: 9px 14px; -} -.popover > .arrow, -.popover > .arrow:after { - position: absolute; - display: block; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; -} -.popover > .arrow { - border-width: 11px; -} -.popover > .arrow:after { - content: ""; - border-width: 10px; -} -.popover.top > .arrow { - bottom: -11px; - left: 50%; - margin-left: -11px; - border-top-color: #999; - border-top-color: rgba(0, 0, 0, .25); - border-bottom-width: 0; -} -.popover.top > .arrow:after { - bottom: 1px; - margin-left: -10px; - content: " "; - border-top-color: #fff; - border-bottom-width: 0; -} -.popover.right > .arrow { - top: 50%; - left: -11px; - margin-top: -11px; - border-right-color: #999; - border-right-color: rgba(0, 0, 0, .25); - border-left-width: 0; -} -.popover.right > .arrow:after { - bottom: -10px; - left: 1px; - content: " "; - border-right-color: #fff; - border-left-width: 0; -} -.popover.bottom > .arrow { - top: -11px; - left: 50%; - margin-left: -11px; - border-top-width: 0; - border-bottom-color: #999; - border-bottom-color: rgba(0, 0, 0, .25); -} -.popover.bottom > .arrow:after { - top: 1px; - margin-left: -10px; - content: " "; - border-top-width: 0; - border-bottom-color: #fff; -} -.popover.left > .arrow { - top: 50%; - right: -11px; - margin-top: -11px; - border-right-width: 0; - border-left-color: #999; - border-left-color: rgba(0, 0, 0, .25); -} -.popover.left > .arrow:after { - right: 1px; - bottom: -10px; - content: " "; - border-right-width: 0; - border-left-color: #fff; -} -.carousel { - position: relative; -} -.carousel-inner { - position: relative; - width: 100%; - overflow: hidden; -} -.carousel-inner > .item { - position: relative; - display: none; - -webkit-transition: .6s ease-in-out left; - -o-transition: .6s ease-in-out left; - transition: .6s ease-in-out left; -} -.carousel-inner > .item > img, -.carousel-inner > .item > a > img { - line-height: 1; -} -.carousel-inner > .active, -.carousel-inner > .next, -.carousel-inner > .prev { - display: block; -} -.carousel-inner > .active { - left: 0; -} -.carousel-inner > .next, -.carousel-inner > .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel-inner > .next { - left: 100%; -} -.carousel-inner > .prev { - left: -100%; -} -.carousel-inner > .next.left, -.carousel-inner > .prev.right { - left: 0; -} -.carousel-inner > .active.left { - left: -100%; -} -.carousel-inner > .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 15%; - font-size: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); - filter: alpha(opacity=50); - opacity: .5; -} -.carousel-control.left { - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control.right { - right: 0; - left: auto; - background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); - background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); - background-repeat: repeat-x; -} -.carousel-control:hover, -.carousel-control:focus { - color: #fff; - text-decoration: none; - filter: alpha(opacity=90); - outline: 0; - opacity: .9; -} -.carousel-control .icon-prev, -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-left, -.carousel-control .glyphicon-chevron-right { - position: absolute; - top: 50%; - z-index: 5; - display: inline-block; -} -.carousel-control .icon-prev, -.carousel-control .glyphicon-chevron-left { - left: 50%; - margin-left: -10px; -} -.carousel-control .icon-next, -.carousel-control .glyphicon-chevron-right { - right: 50%; - margin-right: -10px; -} -.carousel-control .icon-prev, -.carousel-control .icon-next { - width: 20px; - height: 20px; - margin-top: -10px; - font-family: serif; -} -.carousel-control .icon-prev:before { - content: '\2039'; -} -.carousel-control .icon-next:before { - content: '\203a'; -} -.carousel-indicators { - position: absolute; - bottom: 10px; - left: 50%; - z-index: 15; - width: 60%; - padding-left: 0; - margin-left: -30%; - text-align: center; - list-style: none; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0); - border: 1px solid #fff; - border-radius: 10px; -} -.carousel-indicators .active { - width: 12px; - height: 12px; - margin: 0; - background-color: #fff; -} -.carousel-caption { - position: absolute; - right: 15%; - bottom: 20px; - left: 15%; - z-index: 10; - padding-top: 20px; - padding-bottom: 20px; - color: #fff; - text-align: center; - text-shadow: 0 1px 2px rgba(0, 0, 0, .6); -} -.carousel-caption .btn { - text-shadow: none; -} -@media screen and (min-width: 768px) { - .carousel-control .glyphicon-chevron-left, - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-prev, - .carousel-control .icon-next { - width: 30px; - height: 30px; - margin-top: -15px; - font-size: 30px; - } - .carousel-control .glyphicon-chevron-left, - .carousel-control .icon-prev { - margin-left: -15px; - } - .carousel-control .glyphicon-chevron-right, - .carousel-control .icon-next { - margin-right: -15px; - } - .carousel-caption { - right: 20%; - left: 20%; - padding-bottom: 30px; - } - .carousel-indicators { - bottom: 20px; - } -} -.clearfix:before, -.clearfix:after, -.dl-horizontal dd:before, -.dl-horizontal dd:after, -.container:before, -.container:after, -.container-fluid:before, -.container-fluid:after, -.row:before, -.row:after, -.form-horizontal .form-group:before, -.form-horizontal .form-group:after, -.btn-toolbar:before, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:before, -.btn-group-vertical > .btn-group:after, -.nav:before, -.nav:after, -.navbar:before, -.navbar:after, -.navbar-header:before, -.navbar-header:after, -.navbar-collapse:before, -.navbar-collapse:after, -.pager:before, -.pager:after, -.panel-body:before, -.panel-body:after, -.modal-footer:before, -.modal-footer:after { - display: table; - content: " "; -} -.clearfix:after, -.dl-horizontal dd:after, -.container:after, -.container-fluid:after, -.row:after, -.form-horizontal .form-group:after, -.btn-toolbar:after, -.btn-group-vertical > .btn-group:after, -.nav:after, -.navbar:after, -.navbar-header:after, -.navbar-collapse:after, -.pager:after, -.panel-body:after, -.modal-footer:after { - clear: both; -} -.center-block { - display: block; - margin-right: auto; - margin-left: auto; -} -.pull-right { - float: right !important; -} -.pull-left { - float: left !important; -} -.hide { - display: none !important; -} -.show { - display: block !important; -} -.invisible { - visibility: hidden; -} -.text-hide { - font: 0/0 a; - color: transparent; - text-shadow: none; - background-color: transparent; - border: 0; -} -.hidden { - display: none !important; - visibility: hidden !important; -} -.affix { - position: fixed; - -webkit-transform: translate3d(0, 0, 0); - -o-transform: translate3d(0, 0, 0); - transform: translate3d(0, 0, 0); -} -@-ms-viewport { - width: device-width; -} -.visible-xs, -.visible-sm, -.visible-md, -.visible-lg { - display: none !important; -} -.visible-xs-block, -.visible-xs-inline, -.visible-xs-inline-block, -.visible-sm-block, -.visible-sm-inline, -.visible-sm-inline-block, -.visible-md-block, -.visible-md-inline, -.visible-md-inline-block, -.visible-lg-block, -.visible-lg-inline, -.visible-lg-inline-block { - display: none !important; -} -@media (max-width: 767px) { - .visible-xs { - display: block !important; - } - table.visible-xs { - display: table; - } - tr.visible-xs { - display: table-row !important; - } - th.visible-xs, - td.visible-xs { - display: table-cell !important; - } -} -@media (max-width: 767px) { - .visible-xs-block { - display: block !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline { - display: inline !important; - } -} -@media (max-width: 767px) { - .visible-xs-inline-block { - display: inline-block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm { - display: block !important; - } - table.visible-sm { - display: table; - } - tr.visible-sm { - display: table-row !important; - } - th.visible-sm, - td.visible-sm { - display: table-cell !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-block { - display: block !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline { - display: inline !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .visible-sm-inline-block { - display: inline-block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md { - display: block !important; - } - table.visible-md { - display: table; - } - tr.visible-md { - display: table-row !important; - } - th.visible-md, - td.visible-md { - display: table-cell !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-block { - display: block !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline { - display: inline !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .visible-md-inline-block { - display: inline-block !important; - } -} -@media (min-width: 1200px) { - .visible-lg { - display: block !important; - } - table.visible-lg { - display: table; - } - tr.visible-lg { - display: table-row !important; - } - th.visible-lg, - td.visible-lg { - display: table-cell !important; - } -} -@media (min-width: 1200px) { - .visible-lg-block { - display: block !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline { - display: inline !important; - } -} -@media (min-width: 1200px) { - .visible-lg-inline-block { - display: inline-block !important; - } -} -@media (max-width: 767px) { - .hidden-xs { - display: none !important; - } -} -@media (min-width: 768px) and (max-width: 991px) { - .hidden-sm { - display: none !important; - } -} -@media (min-width: 992px) and (max-width: 1199px) { - .hidden-md { - display: none !important; - } -} -@media (min-width: 1200px) { - .hidden-lg { - display: none !important; - } -} -.visible-print { - display: none !important; -} -@media print { - .visible-print { - display: block !important; - } - table.visible-print { - display: table; - } - tr.visible-print { - display: table-row !important; - } - th.visible-print, - td.visible-print { - display: table-cell !important; - } -} -.visible-print-block { - display: none !important; -} -@media print { - .visible-print-block { - display: block !important; - } -} -.visible-print-inline { - display: none !important; -} -@media print { - .visible-print-inline { - display: inline !important; - } -} -.visible-print-inline-block { - display: none !important; -} -@media print { - .visible-print-inline-block { - display: inline-block !important; - } -} -@media print { - .hidden-print { - display: none !important; - } -} -/*# sourceMappingURL=bootstrap.css.map */ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map deleted file mode 100644 index bfb5616891b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"bootstrap.css","sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"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;EAAW,kBAAA;EHoR9C;AGnRmC;EAAW,kBAAA;EHsR9C;AGrRmC;EAAW,kBAAA;EHwR9C;AGvRmC;EAAW,kBAAA;EH0R9C;AGzRmC;EAAW,kBAAA;EH4R9C;AG3RmC;EAAW,kBAAA;EH8R9C;AG7RmC;EAAW,kBAAA;EHgS9C;AG/RmC;EAAW,kBAAA;EHkS9C;AGjSmC;EAAW,kBAAA;EHoS9C;AGnSmC;EAAW,kBAAA;EHsS9C;AGrSmC;EAAW,kBAAA;EHwS9C;AGvSmC;EAAW,kBAAA;EH0S9C;AGzSmC;EAAW,kBAAA;EH4S9C;AG3SmC;EAAW,kBAAA;EH8S9C;AG7SmC;EAAW,kBAAA;EHgT9C;AG/SmC;EAAW,kBAAA;EHkT9C;AGjTmC;EAAW,kBAAA;EHoT9C;AGnTmC;EAAW,kBAAA;EHsT9C;AGrTmC;EAAW,kBAAA;EHwT9C;AGvTmC;EAAW,kBAAA;EH0T9C;AGzTmC;EAAW,kBAAA;EH4T9C;AG3TmC;EAAW,kBAAA;EH8T9C;AG7TmC;EAAW,kBAAA;EHgU9C;AG/TmC;EAAW,kBAAA;EHkU9C;AGjUmC;EAAW,kBAAA;EHoU9C;AGnUmC;EAAW,kBAAA;EHsU9C;AGrUmC;EAAW,kBAAA;EHwU9C;AGvUmC;EAAW,kBAAA;EH0U9C;AGzUmC;EAAW,kBAAA;EH4U9C;AG3UmC;EAAW,kBAAA;EH8U9C;AG7UmC;EAAW,kBAAA;EHgV9C;AG/UmC;EAAW,kBAAA;EHkV9C;AGjVmC;EAAW,kBAAA;EHoV9C;AGnVmC;EAAW,kBAAA;EHsV9C;AGrVmC;EAAW,kBAAA;EHwV9C;AGvVmC;EAAW,kBAAA;EH0V9C;AGzVmC;EAAW,kBAAA;EH4V9C;AG3VmC;EAAW,kBAAA;EH8V9C;AG7VmC;EAAW,kBAAA;EHgW9C;AG/VmC;EAAW,kBAAA;EHkW9C;AGjWmC;EAAW,kBAAA;EHoW9C;AGnWmC;EAAW,kBAAA;EHsW9C;AGrWmC;EAAW,kBAAA;EHwW9C;AGvWmC;EAAW,kBAAA;EH0W9C;AGzWmC;EAAW,kBAAA;EH4W9C;AG3WmC;EAAW,kBAAA;EH8W9C;AG7WmC;EAAW,kBAAA;EHgX9C;AG/WmC;EAAW,kBAAA;EHkX9C;AGjXmC;EAAW,kBAAA;EHoX9C;AGnXmC;EAAW,kBAAA;EHsX9C;AGrXmC;EAAW,kBAAA;EHwX9C;AGvXmC;EAAW,kBAAA;EH0X9C;AGzXmC;EAAW,kBAAA;EH4X9C;AG3XmC;EAAW,kBAAA;EH8X9C;AG7XmC;EAAW,kBAAA;EHgY9C;AG/XmC;EAAW,kBAAA;EHkY9C;AGjYmC;EAAW,kBAAA;EHoY9C;AGnYmC;EAAW,kBAAA;EHsY9C;AGrYmC;EAAW,kBAAA;EHwY9C;AGvYmC;EAAW,kBAAA;EH0Y9C;AGzYmC;EAAW,kBAAA;EH4Y9C;AG3YmC;EAAW,kBAAA;EH8Y9C;AG7YmC;EAAW,kBAAA;EHgZ9C;AG/YmC;EAAW,kBAAA;EHkZ9C;AGjZmC;EAAW,kBAAA;EHoZ9C;AGnZmC;EAAW,kBAAA;EHsZ9C;AGrZmC;EAAW,kBAAA;EHwZ9C;AGvZmC;EAAW,kBAAA;EH0Z9C;AGzZmC;EAAW,kBAAA;EH4Z9C;AG3ZmC;EAAW,kBAAA;EH8Z9C;AG7ZmC;EAAW,kBAAA;EHga9C;AG/ZmC;EAAW,kBAAA;EHka9C;AGjamC;EAAW,kBAAA;EHoa9C;AGnamC;EAAW,kBAAA;EHsa9C;AGramC;EAAW,kBAAA;EHwa9C;AGvamC;EAAW,kBAAA;EH0a9C;AGzamC;EAAW,kBAAA;EH4a9C;AG3amC;EAAW,kBAAA;EH8a9C;AG7amC;EAAW,kBAAA;EHgb9C;AG/amC;EAAW,kBAAA;EHkb9C;AGjbmC;EAAW,kBAAA;EHob9C;AGnbmC;EAAW,kBAAA;EHsb9C;AGrbmC;EAAW,kBAAA;EHwb9C;AGvbmC;EAAW,kBAAA;EH0b9C;AGzbmC;EAAW,kBAAA;EH4b9C;AG3bmC;EAAW,kBAAA;EH8b9C;AG7bmC;EAAW,kBAAA;EHgc9C;AG/bmC;EAAW,kBAAA;EHkc9C;AGjcmC;EAAW,kBAAA;EHoc9C;AGncmC;EAAW,kBAAA;EHsc9C;AGrcmC;EAAW,kBAAA;EHwc9C;AGvcmC;EAAW,kBAAA;EH0c9C;AGzcmC;EAAW,kBAAA;EH4c9C;AG3cmC;EAAW,kBAAA;EH8c9C;AG7cmC;EAAW,kBAAA;EHgd9C;AG/cmC;EAAW,kBAAA;EHkd9C;AGjdmC;EAAW,kBAAA;EHod9C;AGndmC;EAAW,kBAAA;EHsd9C;AGrdmC;EAAW,kBAAA;EHwd9C;AGvdmC;EAAW,kBAAA;EH0d9C;AGzdmC;EAAW,kBAAA;EH4d9C;AG3dmC;EAAW,kBAAA;EH8d9C;AG7dmC;EAAW,kBAAA;EHge9C;AG/dmC;EAAW,kBAAA;EHke9C;AGjemC;EAAW,kBAAA;EHoe9C;AGnemC;EAAW,kBAAA;EHse9C;AGremC;EAAW,kBAAA;EHwe9C;AGvemC;EAAW,kBAAA;EH0e9C;AGzemC;EAAW,kBAAA;EH4e9C;AG3emC;EAAW,kBAAA;EH8e9C;AG7emC;EAAW,kBAAA;EHgf9C;AG/emC;EAAW,kBAAA;EHkf9C;AGjfmC;EAAW,kBAAA;EHof9C;AGnfmC;EAAW,kBAAA;EHsf9C;AGrfmC;EAAW,kBAAA;EHwf9C;AGvfmC;EAAW,kBAAA;EH0f9C;AGzfmC;EAAW,kBAAA;EH4f9C;AG3fmC;EAAW,kBAAA;EH8f9C;AG7fmC;EAAW,kBAAA;EHggB9C;AG/fmC;EAAW,kBAAA;EHkgB9C;AGjgBmC;EAAW,kBAAA;EHogB9C;AGngBmC;EAAW,kBAAA;EHsgB9C;AGrgBmC;EAAW,kBAAA;EHwgB9C;AGvgBmC;EAAW,kBAAA;EH0gB9C;AGzgBmC;EAAW,kBAAA;EH4gB9C;AG3gBmC;EAAW,kBAAA;EH8gB9C;AG7gBmC;EAAW,kBAAA;EHghB9C;AG/gBmC;EAAW,kBAAA;EHkhB9C;AGjhBmC;EAAW,kBAAA;EHohB9C;AGnhBmC;EAAW,kBAAA;EHshB9C;AGrhBmC;EAAW,kBAAA;EHwhB9C;AGvhBmC;EAAW,kBAAA;EH0hB9C;AGzhBmC;EAAW,kBAAA;EH4hB9C;AG3hBmC;EAAW,kBAAA;EH8hB9C;AG7hBmC;EAAW,kBAAA;EHgiB9C;AG/hBmC;EAAW,kBAAA;EHkiB9C;AGjiBmC;EAAW,kBAAA;EHoiB9C;AGniBmC;EAAW,kBAAA;EHsiB9C;AGriBmC;EAAW,kBAAA;EHwiB9C;AGviBmC;EAAW,kBAAA;EH0iB9C;AGziBmC;EAAW,kBAAA;EH4iB9C;AG3iBmC;EAAW,kBAAA;EH8iB9C;AG7iBmC;EA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A;Efk8CH;Ae97CC;EACE,YAAA;Efg8CH;Ael7CC;EACE,mBAAA;Efo7CH;Aer7CC;EACE,2BAAA;Efu7CH;Aex7CC;EACE,2BAAA;Ef07CH;Ae37CC;EACE,kBAAA;Ef67CH;Ae97CC;EACE,2BAAA;Efg8CH;Aej8CC;EACE,2BAAA;Efm8CH;Aep8CC;EACE,kBAAA;Efs8CH;Aev8CC;EACE,2BAAA;Efy8CH;Ae18CC;EACE,2BAAA;Ef48CH;Ae78CC;EACE,kBAAA;Ef+8CH;Aeh9CC;EACE,2BAAA;Efk9CH;Aen9CC;EACE,0BAAA;Efq9CH;Aet9CC;EACE,iBAAA;Efw9CH;Aa59CD;EE9BI;IACE,aAAA;If6/CH;Eet/CD;IACE,aAAA;Ifw/CD;Eez/CD;IACE,qBAAA;If2/CD;Ee5/CD;IACE,qBAAA;If8/CD;Ee//CD;IACE,YAAA;IfigDD;EelgDD;IACE,qBAAA;IfogDD;EergDD;IACE,qBAAA;IfugDD;EexgDD;IACE,YAAA;If0gDD;Ee3gDD;IACE,qBAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,YAAA;IfmhDD;EephDD;IACE,qBAAA;IfshDD;EevhDD;IACE,oBAAA;IfyhDD;Ee3gDD;IACE,aAAA;If6gDD;Ee9gDD;IACE,qBAAA;IfghDD;EejhDD;IACE,qBAAA;IfmhDD;EephDD;IACE,YAAA;IfshDD;EevhDD;IACE,qBAAA;IfyhDD;Ee1hDD;IACE,qBAAA;If4hDD;Ee7hDD;IACE,YAAA;If+hDD;EehiDD;IACE,qBAAA;IfkiDD;EeniDD;IACE,qBAAA;IfqiDD;EetiDD;IACE,YAAA;IfwiDD;EeziDD;IACE,qBAAA;If2iDD;Ee5iDD;IACE,oBAAA;If8iDD;Ee1iDD;IACE,aAAA;If4iDD;Ee5jDD;IACE,YAAA;If8jDD;Ee/jDD;IACE,oBAAA;IfikDD;EelkDD;IACE,oBAAA;IfokDD;EerkDD;IACE,WAAA;IfukDD;EexkDD;IACE,oBAAA;If0kDD;Ee3kDD;IACE,oBAAA;If6kDD;Ee9kDD;IACE,WAAA;IfglDD;EejlDD;IACE,oBAAA;IfmlDD;EeplDD;IACE,oBAAA;IfslDD;EevlDD;IACE,WAAA;IfylDD;Ee1lDD;IACE,oBAAA;If4lDD;Ee7lDD;IACE,mBAAA;If+lDD;Ee3lDD;IACE,YAAA;If6lDD;Ee/kDD;IACE,mBAAA;IfilDD;EellDD;IACE,2BAAA;IfolDD;EerlDD;IACE,2BAAA;IfulDD;EexlDD;IACE,kBAAA;If0lDD;Ee3lDD;IACE,2BAAA;If6lDD;Ee9lDD;IACE,2BAAA;IfgmDD;EejmDD;IACE,kBAAA;IfmmDD;EepmDD;IACE,2BAAA;IfsmDD;EevmDD;IACE,2BAAA;IfymDD;Ee1mDD;IACE,kBAAA;If4mDD;Ee7mDD;IACE,2BAAA;If+mDD;EehnDD;IACE,0BAAA;IfknDD;EennDD;IACE,iBAAA;IfqnDD;EACF;AajnDD;EEvCI;IACE,aAAA;If2pDH;EeppDD;IACE,aAAA;IfspDD;EevpDD;IACE,qBAAA;IfypDD;Ee1pDD;IACE,qBAAA;If4pDD;Ee7pDD;IACE,YAAA;If+pDD;EehqDD;IACE,qBAAA;IfkqDD;EenqDD;IACE,qBAAA;IfqqDD;EetqDD;IACE,YAAA;IfwqDD;EezqDD;IACE,qBAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,YAAA;IfirDD;EelrDD;IACE,qBAAA;IforDD;EerrDD;IACE,oBAAA;IfurDD;EezqDD;IACE,aAAA;If2qDD;Ee5qDD;IACE,qBAAA;If8qDD;Ee/qDD;IACE,qBAAA;IfirDD;EelrDD;IACE,YAAA;IforDD;EerrDD;IACE,qBAAA;IfurDD;EexrDD;IACE,qBAAA;If0rDD;Ee3rDD;IACE,YAAA;If6rDD;Ee9rDD;IACE,qBAAA;IfgsDD;EejsDD;IACE,qBAAA;IfmsDD;EepsDD;IACE,YAAA;IfssDD;EevsDD;IACE,qBAAA;IfysDD;Ee1sDD;IACE,oBAAA;If4sDD;EexsDD;IACE,aAAA;If0sDD;Ee1tDD;IACE,YAAA;If4tDD;Ee7tDD;IACE,oBAAA;If+tDD;EehuDD;IACE,oBAAA;IfkuDD;EenuDD;IACE,WAAA;IfquDD;EetuDD;IACE,oBAAA;IfwuDD;EezuDD;IACE,oBAAA;If2uDD;Ee5uDD;IACE,WAAA;If8uDD;Ee/uDD;IACE,oBAAA;IfivDD;EelvDD;IACE,oBAAA;IfovDD;EervDD;IACE,WAAA;IfuvDD;EexvDD;IACE,oBAAA;If0vDD;Ee3vDD;IACE,mBAAA;If6vDD;EezvDD;IACE,YAAA;If2vDD;Ee7uDD;IACE,mBAAA;If+uDD;EehvDD;IACE,2BAAA;IfkvDD;EenvDD;IACE,2BAAA;IfqvDD;EetvDD;IACE,kBAAA;IfwvDD;EezvDD;IACE,2BAAA;If2vDD;Ee5vDD;IACE,2BAAA;If8vDD;Ee/vDD;IACE,kBAAA;IfiwDD;EelwDD;IACE,2BAAA;IfowDD;EerwDD;IACE,2BAAA;IfuwDD;EexwDD;IACE,kBAAA;If0wDD;Ee3wDD;IACE,2BAAA;If6wDD;Ee9wDD;IACE,0BAAA;IfgxDD;EejxDD;IACE,iBAAA;IfmxDD;EACF;AaxwDD;EE9CI;IACE,aAAA;IfyzDH;EelzDD;IACE,aAAA;IfozDD;EerzDD;IACE,qBAAA;IfuzDD;EexzDD;IACE,qBAAA;If0zDD;Ee3zDD;IACE,YAAA;If6zDD;Ee9zDD;IACE,qBAAA;Ifg0DD;Eej0DD;IACE,qBAAA;Ifm0DD;Eep0DD;IACE,YAAA;Ifs0DD;Eev0DD;IACE,qBAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,YAAA;If+0DD;Eeh1DD;IACE,qBAAA;Ifk1DD;Een1DD;IACE,oBAAA;Ifq1DD;Eev0DD;IACE,aAAA;Ify0DD;Ee10DD;IACE,qBAAA;If40DD;Ee70DD;IACE,qBAAA;If+0DD;Eeh1DD;IACE,YAAA;Ifk1DD;Een1DD;IACE,qBAAA;Ifq1DD;Eet1DD;IACE,qBAAA;Ifw1DD;Eez1DD;IACE,YAAA;If21DD;Ee51DD;IACE,qBAAA;If81DD;Ee/1DD;IACE,qBAAA;Ifi2DD;Eel2DD;IACE,YAAA;Ifo2DD;Eer2DD;IACE,qBAAA;Ifu2DD;Eex2DD;IACE,oBAAA;If02DD;Eet2DD;IACE,aAAA;Ifw2DD;Eex3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AAA;EACI,uBAAA;ErBqsFT;AoB9qFD;EClBI,gBAAA;EACA,2BAAA;ErBmsFH;AoB/qFD;ECrDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBuuFD;AqBruFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBuuFP;AqBruFC;;;EAGE,wBAAA;ErBuuFH;AqBluFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErB8uFT;AoBptFD;ECrBI,gBAAA;EACA,2BAAA;ErB4uFH;AoBptFD;ECzDE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBgxFD;AqB9wFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBgxFP;AqB9wFC;;;EAGE,wBAAA;ErBgxFH;AqB3wFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBuxFT;AoBzvFD;ECzBI,gBAAA;EACA,2BAAA;ErBqxFH;AoBzvFD;EC7DE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErByzFD;AqBvzFC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErByzFP;AqBvzFC;;;EAGE,wBAAA;ErByzFH;AqBpzFG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBg0FT;AoB9xFD;EC7BI,gBAAA;EACA,2BAAA;ErB8zFH;AoB9xFD;ECjEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErBk2FD;AqBh2FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErBk2FP;AqBh2FC;;;EAGE,wBAAA;ErBk2FH;AqB71FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBy2FT;AoBn0FD;ECjCI,gBAAA;EACA,2BAAA;ErBu2FH;AoBn0FD;ECrEE,gBAAA;EACA,2BAAA;EACA,uBAAA;ErB24FD;AqBz4FC;;;;;EAKE,gBAAA;EACA,2BAAA;EACI,uBAAA;ErB24FP;AqBz4FC;;;EAGE,wBAAA;ErB24FH;AqBt4FG;;;;;;;;;;;;;;;EAKE,2BAAA;EACI,uBAAA;ErBk5FT;AoBx2FD;ECrCI,gBAAA;EACA,2BAAA;ErBg5FH;AoBn2FD;EACE,gBAAA;EACA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","sourcesContent":[null,"/*! normalize.css v3.0.1 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n// user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11 and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n// (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n -moz-box-sizing: content-box;\n -webkit-box-sizing: content-box; // 2\n box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","//\n// Basic print styles\n// --------------------------------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css\n\n@media print {\n\n * {\n text-shadow: none !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n background: transparent !important;\n box-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links for images, or javascript/internal links\n a[href^=\"javascript:\"]:after,\n a[href^=\"#\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n // Once fixed, we can just straight up remove this.\n select {\n background: #fff !important;\n }\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .table {\n td,\n th {\n background-color: #fff !important;\n }\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\2a\"; } }\n.glyphicon-plus { &:before { content: \"\\2b\"; } }\n.glyphicon-euro { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n width: 100% \\9; // Force IE10 and below to size SVG images correctly\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\n// Undo browser default styling\ncite {\n font-style: normal;\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @grid-float-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n content: \"\";\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-child(odd) {\n > td,\n > th {\n background-color: @table-bg-accent;\n }\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n > td,\n > th {\n background-color: @table-bg-hover;\n }\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n overflow-x: auto;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n -webkit-overflow-scrolling: touch;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n cursor: not-allowed;\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned.\n// As a workaround, we set a pixel line-height that matches the\n// given height of the input. Since this fucks up everything else, we have to\n// appropriately reset it for Internet Explorer and the size variations.\n\ninput[type=\"date\"],\ninput[type=\"time\"],\ninput[type=\"datetime-local\"],\ninput[type=\"month\"] {\n line-height: @input-height-base;\n // IE8+ misaligns the text within date inputs, so we reset\n line-height: @line-height-base ~\"\\0\";\n\n &.input-sm {\n line-height: @input-height-small;\n }\n &.input-lg {\n line-height: @input-height-large;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n min-height: @line-height-computed; // clear the floating input if there is no label text\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: not-allowed;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: not-allowed;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n}\n.input-lg + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Reposition feedback icon if label is hidden with \"screenreader only\" state\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match (which also avoids\n // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n top: 0;\n right: (@grid-gutter-width / 2);\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n }\n }\n .form-control {\n &:extend(.input-lg);\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n }\n }\n .form-control {\n &:extend(.input-sm);\n }\n }\n}\n","// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: not-allowed;\n pointer-events: none; // Future-proof disabling of clicks\n .opacity(.65);\n .box-shadow(none);\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n cursor: pointer;\n border-radius: 0;\n\n &,\n &:active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: underline;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition(height .35s ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base solid;\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: not-allowed;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base solid;\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 1px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n &:focus {\n // Remove focus outline when dropdown JS adds it after closing the menu\n outline: 0;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n border-top-right-radius: @border-radius-base;\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n border-bottom-left-radius: @border-radius-base;\n .border-top-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `opacity`. We cannot\n// use `display: none;` or `visibility: hidden;` as that also hides the popover.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 for more.\n\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n position: absolute;\n z-index: -1;\n .opacity(0);\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @border-radius-base;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n .translate3d(0, 0, 0);\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n\n // Outdent the form if last child to line up with content down the page\n &.navbar-right:last-child {\n margin-right: 0;\n }\n }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n .translate3d(0, 0, 0);\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: not-allowed;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: not-allowed;\n }\n }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n \n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: baseline;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n .btn-xs & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n a.list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: (@font-size-base * 4.5);\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n// Account for lower percentages\n.progress-bar {\n &[aria-valuenow=\"1\"],\n &[aria-valuenow=\"2\"] {\n min-width: 30px;\n }\n\n &[aria-valuenow=\"0\"] {\n color: @gray-light;\n min-width: 30px;\n background-color: transparent;\n background-image: none;\n box-shadow: none;\n }\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n > .pull-left {\n margin-right: 10px;\n }\n > .pull-right {\n margin-left: 10px;\n }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse > .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n\n // Modifier class for 16:9 aspect ratio\n &.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n }\n\n // Modifier class for 4:3 aspect ratio\n &.embed-responsive-4by3 {\n padding-bottom: 75%;\n }\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate3d(0, -25%, 0);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate3d(0, 0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n margin-top: -10px;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -15px;\n font-size: 30px;\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: -15px;\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: -15px;\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css deleted file mode 100644 index a9f35ceedfa..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/css/bootstrap.min.css +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.1 | MIT License | git.io/normalize */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;width:100% \9;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;width:100% \9;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}mark,.mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#777;opacity:1}.form-control:-ms-input-placeholder{color:#777}.form-control::-webkit-input-placeholder{color:#777}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date],input[type=time],input[type=datetime-local],input[type=month]{line-height:34px;line-height:1.42857143 \0}input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{line-height:30px}input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;min-height:20px;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],input[type=radio].disabled,input[type=checkbox].disabled,fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm,.form-horizontal .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg,.form-horizontal .form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:25px;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center}.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:14.3px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#3071a9;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;-o-transition:height .35s ease;transition:height .35s ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px solid}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{position:absolute;z-index:-1;filter:alpha(opacity=0);opacity:0}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#777}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#777}.navbar-inverse .navbar-nav>li>a{color:#777}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#777}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#777}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#428bca;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar[aria-valuenow="1"],.progress-bar[aria-valuenow="2"]{min-width:30px}.progress-bar[aria-valuenow="0"]{min-width:30px;color:#777;background-color:transparent;background-image:none;-webkit-box-shadow:none;box-shadow:none}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{color:#777;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#428bca}.panel-primary>.panel-heading .badge{color:#428bca;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate3d(0,-25%,0);-o-transform:translate3d(0,-25%,0);transform:translate3d(0,-25%,0)}.modal.in .modal-dialog{-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-size:12px;line-height:1.4;visibility:visible;filter:alpha(opacity=0);opacity:0}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-15px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-15px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{display:table;content:" "}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed;-webkit-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20335 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index e3e2dc739dd..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ -<?xml version="1.0" standalone="no"?> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > -<svg xmlns="http://www.w3.org/2000/svg"> -<metadata></metadata> -<defs> -<font id="glyphicons_halflingsregular" horiz-adv-x="1200" > -<font-face units-per-em="1200" ascent="960" descent="-240" /> -<missing-glyph horiz-adv-x="500" /> -<glyph /> -<glyph /> -<glyph unicode="
" /> -<glyph unicode=" " /> -<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" /> -<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" /> -<glyph unicode=" " /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="652" /> -<glyph unicode=" " horiz-adv-x="1304" /> -<glyph unicode=" " horiz-adv-x="434" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="217" /> -<glyph unicode=" " horiz-adv-x="163" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="72" /> -<glyph unicode=" " horiz-adv-x="260" /> -<glyph unicode=" " horiz-adv-x="326" /> -<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" /> -<glyph unicode="−" d="M200 400h900v300h-900v-300z" /> -<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" /> -<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" /> -<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" /> -<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" /> -<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" /> -<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" /> -<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" /> -<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" /> -<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" /> -<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" /> -<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" /> -<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" /> -<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" /> -<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" /> -<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" /> -<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" /> -<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" /> -<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" /> -<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" /> -<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" /> -<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" /> -<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" /> -<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" /> -<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" /> -<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" /> -<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" /> -<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" /> -<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" /> -<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" /> -<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" /> -<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" /> -<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" /> -<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" /> -<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" /> -<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" /> -<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" /> -<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" /> -<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" /> -<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" /> -<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" /> -<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " /> -<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" /> -<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" /> -<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" /> -<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " /> -<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" /> -<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" /> -<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" /> -<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" /> -<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" /> -<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" /> -<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" /> -<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" /> -<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" /> -<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" /> -<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" /> -<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" /> -<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" /> -<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" /> -<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" /> -<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" /> -<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" /> -<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" /> -<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" /> -<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" /> -<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" /> -<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" /> -<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" /> -<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" /> -<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" /> -<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" /> -<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" /> -<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" /> -<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" /> -<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" /> -<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" /> -<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" /> -<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" /> -<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" /> -<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" /> -<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" /> -<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" /> -<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" /> -<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" /> -<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" /> -<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" /> -<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" /> -<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" /> -<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" /> -<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" /> -<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" /> -<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" /> -<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" /> -<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" /> -<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" /> -<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" /> -<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" /> -<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" /> -<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" /> -<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" /> -<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" /> -<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" /> -<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" /> -<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" /> -<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" /> -<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" /> -<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" /> -<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" /> -<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" /> -<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" /> -<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" /> -<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" /> -<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" /> -<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" /> -<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" /> -<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " /> -<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" /> -<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" /> -<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" /> -<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" /> -<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" /> -<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" /> -<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" /> -<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" /> -<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" /> -<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" /> -<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" /> -<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" /> -<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" /> -<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" /> -<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" /> -<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" /> -<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" /> -</font> -</defs></svg> \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index 67fa00bf83801d2fa568546b982c80d27f6ef74e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41280 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℞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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index 8c54182aa5d4d1ab3c9171976b615c1dcb1dc187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23320 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js deleted file mode 100644 index 53da1c77c08..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.js +++ /dev/null @@ -1,2114 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ - -if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') } - -/* ======================================================================== - * Bootstrap: transition.js v3.2.0 - * http://getbootstrap.com/javascript/#transitions - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) - // ============================================================ - - function transitionEnd() { - var el = document.createElement('bootstrap') - - var transEndEventNames = { - WebkitTransition : 'webkitTransitionEnd', - MozTransition : 'transitionend', - OTransition : 'oTransitionEnd otransitionend', - transition : 'transitionend' - } - - for (var name in transEndEventNames) { - if (el.style[name] !== undefined) { - return { end: transEndEventNames[name] } - } - } - - return false // explicit for ie8 ( ._.) - } - - // http://blog.alexmaccaw.com/css-transitions - $.fn.emulateTransitionEnd = function (duration) { - var called = false - var $el = this - $(this).one('bsTransitionEnd', function () { called = true }) - var callback = function () { if (!called) $($el).trigger($.support.transition.end) } - setTimeout(callback, duration) - return this - } - - $(function () { - $.support.transition = transitionEnd() - - if (!$.support.transition) return - - $.event.special.bsTransitionEnd = { - bindType: $.support.transition.end, - delegateType: $.support.transition.end, - handle: function (e) { - if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) - } - } - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: alert.js v3.2.0 - * http://getbootstrap.com/javascript/#alerts - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // ALERT CLASS DEFINITION - // ====================== - - var dismiss = '[data-dismiss="alert"]' - var Alert = function (el) { - $(el).on('click', dismiss, this.close) - } - - Alert.VERSION = '3.2.0' - - Alert.prototype.close = function (e) { - var $this = $(this) - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = $(selector) - - if (e) e.preventDefault() - - if (!$parent.length) { - $parent = $this.hasClass('alert') ? $this : $this.parent() - } - - $parent.trigger(e = $.Event('close.bs.alert')) - - if (e.isDefaultPrevented()) return - - $parent.removeClass('in') - - function removeElement() { - // detach from parent, fire event then clean up data - $parent.detach().trigger('closed.bs.alert').remove() - } - - $.support.transition && $parent.hasClass('fade') ? - $parent - .one('bsTransitionEnd', removeElement) - .emulateTransitionEnd(150) : - removeElement() - } - - - // ALERT PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.alert') - - if (!data) $this.data('bs.alert', (data = new Alert(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.alert - - $.fn.alert = Plugin - $.fn.alert.Constructor = Alert - - - // ALERT NO CONFLICT - // ================= - - $.fn.alert.noConflict = function () { - $.fn.alert = old - return this - } - - - // ALERT DATA-API - // ============== - - $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: button.js v3.2.0 - * http://getbootstrap.com/javascript/#buttons - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // BUTTON PUBLIC CLASS DEFINITION - // ============================== - - var Button = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Button.DEFAULTS, options) - this.isLoading = false - } - - Button.VERSION = '3.2.0' - - Button.DEFAULTS = { - loadingText: 'loading...' - } - - Button.prototype.setState = function (state) { - var d = 'disabled' - var $el = this.$element - var val = $el.is('input') ? 'val' : 'html' - var data = $el.data() - - state = state + 'Text' - - if (data.resetText == null) $el.data('resetText', $el[val]()) - - $el[val](data[state] == null ? this.options[state] : data[state]) - - // push to event loop to allow forms to submit - setTimeout($.proxy(function () { - if (state == 'loadingText') { - this.isLoading = true - $el.addClass(d).attr(d, d) - } else if (this.isLoading) { - this.isLoading = false - $el.removeClass(d).removeAttr(d) - } - }, this), 0) - } - - Button.prototype.toggle = function () { - var changed = true - var $parent = this.$element.closest('[data-toggle="buttons"]') - - if ($parent.length) { - var $input = this.$element.find('input') - if ($input.prop('type') == 'radio') { - if ($input.prop('checked') && this.$element.hasClass('active')) changed = false - else $parent.find('.active').removeClass('active') - } - if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change') - } - - if (changed) this.$element.toggleClass('active') - } - - - // BUTTON PLUGIN DEFINITION - // ======================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.button') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.button', (data = new Button(this, options))) - - if (option == 'toggle') data.toggle() - else if (option) data.setState(option) - }) - } - - var old = $.fn.button - - $.fn.button = Plugin - $.fn.button.Constructor = Button - - - // BUTTON NO CONFLICT - // ================== - - $.fn.button.noConflict = function () { - $.fn.button = old - return this - } - - - // BUTTON DATA-API - // =============== - - $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { - var $btn = $(e.target) - if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') - Plugin.call($btn, 'toggle') - e.preventDefault() - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: carousel.js v3.2.0 - * http://getbootstrap.com/javascript/#carousel - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // CAROUSEL CLASS DEFINITION - // ========================= - - var Carousel = function (element, options) { - this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this)) - this.$indicators = this.$element.find('.carousel-indicators') - this.options = options - this.paused = - this.sliding = - this.interval = - this.$active = - this.$items = null - - this.options.pause == 'hover' && this.$element - .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) - .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) - } - - Carousel.VERSION = '3.2.0' - - Carousel.DEFAULTS = { - interval: 5000, - pause: 'hover', - wrap: true - } - - Carousel.prototype.keydown = function (e) { - switch (e.which) { - case 37: this.prev(); break - case 39: this.next(); break - default: return - } - - e.preventDefault() - } - - Carousel.prototype.cycle = function (e) { - e || (this.paused = false) - - this.interval && clearInterval(this.interval) - - this.options.interval - && !this.paused - && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) - - return this - } - - Carousel.prototype.getItemIndex = function (item) { - this.$items = item.parent().children('.item') - return this.$items.index(item || this.$active) - } - - Carousel.prototype.to = function (pos) { - var that = this - var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) - - if (pos > (this.$items.length - 1) || pos < 0) return - - if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" - if (activeIndex == pos) return this.pause().cycle() - - return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) - } - - Carousel.prototype.pause = function (e) { - e || (this.paused = true) - - if (this.$element.find('.next, .prev').length && $.support.transition) { - this.$element.trigger($.support.transition.end) - this.cycle(true) - } - - this.interval = clearInterval(this.interval) - - return this - } - - Carousel.prototype.next = function () { - if (this.sliding) return - return this.slide('next') - } - - Carousel.prototype.prev = function () { - if (this.sliding) return - return this.slide('prev') - } - - Carousel.prototype.slide = function (type, next) { - var $active = this.$element.find('.item.active') - var $next = next || $active[type]() - var isCycling = this.interval - var direction = type == 'next' ? 'left' : 'right' - var fallback = type == 'next' ? 'first' : 'last' - var that = this - - if (!$next.length) { - if (!this.options.wrap) return - $next = this.$element.find('.item')[fallback]() - } - - if ($next.hasClass('active')) return (this.sliding = false) - - var relatedTarget = $next[0] - var slideEvent = $.Event('slide.bs.carousel', { - relatedTarget: relatedTarget, - direction: direction - }) - this.$element.trigger(slideEvent) - if (slideEvent.isDefaultPrevented()) return - - this.sliding = true - - isCycling && this.pause() - - if (this.$indicators.length) { - this.$indicators.find('.active').removeClass('active') - var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) - $nextIndicator && $nextIndicator.addClass('active') - } - - var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" - if ($.support.transition && this.$element.hasClass('slide')) { - $next.addClass(type) - $next[0].offsetWidth // force reflow - $active.addClass(direction) - $next.addClass(direction) - $active - .one('bsTransitionEnd', function () { - $next.removeClass([type, direction].join(' ')).addClass('active') - $active.removeClass(['active', direction].join(' ')) - that.sliding = false - setTimeout(function () { - that.$element.trigger(slidEvent) - }, 0) - }) - .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) - } else { - $active.removeClass('active') - $next.addClass('active') - this.sliding = false - this.$element.trigger(slidEvent) - } - - isCycling && this.cycle() - - return this - } - - - // CAROUSEL PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.carousel') - var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) - var action = typeof option == 'string' ? option : options.slide - - if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) - if (typeof option == 'number') data.to(option) - else if (action) data[action]() - else if (options.interval) data.pause().cycle() - }) - } - - var old = $.fn.carousel - - $.fn.carousel = Plugin - $.fn.carousel.Constructor = Carousel - - - // CAROUSEL NO CONFLICT - // ==================== - - $.fn.carousel.noConflict = function () { - $.fn.carousel = old - return this - } - - - // CAROUSEL DATA-API - // ================= - - $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { - var href - var $this = $(this) - var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 - if (!$target.hasClass('carousel')) return - var options = $.extend({}, $target.data(), $this.data()) - var slideIndex = $this.attr('data-slide-to') - if (slideIndex) options.interval = false - - Plugin.call($target, options) - - if (slideIndex) { - $target.data('bs.carousel').to(slideIndex) - } - - e.preventDefault() - }) - - $(window).on('load', function () { - $('[data-ride="carousel"]').each(function () { - var $carousel = $(this) - Plugin.call($carousel, $carousel.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: collapse.js v3.2.0 - * http://getbootstrap.com/javascript/#collapse - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // COLLAPSE PUBLIC CLASS DEFINITION - // ================================ - - var Collapse = function (element, options) { - this.$element = $(element) - this.options = $.extend({}, Collapse.DEFAULTS, options) - this.transitioning = null - - if (this.options.parent) this.$parent = $(this.options.parent) - if (this.options.toggle) this.toggle() - } - - Collapse.VERSION = '3.2.0' - - Collapse.DEFAULTS = { - toggle: true - } - - Collapse.prototype.dimension = function () { - var hasWidth = this.$element.hasClass('width') - return hasWidth ? 'width' : 'height' - } - - Collapse.prototype.show = function () { - if (this.transitioning || this.$element.hasClass('in')) return - - var startEvent = $.Event('show.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var actives = this.$parent && this.$parent.find('> .panel > .in') - - if (actives && actives.length) { - var hasData = actives.data('bs.collapse') - if (hasData && hasData.transitioning) return - Plugin.call(actives, 'hide') - hasData || actives.data('bs.collapse', null) - } - - var dimension = this.dimension() - - this.$element - .removeClass('collapse') - .addClass('collapsing')[dimension](0) - - this.transitioning = 1 - - var complete = function () { - this.$element - .removeClass('collapsing') - .addClass('collapse in')[dimension]('') - this.transitioning = 0 - this.$element - .trigger('shown.bs.collapse') - } - - if (!$.support.transition) return complete.call(this) - - var scrollSize = $.camelCase(['scroll', dimension].join('-')) - - this.$element - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350)[dimension](this.$element[0][scrollSize]) - } - - Collapse.prototype.hide = function () { - if (this.transitioning || !this.$element.hasClass('in')) return - - var startEvent = $.Event('hide.bs.collapse') - this.$element.trigger(startEvent) - if (startEvent.isDefaultPrevented()) return - - var dimension = this.dimension() - - this.$element[dimension](this.$element[dimension]())[0].offsetHeight - - this.$element - .addClass('collapsing') - .removeClass('collapse') - .removeClass('in') - - this.transitioning = 1 - - var complete = function () { - this.transitioning = 0 - this.$element - .trigger('hidden.bs.collapse') - .removeClass('collapsing') - .addClass('collapse') - } - - if (!$.support.transition) return complete.call(this) - - this.$element - [dimension](0) - .one('bsTransitionEnd', $.proxy(complete, this)) - .emulateTransitionEnd(350) - } - - Collapse.prototype.toggle = function () { - this[this.$element.hasClass('in') ? 'hide' : 'show']() - } - - - // COLLAPSE PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.collapse') - var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data && options.toggle && option == 'show') option = !option - if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.collapse - - $.fn.collapse = Plugin - $.fn.collapse.Constructor = Collapse - - - // COLLAPSE NO CONFLICT - // ==================== - - $.fn.collapse.noConflict = function () { - $.fn.collapse = old - return this - } - - - // COLLAPSE DATA-API - // ================= - - $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { - var href - var $this = $(this) - var target = $this.attr('data-target') - || e.preventDefault() - || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 - var $target = $(target) - var data = $target.data('bs.collapse') - var option = data ? 'toggle' : $this.data() - var parent = $this.attr('data-parent') - var $parent = parent && $(parent) - - if (!data || !data.transitioning) { - if ($parent) $parent.find('[data-toggle="collapse"][data-parent="' + parent + '"]').not($this).addClass('collapsed') - $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') - } - - Plugin.call($target, option) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: dropdown.js v3.2.0 - * http://getbootstrap.com/javascript/#dropdowns - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // DROPDOWN CLASS DEFINITION - // ========================= - - var backdrop = '.dropdown-backdrop' - var toggle = '[data-toggle="dropdown"]' - var Dropdown = function (element) { - $(element).on('click.bs.dropdown', this.toggle) - } - - Dropdown.VERSION = '3.2.0' - - Dropdown.prototype.toggle = function (e) { - var $this = $(this) - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - clearMenus() - - if (!isActive) { - if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { - // if mobile we use a backdrop because click events don't delegate - $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus) - } - - var relatedTarget = { relatedTarget: this } - $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) - - if (e.isDefaultPrevented()) return - - $this.trigger('focus') - - $parent - .toggleClass('open') - .trigger('shown.bs.dropdown', relatedTarget) - } - - return false - } - - Dropdown.prototype.keydown = function (e) { - if (!/(38|40|27)/.test(e.keyCode)) return - - var $this = $(this) - - e.preventDefault() - e.stopPropagation() - - if ($this.is('.disabled, :disabled')) return - - var $parent = getParent($this) - var isActive = $parent.hasClass('open') - - if (!isActive || (isActive && e.keyCode == 27)) { - if (e.which == 27) $parent.find(toggle).trigger('focus') - return $this.trigger('click') - } - - var desc = ' li:not(.divider):visible a' - var $items = $parent.find('[role="menu"]' + desc + ', [role="listbox"]' + desc) - - if (!$items.length) return - - var index = $items.index($items.filter(':focus')) - - if (e.keyCode == 38 && index > 0) index-- // up - if (e.keyCode == 40 && index < $items.length - 1) index++ // down - if (!~index) index = 0 - - $items.eq(index).trigger('focus') - } - - function clearMenus(e) { - if (e && e.which === 3) return - $(backdrop).remove() - $(toggle).each(function () { - var $parent = getParent($(this)) - var relatedTarget = { relatedTarget: this } - if (!$parent.hasClass('open')) return - $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) - if (e.isDefaultPrevented()) return - $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget) - }) - } - - function getParent($this) { - var selector = $this.attr('data-target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - var $parent = selector && $(selector) - - return $parent && $parent.length ? $parent : $this.parent() - } - - - // DROPDOWN PLUGIN DEFINITION - // ========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.dropdown') - - if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) - if (typeof option == 'string') data[option].call($this) - }) - } - - var old = $.fn.dropdown - - $.fn.dropdown = Plugin - $.fn.dropdown.Constructor = Dropdown - - - // DROPDOWN NO CONFLICT - // ==================== - - $.fn.dropdown.noConflict = function () { - $.fn.dropdown = old - return this - } - - - // APPLY TO STANDARD DROPDOWN ELEMENTS - // =================================== - - $(document) - .on('click.bs.dropdown.data-api', clearMenus) - .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) - .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) - .on('keydown.bs.dropdown.data-api', toggle + ', [role="menu"], [role="listbox"]', Dropdown.prototype.keydown) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: modal.js v3.2.0 - * http://getbootstrap.com/javascript/#modals - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // MODAL CLASS DEFINITION - // ====================== - - var Modal = function (element, options) { - this.options = options - this.$body = $(document.body) - this.$element = $(element) - this.$backdrop = - this.isShown = null - this.scrollbarWidth = 0 - - if (this.options.remote) { - this.$element - .find('.modal-content') - .load(this.options.remote, $.proxy(function () { - this.$element.trigger('loaded.bs.modal') - }, this)) - } - } - - Modal.VERSION = '3.2.0' - - Modal.DEFAULTS = { - backdrop: true, - keyboard: true, - show: true - } - - Modal.prototype.toggle = function (_relatedTarget) { - return this.isShown ? this.hide() : this.show(_relatedTarget) - } - - Modal.prototype.show = function (_relatedTarget) { - var that = this - var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) - - this.$element.trigger(e) - - if (this.isShown || e.isDefaultPrevented()) return - - this.isShown = true - - this.checkScrollbar() - this.$body.addClass('modal-open') - - this.setScrollbar() - this.escape() - - this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) - - this.backdrop(function () { - var transition = $.support.transition && that.$element.hasClass('fade') - - if (!that.$element.parent().length) { - that.$element.appendTo(that.$body) // don't move modals dom position - } - - that.$element - .show() - .scrollTop(0) - - if (transition) { - that.$element[0].offsetWidth // force reflow - } - - that.$element - .addClass('in') - .attr('aria-hidden', false) - - that.enforceFocus() - - var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) - - transition ? - that.$element.find('.modal-dialog') // wait for modal to slide in - .one('bsTransitionEnd', function () { - that.$element.trigger('focus').trigger(e) - }) - .emulateTransitionEnd(300) : - that.$element.trigger('focus').trigger(e) - }) - } - - Modal.prototype.hide = function (e) { - if (e) e.preventDefault() - - e = $.Event('hide.bs.modal') - - this.$element.trigger(e) - - if (!this.isShown || e.isDefaultPrevented()) return - - this.isShown = false - - this.$body.removeClass('modal-open') - - this.resetScrollbar() - this.escape() - - $(document).off('focusin.bs.modal') - - this.$element - .removeClass('in') - .attr('aria-hidden', true) - .off('click.dismiss.bs.modal') - - $.support.transition && this.$element.hasClass('fade') ? - this.$element - .one('bsTransitionEnd', $.proxy(this.hideModal, this)) - .emulateTransitionEnd(300) : - this.hideModal() - } - - Modal.prototype.enforceFocus = function () { - $(document) - .off('focusin.bs.modal') // guard against infinite focus loop - .on('focusin.bs.modal', $.proxy(function (e) { - if (this.$element[0] !== e.target && !this.$element.has(e.target).length) { - this.$element.trigger('focus') - } - }, this)) - } - - Modal.prototype.escape = function () { - if (this.isShown && this.options.keyboard) { - this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) { - e.which == 27 && this.hide() - }, this)) - } else if (!this.isShown) { - this.$element.off('keyup.dismiss.bs.modal') - } - } - - Modal.prototype.hideModal = function () { - var that = this - this.$element.hide() - this.backdrop(function () { - that.$element.trigger('hidden.bs.modal') - }) - } - - Modal.prototype.removeBackdrop = function () { - this.$backdrop && this.$backdrop.remove() - this.$backdrop = null - } - - Modal.prototype.backdrop = function (callback) { - var that = this - var animate = this.$element.hasClass('fade') ? 'fade' : '' - - if (this.isShown && this.options.backdrop) { - var doAnimate = $.support.transition && animate - - this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />') - .appendTo(this.$body) - - this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { - if (e.target !== e.currentTarget) return - this.options.backdrop == 'static' - ? this.$element[0].focus.call(this.$element[0]) - : this.hide.call(this) - }, this)) - - if (doAnimate) this.$backdrop[0].offsetWidth // force reflow - - this.$backdrop.addClass('in') - - if (!callback) return - - doAnimate ? - this.$backdrop - .one('bsTransitionEnd', callback) - .emulateTransitionEnd(150) : - callback() - - } else if (!this.isShown && this.$backdrop) { - this.$backdrop.removeClass('in') - - var callbackRemove = function () { - that.removeBackdrop() - callback && callback() - } - $.support.transition && this.$element.hasClass('fade') ? - this.$backdrop - .one('bsTransitionEnd', callbackRemove) - .emulateTransitionEnd(150) : - callbackRemove() - - } else if (callback) { - callback() - } - } - - Modal.prototype.checkScrollbar = function () { - if (document.body.clientWidth >= window.innerWidth) return - this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar() - } - - Modal.prototype.setScrollbar = function () { - var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) - if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) - } - - Modal.prototype.resetScrollbar = function () { - this.$body.css('padding-right', '') - } - - Modal.prototype.measureScrollbar = function () { // thx walsh - var scrollDiv = document.createElement('div') - scrollDiv.className = 'modal-scrollbar-measure' - this.$body.append(scrollDiv) - var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth - this.$body[0].removeChild(scrollDiv) - return scrollbarWidth - } - - - // MODAL PLUGIN DEFINITION - // ======================= - - function Plugin(option, _relatedTarget) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.modal') - var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) - - if (!data) $this.data('bs.modal', (data = new Modal(this, options))) - if (typeof option == 'string') data[option](_relatedTarget) - else if (options.show) data.show(_relatedTarget) - }) - } - - var old = $.fn.modal - - $.fn.modal = Plugin - $.fn.modal.Constructor = Modal - - - // MODAL NO CONFLICT - // ================= - - $.fn.modal.noConflict = function () { - $.fn.modal = old - return this - } - - - // MODAL DATA-API - // ============== - - $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { - var $this = $(this) - var href = $this.attr('href') - var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 - var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) - - if ($this.is('a')) e.preventDefault() - - $target.one('show.bs.modal', function (showEvent) { - if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown - $target.one('hidden.bs.modal', function () { - $this.is(':visible') && $this.trigger('focus') - }) - }) - Plugin.call($target, option, this) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tooltip.js v3.2.0 - * http://getbootstrap.com/javascript/#tooltip - * Inspired by the original jQuery.tipsy by Jason Frame - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TOOLTIP PUBLIC CLASS DEFINITION - // =============================== - - var Tooltip = function (element, options) { - this.type = - this.options = - this.enabled = - this.timeout = - this.hoverState = - this.$element = null - - this.init('tooltip', element, options) - } - - Tooltip.VERSION = '3.2.0' - - Tooltip.DEFAULTS = { - animation: true, - placement: 'top', - selector: false, - template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', - trigger: 'hover focus', - title: '', - delay: 0, - html: false, - container: false, - viewport: { - selector: 'body', - padding: 0 - } - } - - Tooltip.prototype.init = function (type, element, options) { - this.enabled = true - this.type = type - this.$element = $(element) - this.options = this.getOptions(options) - this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport) - - var triggers = this.options.trigger.split(' ') - - for (var i = triggers.length; i--;) { - var trigger = triggers[i] - - if (trigger == 'click') { - this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) - } else if (trigger != 'manual') { - var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' - var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' - - this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) - this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) - } - } - - this.options.selector ? - (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : - this.fixTitle() - } - - Tooltip.prototype.getDefaults = function () { - return Tooltip.DEFAULTS - } - - Tooltip.prototype.getOptions = function (options) { - options = $.extend({}, this.getDefaults(), this.$element.data(), options) - - if (options.delay && typeof options.delay == 'number') { - options.delay = { - show: options.delay, - hide: options.delay - } - } - - return options - } - - Tooltip.prototype.getDelegateOptions = function () { - var options = {} - var defaults = this.getDefaults() - - this._options && $.each(this._options, function (key, value) { - if (defaults[key] != value) options[key] = value - }) - - return options - } - - Tooltip.prototype.enter = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - clearTimeout(self.timeout) - - self.hoverState = 'in' - - if (!self.options.delay || !self.options.delay.show) return self.show() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'in') self.show() - }, self.options.delay.show) - } - - Tooltip.prototype.leave = function (obj) { - var self = obj instanceof this.constructor ? - obj : $(obj.currentTarget).data('bs.' + this.type) - - if (!self) { - self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) - $(obj.currentTarget).data('bs.' + this.type, self) - } - - clearTimeout(self.timeout) - - self.hoverState = 'out' - - if (!self.options.delay || !self.options.delay.hide) return self.hide() - - self.timeout = setTimeout(function () { - if (self.hoverState == 'out') self.hide() - }, self.options.delay.hide) - } - - Tooltip.prototype.show = function () { - var e = $.Event('show.bs.' + this.type) - - if (this.hasContent() && this.enabled) { - this.$element.trigger(e) - - var inDom = $.contains(document.documentElement, this.$element[0]) - if (e.isDefaultPrevented() || !inDom) return - var that = this - - var $tip = this.tip() - - var tipId = this.getUID(this.type) - - this.setContent() - $tip.attr('id', tipId) - this.$element.attr('aria-describedby', tipId) - - if (this.options.animation) $tip.addClass('fade') - - var placement = typeof this.options.placement == 'function' ? - this.options.placement.call(this, $tip[0], this.$element[0]) : - this.options.placement - - var autoToken = /\s?auto?\s?/i - var autoPlace = autoToken.test(placement) - if (autoPlace) placement = placement.replace(autoToken, '') || 'top' - - $tip - .detach() - .css({ top: 0, left: 0, display: 'block' }) - .addClass(placement) - .data('bs.' + this.type, this) - - this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) - - var pos = this.getPosition() - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (autoPlace) { - var orgPlacement = placement - var $parent = this.$element.parent() - var parentDim = this.getPosition($parent) - - placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll > parentDim.height ? 'top' : - placement == 'top' && pos.top - parentDim.scroll - actualHeight < 0 ? 'bottom' : - placement == 'right' && pos.right + actualWidth > parentDim.width ? 'left' : - placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' : - placement - - $tip - .removeClass(orgPlacement) - .addClass(placement) - } - - var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) - - this.applyPlacement(calculatedOffset, placement) - - var complete = function () { - that.$element.trigger('shown.bs.' + that.type) - that.hoverState = null - } - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : - complete() - } - } - - Tooltip.prototype.applyPlacement = function (offset, placement) { - var $tip = this.tip() - var width = $tip[0].offsetWidth - var height = $tip[0].offsetHeight - - // manually read margins because getBoundingClientRect includes difference - var marginTop = parseInt($tip.css('margin-top'), 10) - var marginLeft = parseInt($tip.css('margin-left'), 10) - - // we must check for NaN for ie 8/9 - if (isNaN(marginTop)) marginTop = 0 - if (isNaN(marginLeft)) marginLeft = 0 - - offset.top = offset.top + marginTop - offset.left = offset.left + marginLeft - - // $.fn.offset doesn't round pixel values - // so we use setOffset directly with our own function B-0 - $.offset.setOffset($tip[0], $.extend({ - using: function (props) { - $tip.css({ - top: Math.round(props.top), - left: Math.round(props.left) - }) - } - }, offset), 0) - - $tip.addClass('in') - - // check to see if placing tip in new offset caused the tip to resize itself - var actualWidth = $tip[0].offsetWidth - var actualHeight = $tip[0].offsetHeight - - if (placement == 'top' && actualHeight != height) { - offset.top = offset.top + height - actualHeight - } - - var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) - - if (delta.left) offset.left += delta.left - else offset.top += delta.top - - var arrowDelta = delta.left ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight - var arrowPosition = delta.left ? 'left' : 'top' - var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight' - - $tip.offset(offset) - this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], arrowPosition) - } - - Tooltip.prototype.replaceArrow = function (delta, dimension, position) { - this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '') - } - - Tooltip.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - - $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) - $tip.removeClass('fade in top bottom left right') - } - - Tooltip.prototype.hide = function () { - var that = this - var $tip = this.tip() - var e = $.Event('hide.bs.' + this.type) - - this.$element.removeAttr('aria-describedby') - - function complete() { - if (that.hoverState != 'in') $tip.detach() - that.$element.trigger('hidden.bs.' + that.type) - } - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - $tip.removeClass('in') - - $.support.transition && this.$tip.hasClass('fade') ? - $tip - .one('bsTransitionEnd', complete) - .emulateTransitionEnd(150) : - complete() - - this.hoverState = null - - return this - } - - Tooltip.prototype.fixTitle = function () { - var $e = this.$element - if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') { - $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') - } - } - - Tooltip.prototype.hasContent = function () { - return this.getTitle() - } - - Tooltip.prototype.getPosition = function ($element) { - $element = $element || this.$element - var el = $element[0] - var isBody = el.tagName == 'BODY' - return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, { - scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(), - width: isBody ? $(window).width() : $element.outerWidth(), - height: isBody ? $(window).height() : $element.outerHeight() - }, isBody ? { top: 0, left: 0 } : $element.offset()) - } - - Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { - return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : - placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : - /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } - - } - - Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { - var delta = { top: 0, left: 0 } - if (!this.$viewport) return delta - - var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 - var viewportDimensions = this.getPosition(this.$viewport) - - if (/right|left/.test(placement)) { - var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll - var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight - if (topEdgeOffset < viewportDimensions.top) { // top overflow - delta.top = viewportDimensions.top - topEdgeOffset - } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow - delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset - } - } else { - var leftEdgeOffset = pos.left - viewportPadding - var rightEdgeOffset = pos.left + viewportPadding + actualWidth - if (leftEdgeOffset < viewportDimensions.left) { // left overflow - delta.left = viewportDimensions.left - leftEdgeOffset - } else if (rightEdgeOffset > viewportDimensions.width) { // right overflow - delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset - } - } - - return delta - } - - Tooltip.prototype.getTitle = function () { - var title - var $e = this.$element - var o = this.options - - title = $e.attr('data-original-title') - || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) - - return title - } - - Tooltip.prototype.getUID = function (prefix) { - do prefix += ~~(Math.random() * 1000000) - while (document.getElementById(prefix)) - return prefix - } - - Tooltip.prototype.tip = function () { - return (this.$tip = this.$tip || $(this.options.template)) - } - - Tooltip.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) - } - - Tooltip.prototype.validate = function () { - if (!this.$element[0].parentNode) { - this.hide() - this.$element = null - this.options = null - } - } - - Tooltip.prototype.enable = function () { - this.enabled = true - } - - Tooltip.prototype.disable = function () { - this.enabled = false - } - - Tooltip.prototype.toggleEnabled = function () { - this.enabled = !this.enabled - } - - Tooltip.prototype.toggle = function (e) { - var self = this - if (e) { - self = $(e.currentTarget).data('bs.' + this.type) - if (!self) { - self = new this.constructor(e.currentTarget, this.getDelegateOptions()) - $(e.currentTarget).data('bs.' + this.type, self) - } - } - - self.tip().hasClass('in') ? self.leave(self) : self.enter(self) - } - - Tooltip.prototype.destroy = function () { - clearTimeout(this.timeout) - this.hide().$element.off('.' + this.type).removeData('bs.' + this.type) - } - - - // TOOLTIP PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tooltip') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tooltip - - $.fn.tooltip = Plugin - $.fn.tooltip.Constructor = Tooltip - - - // TOOLTIP NO CONFLICT - // =================== - - $.fn.tooltip.noConflict = function () { - $.fn.tooltip = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: popover.js v3.2.0 - * http://getbootstrap.com/javascript/#popovers - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // POPOVER PUBLIC CLASS DEFINITION - // =============================== - - var Popover = function (element, options) { - this.init('popover', element, options) - } - - if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') - - Popover.VERSION = '3.2.0' - - Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { - placement: 'right', - trigger: 'click', - content: '', - template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>' - }) - - - // NOTE: POPOVER EXTENDS tooltip.js - // ================================ - - Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) - - Popover.prototype.constructor = Popover - - Popover.prototype.getDefaults = function () { - return Popover.DEFAULTS - } - - Popover.prototype.setContent = function () { - var $tip = this.tip() - var title = this.getTitle() - var content = this.getContent() - - $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) - $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events - this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' - ](content) - - $tip.removeClass('fade top bottom left right in') - - // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do - // this manually by checking the contents. - if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() - } - - Popover.prototype.hasContent = function () { - return this.getTitle() || this.getContent() - } - - Popover.prototype.getContent = function () { - var $e = this.$element - var o = this.options - - return $e.attr('data-content') - || (typeof o.content == 'function' ? - o.content.call($e[0]) : - o.content) - } - - Popover.prototype.arrow = function () { - return (this.$arrow = this.$arrow || this.tip().find('.arrow')) - } - - Popover.prototype.tip = function () { - if (!this.$tip) this.$tip = $(this.options.template) - return this.$tip - } - - - // POPOVER PLUGIN DEFINITION - // ========================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.popover') - var options = typeof option == 'object' && option - - if (!data && option == 'destroy') return - if (!data) $this.data('bs.popover', (data = new Popover(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.popover - - $.fn.popover = Plugin - $.fn.popover.Constructor = Popover - - - // POPOVER NO CONFLICT - // =================== - - $.fn.popover.noConflict = function () { - $.fn.popover = old - return this - } - -}(jQuery); - -/* ======================================================================== - * Bootstrap: scrollspy.js v3.2.0 - * http://getbootstrap.com/javascript/#scrollspy - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // SCROLLSPY CLASS DEFINITION - // ========================== - - function ScrollSpy(element, options) { - var process = $.proxy(this.process, this) - - this.$body = $('body') - this.$scrollElement = $(element).is('body') ? $(window) : $(element) - this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target || '') + ' .nav li > a' - this.offsets = [] - this.targets = [] - this.activeTarget = null - this.scrollHeight = 0 - - this.$scrollElement.on('scroll.bs.scrollspy', process) - this.refresh() - this.process() - } - - ScrollSpy.VERSION = '3.2.0' - - ScrollSpy.DEFAULTS = { - offset: 10 - } - - ScrollSpy.prototype.getScrollHeight = function () { - return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - } - - ScrollSpy.prototype.refresh = function () { - var offsetMethod = 'offset' - var offsetBase = 0 - - if (!$.isWindow(this.$scrollElement[0])) { - offsetMethod = 'position' - offsetBase = this.$scrollElement.scrollTop() - } - - this.offsets = [] - this.targets = [] - this.scrollHeight = this.getScrollHeight() - - var self = this - - this.$body - .find(this.selector) - .map(function () { - var $el = $(this) - var href = $el.data('target') || $el.attr('href') - var $href = /^#./.test(href) && $(href) - - return ($href - && $href.length - && $href.is(':visible') - && [[$href[offsetMethod]().top + offsetBase, href]]) || null - }) - .sort(function (a, b) { return a[0] - b[0] }) - .each(function () { - self.offsets.push(this[0]) - self.targets.push(this[1]) - }) - } - - ScrollSpy.prototype.process = function () { - var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.getScrollHeight() - var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() - var offsets = this.offsets - var targets = this.targets - var activeTarget = this.activeTarget - var i - - if (this.scrollHeight != scrollHeight) { - this.refresh() - } - - if (scrollTop >= maxScroll) { - return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) - } - - if (activeTarget && scrollTop <= offsets[0]) { - return activeTarget != (i = targets[0]) && this.activate(i) - } - - for (i = offsets.length; i--;) { - activeTarget != targets[i] - && scrollTop >= offsets[i] - && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate(targets[i]) - } - } - - ScrollSpy.prototype.activate = function (target) { - this.activeTarget = target - - $(this.selector) - .parentsUntil(this.options.target, '.active') - .removeClass('active') - - var selector = this.selector + - '[data-target="' + target + '"],' + - this.selector + '[href="' + target + '"]' - - var active = $(selector) - .parents('li') - .addClass('active') - - if (active.parent('.dropdown-menu').length) { - active = active - .closest('li.dropdown') - .addClass('active') - } - - active.trigger('activate.bs.scrollspy') - } - - - // SCROLLSPY PLUGIN DEFINITION - // =========================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.scrollspy') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.scrollspy - - $.fn.scrollspy = Plugin - $.fn.scrollspy.Constructor = ScrollSpy - - - // SCROLLSPY NO CONFLICT - // ===================== - - $.fn.scrollspy.noConflict = function () { - $.fn.scrollspy = old - return this - } - - - // SCROLLSPY DATA-API - // ================== - - $(window).on('load.bs.scrollspy.data-api', function () { - $('[data-spy="scroll"]').each(function () { - var $spy = $(this) - Plugin.call($spy, $spy.data()) - }) - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: tab.js v3.2.0 - * http://getbootstrap.com/javascript/#tabs - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // TAB CLASS DEFINITION - // ==================== - - var Tab = function (element) { - this.element = $(element) - } - - Tab.VERSION = '3.2.0' - - Tab.prototype.show = function () { - var $this = this.element - var $ul = $this.closest('ul:not(.dropdown-menu)') - var selector = $this.data('target') - - if (!selector) { - selector = $this.attr('href') - selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 - } - - if ($this.parent('li').hasClass('active')) return - - var previous = $ul.find('.active:last a')[0] - var e = $.Event('show.bs.tab', { - relatedTarget: previous - }) - - $this.trigger(e) - - if (e.isDefaultPrevented()) return - - var $target = $(selector) - - this.activate($this.closest('li'), $ul) - this.activate($target, $target.parent(), function () { - $this.trigger({ - type: 'shown.bs.tab', - relatedTarget: previous - }) - }) - } - - Tab.prototype.activate = function (element, container, callback) { - var $active = container.find('> .active') - var transition = callback - && $.support.transition - && $active.hasClass('fade') - - function next() { - $active - .removeClass('active') - .find('> .dropdown-menu > .active') - .removeClass('active') - - element.addClass('active') - - if (transition) { - element[0].offsetWidth // reflow for transition - element.addClass('in') - } else { - element.removeClass('fade') - } - - if (element.parent('.dropdown-menu')) { - element.closest('li.dropdown').addClass('active') - } - - callback && callback() - } - - transition ? - $active - .one('bsTransitionEnd', next) - .emulateTransitionEnd(150) : - next() - - $active.removeClass('in') - } - - - // TAB PLUGIN DEFINITION - // ===================== - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.tab') - - if (!data) $this.data('bs.tab', (data = new Tab(this))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.tab - - $.fn.tab = Plugin - $.fn.tab.Constructor = Tab - - - // TAB NO CONFLICT - // =============== - - $.fn.tab.noConflict = function () { - $.fn.tab = old - return this - } - - - // TAB DATA-API - // ============ - - $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) { - e.preventDefault() - Plugin.call($(this), 'show') - }) - -}(jQuery); - -/* ======================================================================== - * Bootstrap: affix.js v3.2.0 - * http://getbootstrap.com/javascript/#affix - * ======================================================================== - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * ======================================================================== */ - - -+function ($) { - 'use strict'; - - // AFFIX CLASS DEFINITION - // ====================== - - var Affix = function (element, options) { - this.options = $.extend({}, Affix.DEFAULTS, options) - - this.$target = $(this.options.target) - .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) - .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) - - this.$element = $(element) - this.affixed = - this.unpin = - this.pinnedOffset = null - - this.checkPosition() - } - - Affix.VERSION = '3.2.0' - - Affix.RESET = 'affix affix-top affix-bottom' - - Affix.DEFAULTS = { - offset: 0, - target: window - } - - Affix.prototype.getPinnedOffset = function () { - if (this.pinnedOffset) return this.pinnedOffset - this.$element.removeClass(Affix.RESET).addClass('affix') - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - return (this.pinnedOffset = position.top - scrollTop) - } - - Affix.prototype.checkPositionWithEventLoop = function () { - setTimeout($.proxy(this.checkPosition, this), 1) - } - - Affix.prototype.checkPosition = function () { - if (!this.$element.is(':visible')) return - - var scrollHeight = $(document).height() - var scrollTop = this.$target.scrollTop() - var position = this.$element.offset() - var offset = this.options.offset - var offsetTop = offset.top - var offsetBottom = offset.bottom - - if (typeof offset != 'object') offsetBottom = offsetTop = offset - if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) - if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) - - var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false : - offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' : - offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false - - if (this.affixed === affix) return - if (this.unpin != null) this.$element.css('top', '') - - var affixType = 'affix' + (affix ? '-' + affix : '') - var e = $.Event(affixType + '.bs.affix') - - this.$element.trigger(e) - - if (e.isDefaultPrevented()) return - - this.affixed = affix - this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null - - this.$element - .removeClass(Affix.RESET) - .addClass(affixType) - .trigger($.Event(affixType.replace('affix', 'affixed'))) - - if (affix == 'bottom') { - this.$element.offset({ - top: scrollHeight - this.$element.height() - offsetBottom - }) - } - } - - - // AFFIX PLUGIN DEFINITION - // ======================= - - function Plugin(option) { - return this.each(function () { - var $this = $(this) - var data = $this.data('bs.affix') - var options = typeof option == 'object' && option - - if (!data) $this.data('bs.affix', (data = new Affix(this, options))) - if (typeof option == 'string') data[option]() - }) - } - - var old = $.fn.affix - - $.fn.affix = Plugin - $.fn.affix.Constructor = Affix - - - // AFFIX NO CONFLICT - // ================= - - $.fn.affix.noConflict = function () { - $.fn.affix = old - return this - } - - - // AFFIX DATA-API - // ============== - - $(window).on('load', function () { - $('[data-spy="affix"]').each(function () { - var $spy = $(this) - var data = $spy.data() - - data.offset = data.offset || {} - - if (data.offsetBottom) data.offset.bottom = data.offsetBottom - if (data.offsetTop) data.offset.top = data.offsetTop - - Plugin.call($spy, data) - }) - }) - -}(jQuery); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js deleted file mode 100644 index 7c1561a8b96..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrap3/js/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Bootstrap v3.2.0 (http://getbootstrap.com) - * Copyright 2011-2014 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css deleted file mode 100644 index 70c1136cf5f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/css/bootstrapValidator.min.css +++ /dev/null @@ -1,13 +0,0 @@ -/** - * BootstrapValidator (http://bootstrapvalidator.com) - * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @version v0.4.4 - * @author https://twitter.com/nghuuphuoc - * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc - * @license MIT - */ - - -.bv-form .help-block{margin-bottom:0}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js deleted file mode 100644 index 08e2906447c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/bootstrapvalidator/js/bootstrapValidator.min.js +++ /dev/null @@ -1,13 +0,0 @@ -/** - * BootstrapValidator (http://bootstrapvalidator.com) - * - * A jQuery plugin to validate form fields. Use with Bootstrap 3 - * - * @version v0.4.4 - * @author https://twitter.com/nghuuphuoc - * @copyright (c) 2013 - 2014 Nguyen Huu Phuoc - * @license MIT - */ - -!function(a){var b=function(c,d){this.$form=a(c),this.options=a.extend({},b.DEFAULT_OPTIONS,d),this.$invalidField=null,this.$submitButton=null,this.STATUS_NOT_VALIDATED="NOT_VALIDATED",this.STATUS_VALIDATING="VALIDATING",this.STATUS_INVALID="INVALID",this.STATUS_VALID="VALID";var e=function(){for(var a=3,b=document.createElement("div"),c=b.all||[];b.innerHTML="<!--[if gt IE "+ ++a+"]><br><![endif]-->",c[0];);return a>4?a:!a}(),f=document.createElement("div");this._changeEvent=9!==e&&"oninput"in f?"input":"keyup",this._submitIfValid=null,this._init()};b.DEFAULT_OPTIONS={elementClass:"bv-form",message:"This value is not valid",excluded:[":disabled",":hidden",":not(:visible)"],feedbackIcons:{valid:null,invalid:null,validating:null},submitButtons:'button[type="submit"]',submitHandler:null,live:"enabled",fields:null},b.prototype={constructor:b,_init:function(){var b,c,d,e,f,g,h,i=this,j={excluded:this.$form.attr("data-bv-excluded"),trigger:this.$form.attr("data-bv-trigger"),message:this.$form.attr("data-bv-message"),submitButtons:this.$form.attr("data-bv-submitbuttons"),live:this.$form.attr("data-bv-live"),fields:{},feedbackIcons:{valid:this.$form.attr("data-bv-feedbackicons-valid"),invalid:this.$form.attr("data-bv-feedbackicons-invalid"),validating:this.$form.attr("data-bv-feedbackicons-validating")}};this.$form.attr("novalidate","novalidate").addClass(this.options.elementClass).on("submit.bv",function(a){a.preventDefault(),i.validate()}).on("click",this.options.submitButtons,function(){i.$submitButton=a(this),i._submitIfValid=!0}).find("[name], [data-bv-field]").each(function(){var i=a(this);if("hidden"!=i.attr("type")){var k=i.attr("name")||i.attr("data-bv-field");i.attr("data-bv-field",k),j.fields[k]=a.extend({},{trigger:i.attr("data-bv-trigger"),message:i.attr("data-bv-message"),container:i.attr("data-bv-container"),selector:i.attr("data-bv-selector"),validators:{}},j.fields[k]);for(c in a.fn.bootstrapValidator.validators)if(b=a.fn.bootstrapValidator.validators[c],d=i.attr("data-bv-"+c.toLowerCase())+"",h="function"==typeof b.enableByHtml5?b.enableByHtml5(a(this)):null,h&&"false"!=d||h!==!0&&(""==d||"true"==d)){b.html5Attributes=b.html5Attributes||{message:"message"},j.fields[k].validators[c]=a.extend({},1==h?{}:h,j.fields[k].validators[c]);for(g in b.html5Attributes)e=b.html5Attributes[g],f=i.attr("data-bv-"+c.toLowerCase()+"-"+g),f&&("true"==f?f=!0:"false"==f&&(f=!1),j.fields[k].validators[c][e]=f)}}}),this.options=a.extend(!0,this.options,j),"string"==typeof this.options.excluded&&(this.options.excluded=a.map(this.options.excluded.split(","),function(b){return a.trim(b)}));for(var k in this.options.fields)this._initField(k);this.setLiveMode(this.options.live)},_initField:function(b){if(null!=this.options.fields[b]&&null!=this.options.fields[b].validators){var c=this.getFieldElements(b);if(null==c)return void delete this.options.fields[b];for(var d in this.options.fields[b].validators)a.fn.bootstrapValidator.validators[d]||delete this.options.fields[b].validators[d];for(var e=this,f=c.attr("type"),g="radio"==f||"checkbox"==f||"file"==f||"SELECT"==c[0].tagName?"change":e._changeEvent,h=c.length,i=1==h||"radio"==f||"checkbox"==f,j=0;h>j;j++){var k=a(c[j]),l=k.parents(".form-group"),m=this.options.fields[b].container?l.find(this.options.fields[b].container):this._getMessageContainer(k);this.options.fields[b].selector&&k.attr("data-bv-field",b),k.on(g+".update.bv",function(){e._submitIfValid=!1,i?e.updateStatus(b,e.STATUS_NOT_VALIDATED,null):e.updateElementStatus(a(this),e.STATUS_NOT_VALIDATED,null)}),k.data("bv.messages",m);for(d in this.options.fields[b].validators)k.data("bv.result."+d,this.STATUS_NOT_VALIDATED),i&&j!=h-1||a("<small/>").css("display","none").attr("data-bv-validator",d).attr("data-bv-validator-for",b).html(this.options.fields[b].validators[d].message||this.options.fields[b].message||this.options.message).addClass("help-block").appendTo(m);if(this.options.feedbackIcons&&this.options.feedbackIcons.validating&&this.options.feedbackIcons.invalid&&this.options.feedbackIcons.valid&&(!i||j==h-1)){l.addClass("has-feedback");var n=a("<i/>").css("display","none").addClass("form-control-feedback").attr("data-bv-field",b).insertAfter(k);0==l.find("label").length&&n.css("top",0)}}null==this.options.fields[b].enabled&&(this.options.fields[b].enabled=!0)}},_getMessageContainer:function(a){var b=a.parent();if(b.hasClass("form-group"))return b;var c=b.attr("class");if(!c)return this._getMessageContainer(b);c=c.split(" ");for(var d=c.length,e=0;d>e;e++)if(/^col-(xs|sm|md|lg)-\d+$/.test(c[e])||/^col-(xs|sm|md|lg)-offset-\d+$/.test(c[e]))return b;return this._getMessageContainer(b)},_submit:function(){if(this.isValid())this.options.submitHandler&&"function"==typeof this.options.submitHandler?this.options.submitHandler.call(this,this,this.$form,this.$submitButton):this.disableSubmitButtons(!0).defaultSubmit();else if("submitted"==this.options.live&&this.setLiveMode("enabled"),this.$invalidField){var b,c=this.$invalidField.parents(".tab-pane");c&&(b=c.attr("id"))&&a('a[href="#'+b+'"][data-toggle="tab"]').trigger("click.bs.tab.data-api"),this.$invalidField.focus()}},_isExcluded:function(a){if(this.options.excluded)for(var b in this.options.excluded)if("string"==typeof this.options.excluded[b]&&a.is(this.options.excluded[b])||"function"==typeof this.options.excluded[b]&&1==this.options.excluded[b].call(this,a,this))return!0;return!1},getFieldElements:function(b){var c=this.options.fields[b].selector?a(this.options.fields[b].selector):this.$form.find('[name="'+b+'"]');return 0==c.length?null:c},setLiveMode:function(b){if(this.options.live=b,"submitted"==b)return this;var c=this;for(var d in this.options.fields)!function(e){var f=c.getFieldElements(e);if(f)for(var g=f.attr("type"),h=f.length,i=1==h||"radio"==g||"checkbox"==g,j=c.options.fields[d].trigger||c.options.trigger||("radio"==g||"checkbox"==g||"file"==g||"SELECT"==f[0].tagName?"change":c._changeEvent),k=a.map(j.split(" "),function(a){return a+".live.bv"}).join(" "),l=0;h>l;l++)"enabled"==b?a(f[l]).on(k,function(){i?c.validateField(e):c.validateFieldElement(a(this),!1)}):a(f[l]).off(k)}(d);return this},disableSubmitButtons:function(a){return a?"disabled"!=this.options.live&&this.$form.find(this.options.submitButtons).attr("disabled","disabled"):this.$form.find(this.options.submitButtons).removeAttr("disabled"),this},validate:function(){if(!this.options.fields)return this;this.disableSubmitButtons(!0);for(var a in this.options.fields)this.validateField(a);return this.$submitButton&&this._submit(),this},validateField:function(b){for(var c=this.getFieldElements(b),d=c.attr("type"),e="radio"==d||"checkbox"==d?1:c.length,f=0;e>f;f++)this.validateFieldElement(a(c[f]),1==e);return this},validateFieldElement:function(b,c){var d,e,f=this,g=b.attr("data-bv-field"),h=this.options.fields[g].validators;if(!this.options.fields[g].enabled||this._isExcluded(b))return this;for(d in h){b.data("bv.dfs."+d)&&b.data("bv.dfs."+d).reject();var i=b.data("bv.result."+d);i!=this.STATUS_VALID&&i!=this.STATUS_INVALID&&(b.data("bv.result."+d,this.STATUS_VALIDATING),e=a.fn.bootstrapValidator.validators[d].validate(this,b,h[d]),"object"==typeof e?(c?this.updateStatus(g,this.STATUS_VALIDATING,d):this.updateElementStatus(b,this.STATUS_VALIDATING,d),b.data("bv.dfs."+d,e),e.done(function(a,b,d){a.removeData("bv.dfs."+b),c?f.updateStatus(a.attr("data-bv-field"),d?f.STATUS_VALID:f.STATUS_INVALID,b):f.updateElementStatus(a,d?f.STATUS_VALID:f.STATUS_INVALID,b),d&&1==f._submitIfValid&&f._submit()})):"boolean"==typeof e&&(c?this.updateStatus(g,e?this.STATUS_VALID:this.STATUS_INVALID,d):this.updateElementStatus(b,e?this.STATUS_VALID:this.STATUS_INVALID,d)))}return this},updateStatus:function(b,c,d){for(var e=this.getFieldElements(b),f=e.attr("type"),g="radio"==f||"checkbox"==f?1:e.length,h=0;g>h;h++)this.updateElementStatus(a(e[h]),c,d);return this},updateElementStatus:function(b,c,d){var e=this,f=b.attr("data-bv-field"),g=b.parents(".form-group"),h=b.data("bv.messages"),i=h.find(".help-block[data-bv-validator]"),j=g.find('.form-control-feedback[data-bv-field="'+f+'"]');if(d)b.data("bv.result."+d,c);else for(var k in this.options.fields[f].validators)b.data("bv.result."+k,c);var l,m,n=b.parents(".tab-pane");switch(n&&(l=n.attr("id"))&&(m=a('a[href="#'+l+'"][data-toggle="tab"]').parent()),c){case this.STATUS_VALIDATING:this.disableSubmitButtons(!0),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).addClass(this.options.feedbackIcons.validating).show(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error");break;case this.STATUS_INVALID:this.disableSubmitButtons(!0),g.removeClass("has-success").addClass("has-error"),d?i.filter('[data-bv-validator="'+d+'"]').show():i.show(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.validating).addClass(this.options.feedbackIcons.invalid).show(),m&&m.removeClass("bv-tab-success").addClass("bv-tab-error");break;case this.STATUS_VALID:d?i.filter('[data-bv-validator="'+d+'"]').hide():i.hide();var o=0==i.filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)!=e.STATUS_VALID}).length;this.disableSubmitButtons(o?!1:!0),j&&j.removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).removeClass(this.options.feedbackIcons.valid).addClass(o?this.options.feedbackIcons.valid:this.options.feedbackIcons.invalid).show();var p=function(c){return 0==c.find(".help-block[data-bv-validator]").filter(function(){var c=a(this).css("display"),d=a(this).attr("data-bv-validator");return"block"==c||b.data("bv.result."+d)&&b.data("bv.result."+d)!=e.STATUS_VALID}).length};g.removeClass("has-error has-success").addClass(p(g)?"has-success":"has-error"),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error").addClass(p(n)?"bv-tab-success":"bv-tab-error");break;case this.STATUS_NOT_VALIDATED:default:this.disableSubmitButtons(!1),g.removeClass("has-success").removeClass("has-error"),d?i.filter('.help-block[data-bv-validator="'+d+'"]').hide():i.hide(),j&&j.removeClass(this.options.feedbackIcons.valid).removeClass(this.options.feedbackIcons.invalid).removeClass(this.options.feedbackIcons.validating).hide(),m&&m.removeClass("bv-tab-success").removeClass("bv-tab-error")}return this},isValid:function(){var b,c,d,e,f,g,h,i;for(c in this.options.fields)if(null!=this.options.fields[c]&&this.options.fields[c].enabled)for(b=this.getFieldElements(c),e=b.attr("type"),h="radio"==e||"checkbox"==e?1:b.length,i=0;h>i;i++)if(d=a(b[i]),!this._isExcluded(d))for(g in this.options.fields[c].validators){if(f=d.data("bv.result."+g),f==this.STATUS_NOT_VALIDATED||f==this.STATUS_VALIDATING)return!1;if(f==this.STATUS_INVALID)return this.$invalidField=d,!1}return!0},defaultSubmit:function(){this.$form.off("submit.bv").submit()},resetForm:function(b){var c,d,e,f,g;for(c in this.options.fields){d=this.getFieldElements(c),e=d.length;for(var h=0;e>h;h++)for(g in this.options.fields[c].validators)a(d[h]).removeData("bv.dfs."+g);this.updateStatus(c,this.STATUS_NOT_VALIDATED,null),b&&(f=d.attr("type"),"radio"==f||"checkbox"==f?d.removeAttr("checked").removeAttr("selected"):d.val(""))}return this.$invalidField=null,this.$submitButton=null,this.disableSubmitButtons(!1),this},enableFieldValidators:function(a,b){return this.options.fields[a].enabled=b,this.updateStatus(a,this.STATUS_NOT_VALIDATED,null),this}},a.fn.bootstrapValidator=function(c,d){return this.each(function(){var e=a(this),f=e.data("bootstrapValidator"),g="object"==typeof c&&c;f||(f=new b(this,g),e.data("bootstrapValidator",f)),"string"==typeof c&&f[c](d)})},a.fn.bootstrapValidator.validators={},a.fn.bootstrapValidator.Constructor=b,a.fn.bootstrapValidator.helpers={luhn:function(a){for(var b=a.length,c=0,d=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],e=0;b--;)e+=d[c][parseInt(a.charAt(b),10)],c^=1;return e%10===0&&e>0},mod_11_10:function(a){for(var b=5,c=a.length,d=0;c>d;d++)b=(2*(b||10)%11+parseInt(a.charAt(d),10))%10;return 1==b},mod_37_36:function(a,b){b=b||"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";for(var c=b.length,d=a.length,e=Math.floor(c/2),f=0;d>f;f++)e=(2*(e||c)%(c+1)+b.indexOf(a.charAt(f)))%c;return 1==e}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.base64={validate:function(a,b){var c=b.val();return""==c?!0:/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{4})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.between={html5Attributes:{message:"message",min:"min",max:"max",inclusive:"inclusive"},enableByHtml5:function(a){return"range"==a.attr("type")?{min:a.attr("min"),max:a.attr("max")}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.min&&d<c.max:d>=c.min&&d<=c.max)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.callback={validate:function(b,c,d){var e=c.val();if(d.callback&&"function"==typeof d.callback){var f=new a.Deferred;return f.resolve(c,"callback",d.callback.call(this,e,b)),f}return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.choice={html5Attributes:{message:"message",min:"min",max:"max"},validate:function(a,b,c){var d=b.is("select")?a.getFieldElements(b.attr("data-bv-field")).find("option").filter(":selected").length:a.getFieldElements(b.attr("data-bv-field")).filter(":checked").length;return c.min&&d<c.min||c.max&&d>c.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.creditCard={validate:function(b,c){var d=c.val();if(""==d)return!0;if(/[^0-9-\s]+/.test(d))return!1;if(d=d.replace(/\D/g,""),!a.fn.bootstrapValidator.helpers.luhn(d))return!1;var e,f,g={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}};for(e in g)for(f in g[e].prefix)if(d.substr(0,g[e].prefix[f].length)==g[e].prefix[f]&&-1!=g[e].length.indexOf(d.length))return!0;return!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.cvv={html5Attributes:{message:"message",ccfield:"creditCardField"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;if(!/^[0-9]{3,4}$/.test(d))return!1;if(!c.creditCardField)return!0;var e=a.getFieldElements(c.creditCardField).val();if(""==e)return!0;var f,g,h={AMERICAN_EXPRESS:{length:[15],prefix:["34","37"]},DINERS_CLUB:{length:[14],prefix:["300","301","302","303","304","305","36"]},DINERS_CLUB_US:{length:[16],prefix:["54","55"]},DISCOVER:{length:[16],prefix:["6011","622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925","644","645","646","647","648","649","65"]},JCB:{length:[16],prefix:["3528","3529","353","354","355","356","357","358"]},LASER:{length:[16,17,18,19],prefix:["6304","6706","6771","6709"]},MAESTRO:{length:[12,13,14,15,16,17,18,19],prefix:["5018","5020","5038","6304","6759","6761","6762","6763","6764","6765","6766"]},MASTERCARD:{length:[16],prefix:["51","52","53","54","55"]},SOLO:{length:[16,18,19],prefix:["6334","6767"]},UNIONPAY:{length:[16,17,18,19],prefix:["622126","622127","622128","622129","62213","62214","62215","62216","62217","62218","62219","6222","6223","6224","6225","6226","6227","6228","62290","62291","622920","622921","622922","622923","622924","622925"]},VISA:{length:[16],prefix:["4"]}},i=null;for(f in h)for(g in h[f].prefix)if(e.substr(0,h[f].prefix[g].length)==h[f].prefix[g]&&-1!=h[f].length.indexOf(e.length)){i=f;break}return null==i?!1:"AMERICAN_EXPRESS"==i?4==d.length:3==d.length}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.date={html5Attributes:{message:"message",format:"format"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;c.format=c.format||"MM/DD/YYYY";var e=c.format.split(" "),f=e[0],g=e.length>1?e[1]:null,h=e.length>2?e[2]:null,i=d.split(" "),j=i[0],k=i.length>1?i[1]:null;if(e.length!=i.length)return!1;var l=-1!=j.indexOf("/")?"/":-1!=j.indexOf("-")?"-":null;if(null==l)return!1;j=j.split(l),f=f.split(l);var m=j[f.indexOf("YYYY")],n=j[f.indexOf("MM")],o=j[f.indexOf("DD")],p=null,q=null,r=null;if(g){if(g=g.split(":"),k=k.split(":"),g.length!=k.length)return!1;if(q=k.length>0?k[0]:null,p=k.length>1?k[1]:null,r=k.length>2?k[2]:null,r&&(r=parseInt(r,10),0>r||r>60))return!1;if(q&&(q=parseInt(q,10),0>q||q>=24||h&&q>12))return!1;if(p&&(p=parseInt(p,10),0>p||p>59))return!1}if(o=parseInt(o,10),n=parseInt(n,10),m=parseInt(m,10),1e3>m||m>9999||0==n||n>12)return!1;var s=[31,28,31,30,31,30,31,31,30,31,30,31];return(m%400==0||m%100!=0&&m%4==0)&&(s[1]=29),o>0&&o<=s[n-1]}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.different={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d!=e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"different"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.digits={validate:function(a,b){var c=b.val();return""==c?!0:/^\d+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ean={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^(\d{8}|\d{12}|\d{13})$/.test(c))return!1;for(var d=c.length,e=0,f=8==d?[3,1]:[1,3],g=0;d-1>g;g++)e+=parseInt(c.charAt(g))*f[g%2];return e=10-e%10,e==c.charAt(d-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.emailAddress={enableByHtml5:function(a){return"email"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.file={html5Attributes:{extension:"extension",maxsize:"maxSize",message:"message",type:"type"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e,f=c.extension?c.extension.split(","):null,g=c.type?c.type.split(","):null,h=window.File&&window.FileList&&window.FileReader;if(h)for(var i=b.get(0).files,j=i.length,k=0;j>k;k++){if(c.maxSize&&i[k].size>parseInt(c.maxSize))return!1;if(e=i[k].name.substr(i[k].name.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;if(g&&-1==g.indexOf(i[k].type))return!1}else if(e=d.substr(d.lastIndexOf(".")+1),f&&-1==f.indexOf(e))return!1;return!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.greaterThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("min");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!0?d>c.value:d>=c.value)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.grid={validate:function(b,c){var d=c.val();return""==d?!0:(d=d.toUpperCase(),/^[GRID:]*([0-9A-Z]{2})[-\s]*([0-9A-Z]{5})[-\s]*([0-9A-Z]{10})[-\s]*([0-9A-Z]{1})$/g.test(d)?(d=d.replace(/\s/g,"").replace(/-/g,""),"GRID:"==d.substr(0,5)&&(d=d.substr(5)),a.fn.bootstrapValidator.helpers.mod_37_36(d)):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hex={validate:function(a,b){var c=b.val();return""==c?!0:/^[0-9a-fA-F]+$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.hexColor={enableByHtml5:function(a){return"color"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.iban={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e={AD:"AD[0-9]{2}[0-9]{4}[0-9]{4}[A-Z0-9]{12}",AE:"AE[0-9]{2}[0-9]{3}[0-9]{16}",AL:"AL[0-9]{2}[0-9]{8}[A-Z0-9]{16}",AO:"AO[0-9]{2}[0-9]{21}",AT:"AT[0-9]{2}[0-9]{5}[0-9]{11}",AZ:"AZ[0-9]{2}[A-Z]{4}[A-Z0-9]{20}",BA:"BA[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{8}[0-9]{2}",BE:"BE[0-9]{2}[0-9]{3}[0-9]{7}[0-9]{2}",BF:"BF[0-9]{2}[0-9]{23}",BG:"BG[0-9]{2}[A-Z]{4}[0-9]{4}[0-9]{2}[A-Z0-9]{8}",BH:"BH[0-9]{2}[A-Z]{4}[A-Z0-9]{14}",BI:"BI[0-9]{2}[0-9]{12}",BJ:"BJ[0-9]{2}[A-Z]{1}[0-9]{23}",BR:"BR[0-9]{2}[0-9]{8}[0-9]{5}[0-9]{10}[A-Z][A-Z0-9]",CH:"CH[0-9]{2}[0-9]{5}[A-Z0-9]{12}",CI:"CI[0-9]{2}[A-Z]{1}[0-9]{23}",CM:"CM[0-9]{2}[0-9]{23}",CR:"CR[0-9]{2}[0-9]{3}[0-9]{14}",CV:"CV[0-9]{2}[0-9]{21}",CY:"CY[0-9]{2}[0-9]{3}[0-9]{5}[A-Z0-9]{16}",CZ:"CZ[0-9]{2}[0-9]{20}",DE:"DE[0-9]{2}[0-9]{8}[0-9]{10}",DK:"DK[0-9]{2}[0-9]{14}",DO:"DO[0-9]{2}[A-Z0-9]{4}[0-9]{20}",DZ:"DZ[0-9]{2}[0-9]{20}",EE:"EE[0-9]{2}[0-9]{2}[0-9]{2}[0-9]{11}[0-9]{1}",ES:"ES[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{1}[0-9]{1}[0-9]{10}",FI:"FI[0-9]{2}[0-9]{6}[0-9]{7}[0-9]{1}",FO:"FO[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",FR:"FR[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",GB:"GB[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",GE:"GE[0-9]{2}[A-Z]{2}[0-9]{16}",GI:"GI[0-9]{2}[A-Z]{4}[A-Z0-9]{15}",GL:"GL[0-9]{2}[0-9]{4}[0-9]{9}[0-9]{1}",GR:"GR[0-9]{2}[0-9]{3}[0-9]{4}[A-Z0-9]{16}",GT:"GT[0-9]{2}[A-Z0-9]{4}[A-Z0-9]{20}",HR:"HR[0-9]{2}[0-9]{7}[0-9]{10}",HU:"HU[0-9]{2}[0-9]{3}[0-9]{4}[0-9]{1}[0-9]{15}[0-9]{1}",IE:"IE[0-9]{2}[A-Z]{4}[0-9]{6}[0-9]{8}",IL:"IL[0-9]{2}[0-9]{3}[0-9]{3}[0-9]{13}",IR:"IR[0-9]{2}[0-9]{22}",IS:"IS[0-9]{2}[0-9]{4}[0-9]{2}[0-9]{6}[0-9]{10}",IT:"IT[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",JO:"JO[0-9]{2}[A-Z]{4}[0-9]{4}[0]{8}[A-Z0-9]{10}",KW:"KW[0-9]{2}[A-Z]{4}[0-9]{22}",KZ:"KZ[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LB:"LB[0-9]{2}[0-9]{4}[A-Z0-9]{20}",LI:"LI[0-9]{2}[0-9]{5}[A-Z0-9]{12}",LT:"LT[0-9]{2}[0-9]{5}[0-9]{11}",LU:"LU[0-9]{2}[0-9]{3}[A-Z0-9]{13}",LV:"LV[0-9]{2}[A-Z]{4}[A-Z0-9]{13}",MC:"MC[0-9]{2}[0-9]{5}[0-9]{5}[A-Z0-9]{11}[0-9]{2}",MD:"MD[0-9]{2}[A-Z0-9]{20}",ME:"ME[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",MG:"MG[0-9]{2}[0-9]{23}",MK:"MK[0-9]{2}[0-9]{3}[A-Z0-9]{10}[0-9]{2}",ML:"ML[0-9]{2}[A-Z]{1}[0-9]{23}",MR:"MR13[0-9]{5}[0-9]{5}[0-9]{11}[0-9]{2}",MT:"MT[0-9]{2}[A-Z]{4}[0-9]{5}[A-Z0-9]{18}",MU:"MU[0-9]{2}[A-Z]{4}[0-9]{2}[0-9]{2}[0-9]{12}[0-9]{3}[A-Z]{3}",MZ:"MZ[0-9]{2}[0-9]{21}",NL:"NL[0-9]{2}[A-Z]{4}[0-9]{10}",NO:"NO[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{1}",PK:"PK[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",PL:"PL[0-9]{2}[0-9]{8}[0-9]{16}",PS:"PS[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",PT:"PT[0-9]{2}[0-9]{4}[0-9]{4}[0-9]{11}[0-9]{2}",QA:"QA[0-9]{2}[A-Z]{4}[A-Z0-9]{21}",RO:"RO[0-9]{2}[A-Z]{4}[A-Z0-9]{16}",RS:"RS[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",SA:"SA[0-9]{2}[0-9]{2}[A-Z0-9]{18}",SE:"SE[0-9]{2}[0-9]{3}[0-9]{16}[0-9]{1}",SI:"SI[0-9]{2}[0-9]{5}[0-9]{8}[0-9]{2}",SK:"SK[0-9]{2}[0-9]{4}[0-9]{6}[0-9]{10}",SM:"SM[0-9]{2}[A-Z]{1}[0-9]{5}[0-9]{5}[A-Z0-9]{12}",SN:"SN[0-9]{2}[A-Z]{1}[0-9]{23}",TN:"TN59[0-9]{2}[0-9]{3}[0-9]{13}[0-9]{2}",TR:"TR[0-9]{2}[0-9]{5}[A-Z0-9]{1}[A-Z0-9]{16}",VG:"VG[0-9]{2}[A-Z]{4}[0-9]{16}"};d=d.replace(/[^a-zA-Z0-9]/g,"").toUpperCase();var f=c.country||d.substr(0,2);if(!e[f])return!1;if(!new RegExp("^"+e[f]+"$").test(d))return!1;d=d.substr(4)+d.substr(0,4),d=d.split("").map(function(a){var b=a.charCodeAt(0);return b>="A".charCodeAt(0)&&b<="Z".charCodeAt(0)?b-"A".charCodeAt(0)+10:a}).join("");for(var g=parseInt(d.substr(0,1),10),h=d.length,i=1;h>i;++i)g=(10*g+parseInt(d.substr(i,1),10))%97;return 1==g}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.identical={html5Attributes:{message:"message",field:"field"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=a.getFieldElements(c.field);return null==e?!0:d==e.val()?(a.updateStatus(c.field,a.STATUS_VALID,"identical"),!0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.imei={validate:function(b,c){var d=c.val();if(""==d)return!0;switch(!0){case/^\d{15}$/.test(d):case/^\d{2}-\d{6}-\d{6}-\d{1}$/.test(d):case/^\d{2}\s\d{6}\s\d{6}\s\d{1}$/.test(d):return d=d.replace(/[^0-9]/g,""),a.fn.bootstrapValidator.helpers.luhn(d);case/^\d{14}$/.test(d):case/^\d{16}$/.test(d):case/^\d{2}-\d{6}-\d{6}(|-\d{2})$/.test(d):case/^\d{2}\s\d{6}\s\d{6}(|\s\d{2})$/.test(d):return!0;default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.integer={enableByHtml5:function(a){return"number"==a.attr("type")},validate:function(a,b){var c=b.val();return""==c?!0:/^(?:-?(?:0|[1-9][0-9]*))$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ip={html5Attributes:{message:"message",ipv4:"ipv4",ipv6:"ipv6"},validate:function(b,c,d){var e=c.val();return""==e?!0:(d=a.extend({},{ipv4:!0,ipv6:!0},d),d.ipv4?/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test(e):d.ipv6?/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(str):!1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.isbn={validate:function(a,b){var c=b.val();if(""==c)return!0;var d;switch(!0){case/^\d{9}[\dX]$/.test(c):case 13==c.length&&/^(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 13==c.length&&/^(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN10";break;case/^(978|979)\d{9}[\dX]$/.test(c):case 17==c.length&&/^(978|979)-(\d+)-(\d+)-(\d+)-([\dX])$/.test(c):case 17==c.length&&/^(978|979)\s(\d+)\s(\d+)\s(\d+)\s([\dX])$/.test(c):d="ISBN13";break;default:return!1}c=c.replace(/[^0-9X]/gi,"");var e,f=c.split(""),g=f.length,h=0;switch(d){case"ISBN10":h=0;for(var i=0;g-1>i;i++)h+=(10-i)*parseInt(f[i]);return e=11-h%11,11==e?e=0:10==e&&(e="X"),e+""==f[g-1];case"ISBN13":h=0;for(var i=0;g-1>i;i++)h+=i%2==0?parseInt(f[i]):3*parseInt(f[i]);return e=10-h%10,10==e&&(e="0"),e+""==f[g-1];default:return!1}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.ismn={validate:function(a,b){var c=b.val();if(""==c)return!0;var d;switch(!0){case/^M\d{9}$/.test(c):case/^M-\d{4}-\d{4}-\d{1}$/.test(c):case/^M\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN10";break;case/^9790\d{9}$/.test(c):case/^979-0-\d{4}-\d{4}-\d{1}$/.test(c):case/^979\s0\s\d{4}\s\d{4}\s\d{1}$/.test(c):d="ISMN13";break;default:return!1}"ISMN10"==d&&(c="9790"+c.substr(1)),c=c.replace(/[^0-9]/gi,"");for(var e=c.length,f=0,g=[1,3],h=0;e-1>h;h++)f+=parseInt(c.charAt(h))*g[h%2];return f=10-f%10,f==c.charAt(e-1)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.issn={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^\d{4}\-\d{3}[\dX]$/.test(c))return!1;c=c.replace(/[^0-9X]/gi,"");var d=c.split(""),e=d.length,f=0;"X"==d[7]&&(d[7]=10);for(var g=0;e>g;g++)f+=(8-g)*parseInt(d[g]);return f%11==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.lessThan={html5Attributes:{message:"message",value:"value",inclusive:"inclusive"},enableByHtml5:function(a){var b=a.attr("max");return b?{value:b}:!1},validate:function(a,b,c){var d=b.val();return""==d?!0:(d=parseFloat(d),c.inclusive===!1?d<=c.value:d<c.value)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.mac={validate:function(a,b){var c=b.val();return""==c?!0:/^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$/.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.notEmpty={enableByHtml5:function(a){var b=a.attr("required")+"";return"required"==b||"true"==b},validate:function(b,c){var d=c.attr("type");return"radio"==d||"checkbox"==d?b.getFieldElements(c.attr("data-bv-field")).filter(":checked").length>0:""!=a.trim(c.val())}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.numeric={validate:function(a,b){var c=b.val();return""==c?!0:!isNaN(parseFloat(c))&&isFinite(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.phone={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"US":default:return d=d.replace(/\D/g,""),/^(?:(1\-?)|(\+1 ?))?\(?(\d{3})[\)\-\.]?(\d{3})[\-\.]?(\d{4})$/.test(d)&&10==d.length}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.regexp={html5Attributes:{message:"message",regexp:"regexp"},enableByHtml5:function(a){var b=a.attr("pattern");return b?{regexp:b}:!1},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e="string"==typeof c.regexp?new RegExp(c.regexp):c.regexp;return e.test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.remote={html5Attributes:{message:"message",url:"url",name:"name"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=c.attr("data-bv-field"),g=d.data;null==g&&(g={}),"function"==typeof g&&(g=g.call(this,b)),g[d.name||f]=e;var h=new a.Deferred,i=a.ajax({type:"POST",url:d.url,dataType:"json",data:g});return i.then(function(a){h.resolve(c,"remote",a.valid===!0||"true"===a.valid)}),h.fail(function(){i.abort()}),h}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siren={validate:function(b,c){var d=c.val();return""==d?!0:/^\d{9}$/.test(d)?a.fn.bootstrapValidator.helpers.luhn(d):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.siret={validate:function(a,b){var c=b.val();if(""==c)return!0;for(var d,e=0,f=c.length,g=0;f>g;g++)d=parseInt(c.charAt(g),10),g%2==0&&(d=2*d,d>9&&(d-=9)),e+=d;return e%10==0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.step={html5Attributes:{message:"message",base:"baseValue",step:"step"},validate:function(b,c,d){var e=c.val();if(""==e)return!0;if(d=a.extend({},{baseValue:0,step:1},d),e=parseFloat(e),isNaN(e)||!isFinite(e))return!1;var f=function(a,b){var c=Math.pow(10,b);a*=c;var d=a>0|-(0>a),e=a%1===.5*d;return e?(Math.floor(a)+(d>0))/c:Math.round(a)/c},g=function(a,b){if(0==b)return 1;var c=(a+"").split("."),d=(b+"").split("."),e=(1==c.length?0:c[1].length)+(1==d.length?0:d[1].length);return f(a-b*Math.floor(a/b),e)},h=g(e-d.baseValue,d.step);return 0==h||h==d.step}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringCase={html5Attributes:{message:"message","case":"case"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=(c["case"]||"lower").toLowerCase();switch(e){case"upper":return d===d.toUpperCase();case"lower":default:return d===d.toLowerCase() -}}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.stringLength={html5Attributes:{message:"message",min:"min",max:"max"},enableByHtml5:function(a){var b=a.attr("maxlength");return b?{max:parseInt(b,10)}:!1},validate:function(b,c,d){var e=c.val();if(""==e)return!0;var f=a.trim(e).length;return d.min&&f<d.min||d.max&&f>d.max?!1:!0}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uri={enableByHtml5:function(a){return"url"==a.attr("type")},validate:function(a,b){var c=b.val();if(""==c)return!0;var d=new RegExp("^(?:(?:https?|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))(?::\\d{2,5})?(?:/[^\\s]*)?$","i");return d.test(c)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.uuid={html5Attributes:{message:"message",version:"version"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e={3:/^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,4:/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,5:/^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,all:/^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i},f=c.version?c.version+"":"all";return null==e[f]?!0:e[f].test(d)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vat={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d)return!0;var e=c.country||d.substr(0,2),f=["_",e.toLowerCase()].join("");return this[f]&&"function"==typeof this[f]?this[f](d):!0},_at:function(a){if(!/^ATU[0-9]{8}$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[1,2,1,2,1,2,1],d=0,e=0;7>e;e++)d=parseInt(a.charAt(e))*c[e],d>9&&(d=Math.floor(d/10)+d%10),b+=d;return b=10-(b+4)%10,10==b&&(b=0),b==a.substr(7,1)},_be:function(a){if(!/^BE[0]{0,1}[0-9]{9}$/.test(a))return!1;if(a=a.substr(2),9==a.length&&(a="0"+a),0==a.substr(1,1))return!1;var b=parseInt(a.substr(0,8),10)+parseInt(a.substr(8,2),10);return b%97==0},_bg:function(a){if(!/^BG[0-9]{9,10}$/.test(a))return!1;a=a.substr(2);var b=0,c=0;if(9==a.length){for(c=0;8>c;c++)b+=parseInt(a.charAt(c))*(c+1);if(b%=11,10==b)for(b=0,c=0;8>c;c++)b+=parseInt(a.charAt(c))*(c+3);return b%=10,b==a.substr(8)}if(10==a.length){var d=function(a){var b=parseInt(a.substr(0,2),10)+1900,c=parseInt(a.substr(2,2),10),d=parseInt(a.substr(4,2),10);c>40?(b+=100,c-=40):c>20&&(b-=100,c-=20);try{{new Date(b,c,d)}}catch(e){return!1}for(var f=0,g=[2,4,8,5,10,9,7,3,6],h=0;9>h;h++)f+=parseInt(a.charAt(h))*g[h];return f=f%11%10,f==a.substr(9,1)},e=function(a){for(var b=0,c=[21,19,17,13,11,9,7,3,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=10,b==a.substr(9,1)},f=function(a){for(var b=0,c=[4,3,2,7,6,5,4,3,2],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(9,1))};return d(a)||e(a)||f(a)}return!1},_ch:function(a){if(!/^CHE[0-9]{9}(MWST)?$/.test(a))return!1;a=a.substr(3);for(var b=0,c=[5,4,3,2,7,6,5,4],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b=11-b%11,10==b?!1:(11==b&&(b=0),b==a.substr(8,1))},_cy:function(a){if(!/^CY[0-5|9]{1}[0-9]{7}[A-Z]{1}$/.test(a))return!1;if(a=a.substr(2),"12"==a.substr(0,2))return!1;for(var b=0,c={0:1,1:0,2:5,3:7,4:9,5:13,6:15,7:17,8:19,9:21},d=0;8>d;d++){var e=parseInt(a.charAt(d),10);d%2==0&&(e=c[e+""]),b+=e}return b="ABCDEFGHIJKLMNOPQRSTUVWXYZ"[b%26],b==a.substr(8,1)},_cz:function(a){if(!/^CZ[0-9]{8,10}$/.test(a))return!1;a=a.substr(2);var b=0,c=0;if(8==a.length){if(a.charAt(0)+""=="9")return!1;for(b=0,c=0;7>c;c++)b+=parseInt(a.charAt(c),10)*(8-c);return b=11-b%11,10==b&&(b=0),11==b&&(b=1),b==a.substr(7,1)}if(9==a.length&&a.charAt(0)+""=="6"){for(b=0,c=0;7>c;c++)b+=parseInt(a.charAt(c+1),10)*(8-c);return b=11-b%11,10==b&&(b=0),11==b&&(b=1),b=[8,7,6,5,4,3,2,1,0,9,10][b-1],b==a.substr(8,1)}if(9==a.length||10==a.length){var d=1900+parseInt(a.substr(0,2)),e=parseInt(a.substr(2,2))%50%20,f=parseInt(a.substr(4,2));if(9==a.length){if(d>=1980&&(d-=100),d>1953)return!1}else 1954>d&&(d+=100);try{{new Date(d,e,f)}}catch(g){return!1}if(10==a.length){var h=parseInt(a.substr(0,9),10)%11;return 1985>d&&(h%=10),h==a.substr(9,1)}return!0}return!1},_de:function(b){return/^DE[0-9]{9}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_dk:function(a){if(!/^DK[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[2,7,6,5,4,3,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d),10)*c[d];return b%11==0},_ee:function(a){if(!/^EE[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,7,1,3,7,1,3,7,1],d=0;9>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_es:function(a){if(!/^ES[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(a))return!1;a=a.substr(2);var b=function(a){var b=parseInt(a.substr(0,8),10);return b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},c=function(a){var b=["XYZ".indexOf(a.charAt(0)),a.substr(1)].join("");return b=parseInt(b,10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1)},d=function(a){var b,c=a.charAt(0);if(-1!="KLM".indexOf(c))return b=parseInt(a.substr(1,8),10),b="TRWAGMYFPDXBNJZSQVHLCKE"[b%23],b==a.substr(8,1);if(-1!="ABCDEFGHJNPQRSUVW".indexOf(c)){for(var d=0,e=[2,1,2,1,2,1,2],f=0,g=0;7>g;g++)f=parseInt(a.charAt(g+1))*e[g],f>9&&(f=Math.floor(f/10)+f%10),d+=f;return d=10-d%10,d==a.substr(8,1)||"JABCDEFGHI"[d]==a.substr(8,1)}return!1},e=a.charAt(0);return/^[0-9]$/.test(e)?b(a):/^[XYZ]$/.test(e)?c(a):d(a)},_fi:function(a){if(!/^FI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[7,9,10,5,8,4,2,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_fr:function(b){if(!/^FR[0-9A-Z]{2}[0-9]{9}$/.test(b))return!1;if(b=b.substr(2),!a.fn.bootstrapValidator.helpers.luhn(b.substr(2)))return!1;if(/^[0-9]{2}$/.test(b.substr(0,2)))return b.substr(0,2)==parseInt(b.substr(2)+"12",10)%97;var c,d="0123456789ABCDEFGHJKLMNPQRSTUVWXYZ";return c=/^[0-9]{1}$/.test(b.charAt(0))?24*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-10:34*d.indexOf(b.charAt(0))+d.indexOf(b.charAt(1))-100,(parseInt(b.substr(2),10)+1+Math.floor(c/11))%11==c%11},_gb:function(a){if(!(/^GB[0-9]{9}$/.test(a)||/^GB[0-9]{12}$/.test(a)||/^GBGD[0-9]{3}$/.test(a)||/^GBHA[0-9]{3}$/.test(a)||/^GB(GD|HA)8888[0-9]{5}$/.test(a)))return!1;a=a.substr(2);var b=a.length;if(5==b){var c=a.substr(0,2),d=parseInt(a.substr(2));return"GD"==c&&500>d||"HA"==c&&d>=500}if(11==b&&("GD8888"==a.substr(0,6)||"HA8888"==a.substr(0,6)))return"GD"==a.substr(0,2)&&parseInt(a.substr(6,3))>=500||"HA"==a.substr(0,2)&&parseInt(a.substr(6,3))<500?!1:parseInt(a.substr(6,3))%97==parseInt(a.substr(9,2));if(9==b||12==b){for(var e=0,f=[8,7,6,5,4,3,2,10,1],g=0;9>g;g++)e+=parseInt(a.charAt(g))*f[g];return e%=97,parseInt(a.substr(0,3))>=100?0==e||42==e||55==e:0==e}return!0},_gr:function(a){if(!/^GR[0-9]{9}$/.test(a))return!1;a=a.substr(2),8==a.length&&(a="0"+a);for(var b=0,c=[256,128,64,32,16,8,4,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=b%11%10,b==a.substr(8,1)},_el:function(a){return/^EL[0-9]{9}$/.test(a)?(a="GR"+a.substr(2),this._gr(a)):!1},_hu:function(a){if(!/^HU[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,7,3,1,9,7,3,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%10==0},_hr:function(b){return/^HR[0-9]{11}$/.test(b)?(b=b.substr(2),a.fn.bootstrapValidator.helpers.mod_11_10(b)):!1},_ie:function(a){if(!/^IE[0-9]{1}[0-9A-Z\*\+]{1}[0-9]{5}[A-Z]{1,2}$/.test(a))return!1;a=a.substr(2);var b=function(a){for(;a.length<7;)a="0"+a;for(var b="WABCDEFGHIJKLMNOPQRSTUV",c=0,d=0;7>d;d++)c+=parseInt(a.charAt(d))*(8-d);return c+=9*b.indexOf(a.substr(7)),b[c%23]};return/^[0-9]+$/.test(a.substr(0,7))?a.charAt(7)==b(a.substr(0,7)+a.substr(8)+""):-1!="ABCDEFGHIJKLMNOPQRSTUVWXYZ+*".indexOf(a.charAt(1))?a.charAt(7)==b(a.substr(2,5)+a.substr(0,1)+""):!0},_it:function(b){if(!/^IT[0-9]{11}$/.test(b))return!1;if(b=b.substr(2),0==parseInt(b.substr(0,7)))return!1;var c=parseInt(b.substr(7,3));return 1>c||c>201&&999!=c&&888!=c?!1:a.fn.bootstrapValidator.helpers.luhn(b)},_lt:function(a){if(!/^LT([0-9]{7}1[0-9]{1}|[0-9]{10}1[0-9]{1})$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=0,d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+d%9);var e=c%11;if(10==e){c=0;for(var d=0;b-1>d;d++)c+=parseInt(a.charAt(d))*(1+(d+2)%9)}return e=e%11%10,e==a.charAt(b-1)},_lu:function(a){return/^LU[0-9]{8}$/.test(a)?(a=a.substr(2),a.substr(0,6)%89==a.substr(6,2)):!1},_lv:function(a){if(!/^LV[0-9]{11}$/.test(a))return!1;a=a.substr(2);var b=parseInt(a.charAt(0)),c=0,d=[],e=0,f=a.length;if(b>3){for(c=0,d=[9,1,4,8,3,10,2,5,7,6,1],e=0;f>e;e++)c+=parseInt(a.charAt(e))*d[e];return c%=11,3==c}var g=parseInt(a.substr(0,2)),h=parseInt(a.substr(2,2)),i=parseInt(a.substr(4,2));i=i+1800+100*parseInt(a.charAt(6));try{{new Date(i,h,g)}}catch(j){return!1}for(c=0,d=[10,5,8,4,2,1,6,3,7,9],e=0;f-1>e;e++)c+=parseInt(a.charAt(e))*d[e];return c=(c+1)%11%10,c==a.charAt(f-1)},_mt:function(a){if(!/^MT[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,4,6,7,8,9,10,1],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%37==0},_nl:function(a){if(!/^NL[0-9]{9}B[0-9]{2}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b=0),b==a.substr(8,1)},_no:function(a){if(!/^NO[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[3,2,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,11==b&&(b=0),b==a.substr(8,1)},_pl:function(a){if(!/^PL[0-9]{10}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[6,5,7,2,3,4,5,6,7,-1],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%11==0},_pt:function(a){if(!/^PT[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[9,8,7,6,5,4,3,2],d=0;8>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,b>9&&(b=0),b==a.substr(8,1)},_ro:function(a){if(!/^RO[1-9][0-9]{1,9}$/.test(a))return!1;a=a.substr(2);for(var b=a.length,c=[7,5,3,2,1,7,5,3,2].slice(10-b),d=0,e=0;b-1>e;e++)d+=parseInt(a.charAt(e))*c[e];return d=10*d%11%10,d==a.substr(b-1,1)},_ru:function(a){if(!/^RU([0-9]{9}|[0-9]{12})$/.test(a))return!1;if(a=a.substr(2),10==a.length){for(var b=0,c=[2,4,10,3,5,9,4,6,8,0],d=0;10>d;d++)b+=parseInt(a.charAt(d))*c[d];return b%=11,b>9&&(b%=10),b==a.substr(9,1)}if(12==a.length){for(var e=0,f=[7,2,4,10,3,5,9,4,6,8,0],g=0,h=[3,7,2,4,10,3,5,9,4,6,8,0],d=0;11>d;d++)e+=parseInt(a.charAt(d))*f[d],g+=parseInt(a.charAt(d))*h[d];return e%=11,e>9&&(e%=10),g%=11,g>9&&(g%=10),e==a.substr(10,1)&&g==a.substr(11,1)}return!1},_rs:function(a){if(!/^RS[0-9]{9}$/.test(a))return!1;a=a.substr(2);for(var b=10,c=0,d=0;8>d;d++)c=(parseInt(a.charAt(d))+b)%10,0==c&&(c=10),b=2*c%11;return(b+parseInt(a.substr(8,1)))%10==1},_se:function(b){return/^SE[0-9]{10}01$/.test(b)?(b=b.substr(2,10),a.fn.bootstrapValidator.helpers.luhn(b)):!1},_si:function(a){if(!/^SI[0-9]{8}$/.test(a))return!1;a=a.substr(2);for(var b=0,c=[8,7,6,5,4,3,2],d=0;7>d;d++)b+=parseInt(a.charAt(d))*c[d];return b=11-b%11,10==b&&(b=0),b==a.substr(7,1)},_sk:function(a){return/^SK[1-9][0-9][(2-4)|(6-9)][0-9]{7}$/.test(a)?(a=a.substr(2),a%11==0):!1}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.vin={validate:function(a,b){var c=b.val();if(""==c)return!0;if(!/^[a-hj-npr-z0-9]{8}[0-9xX][a-hj-npr-z0-9]{8}$/i.test(c))return!1;c=c.toUpperCase();for(var d={A:1,B:2,C:3,D:4,E:5,F:6,G:7,H:8,J:1,K:2,L:3,M:4,N:5,P:7,R:9,S:2,T:3,U:4,V:5,W:6,X:7,Y:8,Z:9,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,0:0},e=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],f=0,g=c.length,h=0;g>h;h++)f+=d[c.charAt(h)+""]*e[h];var i=f%11;return 10==i&&(i="X"),i==c.charAt(8)}}}(window.jQuery),function(a){a.fn.bootstrapValidator.validators.zipCode={html5Attributes:{message:"message",country:"country"},validate:function(a,b,c){var d=b.val();if(""==d||!c.country)return!0;var e=(c.country||"US").toUpperCase();switch(e){case"CA":return/(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}\s?[0-9]{1}(?:A|B|C|E|G|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}/i.test(d);case"DK":return/^(DK(-|\s)?)?\d{4}$/i.test(d);case"GB":return this._gb(d);case"SE":return/^(S-)?\d{3}\s?\d{2}$/i.test(d);case"US":default:return/^\d{4,5}([\-]\d{4})?$/.test(d)}},_gb:function(a){for(var b="[ABCDEFGHIJKLMNOPRSTUWYZ]",c="[ABCDEFGHKLMNOPQRSTUVWXY]",d="[ABCDEFGHJKPMNRSTUVWXY]",e="[ABEHMNPRVWXY]",f="[ABDEFGHJLNPQRSTUWXYZ]",g=[new RegExp("^("+b+"{1}"+c+"?[0-9]{1,2})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}[0-9]{1}"+d+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^("+b+"{1}"+c+"{1}?[0-9]{1}"+e+"{1})(\\s*)([0-9]{1}"+f+"{2})$","i"),new RegExp("^(BF1)(\\s*)([0-6]{1}[ABDEFGHJLNPQRST]{1}[ABDEFGHJLNPQRSTUWZYZ]{1})$","i"),/^(GIR)(\s*)(0AA)$/i,/^(BFPO)(\s*)([0-9]{1,4})$/i,/^(BFPO)(\s*)(c\/o\s*[0-9]{1,3})$/i,/^([A-Z]{4})(\s*)(1ZZ)$/i,/^(AI-2640)$/i],h=0;h<g.length;h++)if(g[h].test(a))return!0;return!1}}}(window.jQuery); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css deleted file mode 100644 index cefa731bec9..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/css/main.css +++ /dev/null @@ -1,8 +0,0 @@ -.validatedField { - float:left; - padding-left:5px; -} - -.fieldLabel { - float:left; -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg deleted file mode 100644 index 811623c73d2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html deleted file mode 100644 index fc6ef3a33fe..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/index.html +++ /dev/null @@ -1,175 +0,0 @@ -<head> -<title></title> -<link rel="stylesheet" href="bootstrap3/css/bootstrap.min.css"> -<link rel="stylesheet" - href="bootstrapvalidator/css/bootstrapValidator.min.css"> -<link rel="stylesheet" - href="css/main.css"> -<script type="text/javascript" src="js/d3.v2.min.js"></script> -<script type="text/javascript" src="js/jquery-1.8.2.min.js"></script> -<script type="text/javascript" src="bootstrap3/js/bootstrap.min.js"></script> -<script type="text/javascript" src="bootstrapvalidator/js/bootstrapValidator.min.js"></script> -<script type="text/javascript" src="js/spin.min.js"></script> -<script type="text/javascript" src="js/openbis.js"></script> -<script type="text/javascript" src="js/openbis-dsu.js"></script> -<script type="text/javascript" src="js/main.js"></script> - -<!-- To speed development, cache the requests --> -<!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> -<script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var vis; - var didCreateVis = false; - var context = new openbisWebAppContext(); - - $(document).ready(function () { - setValidators(); - refresh(); - setInterval(refresh, 600000); - }); - </script> -</head> -<body> - <div class="container"> - <div class="row"> - <div class="col-lg-12"> - - <h2> - Demultiplexing <small>QGF</small> - </h2> - </div> - </div> - </div> - <br> - <div class="container"> - <div class="panel panel-default" id="lanePanel"> - <div class="panel-heading"> - <h3 class="panel-title">Choose Lane</h3> - </div> - <div class="panel-body"> - <div class="container"> - <div class="row"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> <input type="checkbox" id="allLanes"> Analyze all Lanes</label> - </div> - </div> - </div> - </div> - <script type="text/javascript"> - $("#allLanes").change(function() { - if(this.checked) { - $('#laneRange').prop('disabled', true); - }else { - $('#laneRange').prop('disabled', false); - } - }); - </script> - <form class="form-inline validatedField"" role="form" id="laneRangeForm"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Lane Range</span> - <input type="text" class="form-control" id="laneRange" name="laneRange" - placeholder="1-3, 5, 7-8"> - </div> - </div> - </form> - </div> - </div> - <script type="text/javascript"> $('#allLanes').prop('checked', true); $('#laneRange').prop('disabled', true);</script> - - <div class="panel panel-default"> - <div class="panel-heading"> - <h3 class="panel-title">Options</h3> - </div> - <div class="panel-body"> - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="sampleSheet">Recreate Sample Sheet - <span class="help-block">uses latest meta data from openBIS</span> - </label> - </div> - </div> - </div> - </form> - <script type="text/javascript"> $('#sampleSheet').prop('checked', true);</script> - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="failedReads">Include reads which do not pass the Illumina filter - <span class="help-block">Non PF reads are also in the FASTQ file</span> - </label> - </div> - </div> - </div> - </form> - <script type="text/javascript"> $('#failedReads').prop('checked', true);</script> - - <form class="form-inline validatedField"" role="form" id="MismatchesInIndexForm"> - <div class="form-group"> - <div class="input-group"> - <span class="input-group-addon">Allowed Index Mismatch</span> - <input type="text" class="form-control" id="indexMismatch" name="indexMismatch" - placeholder="0" value="0" > - </div> - </div> - </form> - - - <form class="form-horizontal" role="form"> - <div class="form-group"> - <div class="col-sm-10"> - <div class="checkbox"> - <label> - <input type="checkbox" id="email">Send Email when finished - <span class="help-block"> </span> - </label> - </div> - </div> - </div> - </form> - - </div> - </div> - <br> - <p> - <div class="container"> - <div class="row"> - <div class="col-md-3"> - <button class="btn btn-default" type="submit" id="submitBtn" - onclick="callIngestionService('startJob');">Start</button> - <button type="button" class="btn btn-default" onclick="refresh();"> - <span class="glyphicon glyphicon-refresh"></span> Refresh - </button> - </div> - </div> - </div> - </p> - <br> - <!-- Placeholder for the output coming back from the server --> - <div class="container"> - <div class="row"> - <div class="col-lg-12"> - <div id="main"></div> - </div> - </div> - </div> - - <!-- Footer ================================================== --> - - <footer class="bs-footer" role="contentinfo"> - <h6 div class="container"> - <a href="" target="_blank">Powered by ...</a> - </div> - </h6> - </footer> - - -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js deleted file mode 100644 index 0b4ea58fdb3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/d3.v2.min.js +++ /dev/null @@ -1,4 +0,0 @@ -(function(){function e(e,t){try{for(var n in t)Object.defineProperty(e.prototype,n,{value:t[n],enumerable:!1})}catch(r){e.prototype=t}}function t(e){var t=-1,n=e.length,r=[];while(++t<n)r.push(e[t]);return r}function n(e){return Array.prototype.slice.call(e)}function r(){}function i(e){return e}function s(){return this}function o(){return!0}function u(e){return typeof e=="function"?e:function(){return e}}function a(e,t,n){return function(){var r=n.apply(t,arguments);return arguments.length?e:r}}function f(e){return e!=null&&!isNaN(e)}function l(e){return e.length}function c(e){return e==null}function h(e){return e.trim().replace(/\s+/g," ")}function p(e){var t=1;while(e*t%1)t*=10;return t}function d(){}function v(e){function t(){var t=n,r=-1,i=t.length,s;while(++r<i)(s=t[r].on)&&s.apply(this,arguments);return e}var n=[],i=new r;return t.on=function(t,r){var s=i.get(t),o;return arguments.length<2?s&&s.on:(s&&(s.on=null,n=n.slice(0,o=n.indexOf(s)).concat(n.slice(o+1)),i.remove(t)),r&&n.push(i.set(t,{on:r})),e)},t}function m(e,t){return t-(e?1+Math.floor(Math.log(e+Math.pow(10,1+Math.floor(Math.log(e)/Math.LN10)-t))/Math.LN10):1)}function g(e){return e+""}function y(e){var t=e.lastIndexOf("."),n=t>=0?e.substring(t):(t=e.length,""),r=[];while(t>0)r.push(e.substring(t-=3,t+3));return r.reverse().join(",")+n}function b(e,t){var n=Math.pow(10,Math.abs(8-t)*3);return{scale:t>8?function(e){return e/n}:function(e){return e*n},symbol:e}}function w(e){return function(t){return t<=0?0:t>=1?1:e(t)}}function E(e){return function(t){return 1-e(1-t)}}function S(e){return function(t){return.5*(t<.5?e(2*t):2-e(2-2*t))}}function x(e){return e}function T(e){return function(t){return Math.pow(t,e)}}function N(e){return 1-Math.cos(e*Math.PI/2)}function C(e){return Math.pow(2,10*(e-1))}function k(e){return 1-Math.sqrt(1-e*e)}function L(e,t){var n;return arguments.length<2&&(t=.45),arguments.length<1?(e=1,n=t/4):n=t/(2*Math.PI)*Math.asin(1/e),function(r){return 1+e*Math.pow(2,10*-r)*Math.sin((r-n)*2*Math.PI/t)}}function A(e){return e||(e=1.70158),function(t){return t*t*((e+1)*t-e)}}function O(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375}function M(){d3.event.stopPropagation(),d3.event.preventDefault()}function _(){var e=d3.event,t;while(t=e.sourceEvent)e=t;return e}function D(e){var t=new d,n=0,r=arguments.length;while(++n<r)t[arguments[n]]=v(t);return t.of=function(n,r){return function(i){try{var s=i.sourceEvent=d3.event;i.target=e,d3.event=i,t[i.type].apply(n,r)}finally{d3.event=s}}},t}function P(e){var t=[e.a,e.b],n=[e.c,e.d],r=B(t),i=H(t,n),s=B(j(n,t,-i))||0;t[0]*n[1]<n[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,i*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-n[0],n[1]))*ls,this.translate=[e.e,e.f],this.scale=[r,s],this.skew=s?Math.atan2(i,s)*ls:0}function H(e,t){return e[0]*t[0]+e[1]*t[1]}function B(e){var t=Math.sqrt(H(e,e));return t&&(e[0]/=t,e[1]/=t),t}function j(e,t,n){return e[0]+=n*t[0],e[1]+=n*t[1],e}function F(e){return e=="transform"?d3.interpolateTransform:d3.interpolate}function I(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return(n-e)*t}}function q(e,t){return t=t-(e=+e)?1/(t-e):0,function(n){return Math.max(0,Math.min(1,(n-e)*t))}}function R(){}function U(e,t,n){return new z(e,t,n)}function z(e,t,n){this.r=e,this.g=t,this.b=n}function W(e){return e<16?"0"+Math.max(0,e).toString(16):Math.min(255,e).toString(16)}function X(e,t,n){var r=0,i=0,s=0,o,u,a;o=/([a-z]+)\((.*)\)/i.exec(e);if(o){u=o[2].split(",");switch(o[1]){case"hsl":return n(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(K(u[0]),K(u[1]),K(u[2]))}}return(a=ds.get(e))?t(a.r,a.g,a.b):(e!=null&&e.charAt(0)==="#"&&(e.length===4?(r=e.charAt(1),r+=r,i=e.charAt(2),i+=i,s=e.charAt(3),s+=s):e.length===7&&(r=e.substring(1,3),i=e.substring(3,5),s=e.substring(5,7)),r=parseInt(r,16),i=parseInt(i,16),s=parseInt(s,16)),t(r,i,s))}function V(e,t,n){var r=Math.min(e/=255,t/=255,n/=255),i=Math.max(e,t,n),s=i-r,o,u,a=(i+r)/2;return s?(u=a<.5?s/(i+r):s/(2-i-r),e==i?o=(t-n)/s+(t<n?6:0):t==i?o=(n-e)/s+2:o=(e-t)/s+4,o*=60):u=o=0,Q(o,u,a)}function $(e,t,n){e=J(e),t=J(t),n=J(n);var r=ut((.4124564*e+.3575761*t+.1804375*n)/ys),i=ut((.2126729*e+.7151522*t+.072175*n)/bs),s=ut((.0193339*e+.119192*t+.9503041*n)/ws);return nt(116*i-16,500*(r-i),200*(i-s))}function J(e){return(e/=255)<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4)}function K(e){var t=parseFloat(e);return e.charAt(e.length-1)==="%"?Math.round(t*2.55):t}function Q(e,t,n){return new G(e,t,n)}function G(e,t,n){this.h=e,this.s=t,this.l=n}function Y(e,t,n){function r(e){return e>360?e-=360:e<0&&(e+=360),e<60?s+(o-s)*e/60:e<180?o:e<240?s+(o-s)*(240-e)/60:s}function i(e){return Math.round(r(e)*255)}var s,o;return e%=360,e<0&&(e+=360),t=t<0?0:t>1?1:t,n=n<0?0:n>1?1:n,o=n<=.5?n*(1+t):n+t-n*t,s=2*n-o,U(i(e+120),i(e),i(e-120))}function Z(e,t,n){return new et(e,t,n)}function et(e,t,n){this.h=e,this.c=t,this.l=n}function tt(e,t,n){return nt(n,Math.cos(e*=Math.PI/180)*t,Math.sin(e)*t)}function nt(e,t,n){return new rt(e,t,n)}function rt(e,t,n){this.l=e,this.a=t,this.b=n}function it(e,t,n){var r=(e+16)/116,i=r+t/500,s=r-n/200;return i=ot(i)*ys,r=ot(r)*bs,s=ot(s)*ws,U(at(3.2404542*i-1.5371385*r-.4985314*s),at(-0.969266*i+1.8760108*r+.041556*s),at(.0556434*i-.2040259*r+1.0572252*s))}function st(e,t,n){return Z(Math.atan2(n,t)/Math.PI*180,Math.sqrt(t*t+n*n),e)}function ot(e){return e>.206893034?e*e*e:(e-4/29)/7.787037}function ut(e){return e>.008856?Math.pow(e,1/3):7.787037*e+4/29}function at(e){return Math.round(255*(e<=.00304?12.92*e:1.055*Math.pow(e,1/2.4)-.055))}function ft(e){return Qi(e,ks),e}function lt(e){return function(){return Ss(e,this)}}function ct(e){return function(){return xs(e,this)}}function ht(e,t){function n(){this.removeAttribute(e)}function r(){this.removeAttributeNS(e.space,e.local)}function i(){this.setAttribute(e,t)}function s(){this.setAttributeNS(e.space,e.local,t)}function o(){var n=t.apply(this,arguments);n==null?this.removeAttribute(e):this.setAttribute(e,n)}function u(){var n=t.apply(this,arguments);n==null?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,n)}return e=d3.ns.qualify(e),t==null?e.local?r:n:typeof t=="function"?e.local?u:o:e.local?s:i}function pt(e){return new RegExp("(?:^|\\s+)"+d3.requote(e)+"(?:\\s+|$)","g")}function dt(e,t){function n(){var n=-1;while(++n<i)e[n](this,t)}function r(){var n=-1,r=t.apply(this,arguments);while(++n<i)e[n](this,r)}e=e.trim().split(/\s+/).map(vt);var i=e.length;return typeof t=="function"?r:n}function vt(e){var t=pt(e);return function(n,r){if(i=n.classList)return r?i.add(e):i.remove(e);var i=n.className,s=i.baseVal!=null,o=s?i.baseVal:i;r?(t.lastIndex=0,t.test(o)||(o=h(o+" "+e),s?i.baseVal=o:n.className=o)):o&&(o=h(o.replace(t," ")),s?i.baseVal=o:n.className=o)}}function mt(e,t,n){function r(){this.style.removeProperty(e)}function i(){this.style.setProperty(e,t,n)}function s(){var r=t.apply(this,arguments);r==null?this.style.removeProperty(e):this.style.setProperty(e,r,n)}return t==null?r:typeof t=="function"?s:i}function gt(e,t){function n(){delete this[e]}function r(){this[e]=t}function i(){var n=t.apply(this,arguments);n==null?delete this[e]:this[e]=n}return t==null?n:typeof t=="function"?i:r}function yt(e){return{__data__:e}}function bt(e){return function(){return Cs(this,e)}}function wt(e){return arguments.length||(e=d3.ascending),function(t,n){return e(t&&t.__data__,n&&n.__data__)}}function Et(e,t,n){function r(){var t=this[s];t&&(this.removeEventListener(e,t,t.$),delete this[s])}function i(){function i(e){var n=d3.event;d3.event=e,u[0]=o.__data__;try{t.apply(o,u)}finally{d3.event=n}}var o=this,u=arguments;r.call(this),this.addEventListener(e,this[s]=i,i.$=n),i._=t}var s="__on"+e,o=e.indexOf(".");return o>0&&(e=e.substring(0,o)),t?i:r}function St(e,t){for(var n=0,r=e.length;n<r;n++)for(var i=e[n],s=0,o=i.length,u;s<o;s++)(u=i[s])&&t(u,s,n);return e}function xt(e){return Qi(e,As),e}function Tt(e,t,n){Qi(e,Os);var i=new r,s=d3.dispatch("start","end"),o=Fs;return e.id=t,e.time=n,e.tween=function(t,n){return arguments.length<2?i.get(t):(n==null?i.remove(t):i.set(t,n),e)},e.ease=function(t){return arguments.length?(o=typeof t=="function"?t:d3.ease.apply(d3,arguments),e):o},e.each=function(t,n){return arguments.length<2?Nt.call(e,t):(s.on(t,n),e)},d3.timer(function(r){return St(e,function(e,u,a){function f(r){return v.active>t?c():(v.active=t,i.forEach(function(t,n){(n=n.call(e,m,u))&&h.push(n)}),s.start.call(e,m,u),l(r)||d3.timer(l,0,n),1)}function l(n){if(v.active!==t)return c();var r=(n-p)/d,i=o(r),a=h.length;while(a>0)h[--a].call(e,i);if(r>=1)return c(),_s=t,s.end.call(e,m,u),_s=0,1}function c(){return--v.count||delete e.__transition__,1}var h=[],p=e.delay,d=e.duration,v=(e=e.node).__transition__||(e.__transition__={active:0,count:0}),m=e.__data__;++v.count,p<=r?f(r):d3.timer(f,p,n)})},0,n),e}function Nt(e){var t=_s,n=Fs,r=Bs,i=js;return _s=this.id,Fs=this.ease(),St(this,function(t,n,r){Bs=t.delay,js=t.duration,e.call(t=t.node,t.__data__,n,r)}),_s=t,Fs=n,Bs=r,js=i,this}function Ct(e,t,n){return n!=""&&Is}function kt(e,t){return d3.tween(e,F(t))}function Lt(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,e>=n.delay&&(n.flush=n.callback(e)),n=n.next;var r=At()-t;r>24?(isFinite(r)&&(clearTimeout(Ws),Ws=setTimeout(Lt,r)),zs=0):(zs=1,Xs(Lt))}function At(){var e=null,t=Us,n=Infinity;while(t)t.flush?(delete Rs[t.callback.id],t=e?e.next=t.next:Us=t.next):(n=Math.min(n,t.then+t.delay),t=(e=t).next);return n}function Ot(e,t){var n=e.ownerSVGElement||e;if(n.createSVGPoint){var r=n.createSVGPoint();if(Vs<0&&(window.scrollX||window.scrollY)){n=d3.select(document.body).append("svg").style("position","absolute").style("top",0).style("left",0);var i=n[0][0].getScreenCTM();Vs=!i.f&&!i.e,n.remove()}return Vs?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(e.getScreenCTM().inverse()),[r.x,r.y]}var s=e.getBoundingClientRect();return[t.clientX-s.left-e.clientLeft,t.clientY-s.top-e.clientTop]}function Mt(){}function _t(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Dt(e){return e.rangeExtent?e.rangeExtent():_t(e.range())}function Pt(e,t){var n=0,r=e.length-1,i=e[n],s=e[r],o;s<i&&(o=n,n=r,r=o,o=i,i=s,s=o);if(t=t(s-i))e[n]=t.floor(i),e[r]=t.ceil(s);return e}function Ht(){return Math}function Bt(e,t,n,r){function i(){var i=Math.min(e.length,t.length)>2?zt:Ut,a=r?q:I;return o=i(e,t,a,n),u=i(t,e,a,d3.interpolate),s}function s(e){return o(e)}var o,u;return s.invert=function(e){return u(e)},s.domain=function(t){return arguments.length?(e=t.map(Number),i()):e},s.range=function(e){return arguments.length?(t=e,i()):t},s.rangeRound=function(e){return s.range(e).interpolate(d3.interpolateRound)},s.clamp=function(e){return arguments.length?(r=e,i()):r},s.interpolate=function(e){return arguments.length?(n=e,i()):n},s.ticks=function(t){return qt(e,t)},s.tickFormat=function(t){return Rt(e,t)},s.nice=function(){return Pt(e,Ft),i()},s.copy=function(){return Bt(e,t,n,r)},i()}function jt(e,t){return d3.rebind(e,t,"range","rangeRound","interpolate","clamp")}function Ft(e){return e=Math.pow(10,Math.round(Math.log(e)/Math.LN10)-1),e&&{floor:function(t){return Math.floor(t/e)*e},ceil:function(t){return Math.ceil(t/e)*e}}}function It(e,t){var n=_t(e),r=n[1]-n[0],i=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),s=t/r*i;return s<=.15?i*=10:s<=.35?i*=5:s<=.75&&(i*=2),n[0]=Math.ceil(n[0]/i)*i,n[1]=Math.floor(n[1]/i)*i+i*.5,n[2]=i,n}function qt(e,t){return d3.range.apply(d3,It(e,t))}function Rt(e,t){return d3.format(",."+Math.max(0,-Math.floor(Math.log(It(e,t)[2])/Math.LN10+.01))+"f")}function Ut(e,t,n,r){var i=n(e[0],e[1]),s=r(t[0],t[1]);return function(e){return s(i(e))}}function zt(e,t,n,r){var i=[],s=[],o=0,u=Math.min(e.length,t.length)-1;e[u]<e[0]&&(e=e.slice().reverse(),t=t.slice().reverse());while(++o<=u)i.push(n(e[o-1],e[o])),s.push(r(t[o-1],t[o]));return function(t){var n=d3.bisect(e,t,1,u)-1;return s[n](i[n](t))}}function Wt(e,t){function n(n){return e(t(n))}var r=t.pow;return n.invert=function(t){return r(e.invert(t))},n.domain=function(i){return arguments.length?(t=i[0]<0?Vt:Xt,r=t.pow,e.domain(i.map(t)),n):e.domain().map(r)},n.nice=function(){return e.domain(Pt(e.domain(),Ht)),n},n.ticks=function(){var n=_t(e.domain()),i=[];if(n.every(isFinite)){var s=Math.floor(n[0]),o=Math.ceil(n[1]),u=r(n[0]),a=r(n[1]);if(t===Vt){i.push(r(s));for(;s++<o;)for(var f=9;f>0;f--)i.push(r(s)*f)}else{for(;s<o;s++)for(var f=1;f<10;f++)i.push(r(s)*f);i.push(r(s))}for(s=0;i[s]<u;s++);for(o=i.length;i[o-1]>a;o--);i=i.slice(s,o)}return i},n.tickFormat=function(e,i){arguments.length<2&&(i=$s);if(arguments.length<1)return i;var s=Math.max(.1,e/n.ticks().length),o=t===Vt?(u=-1e-12,Math.floor):(u=1e-12,Math.ceil),u;return function(e){return e/r(o(t(e)+u))<=s?i(e):""}},n.copy=function(){return Wt(e.copy(),t)},jt(n,e)}function Xt(e){return Math.log(e<0?0:e)/Math.LN10}function Vt(e){return-Math.log(e>0?0:-e)/Math.LN10}function $t(e,t){function n(t){return e(r(t))}var r=Jt(t),i=Jt(1/t);return n.invert=function(t){return i(e.invert(t))},n.domain=function(t){return arguments.length?(e.domain(t.map(r)),n):e.domain().map(i)},n.ticks=function(e){return qt(n.domain(),e)},n.tickFormat=function(e){return Rt(n.domain(),e)},n.nice=function(){return n.domain(Pt(n.domain(),Ft))},n.exponent=function(e){if(!arguments.length)return t;var s=n.domain();return r=Jt(t=e),i=Jt(1/t),n.domain(s)},n.copy=function(){return $t(e.copy(),t)},jt(n,e)}function Jt(e){return function(t){return t<0?-Math.pow(-t,e):Math.pow(t,e)}}function Kt(e,t){function n(t){return o[((s.get(t)||s.set(t,e.push(t)))-1)%o.length]}function i(t,n){return d3.range(e.length).map(function(e){return t+n*e})}var s,o,u;return n.domain=function(i){if(!arguments.length)return e;e=[],s=new r;var o=-1,u=i.length,a;while(++o<u)s.has(a=i[o])||s.set(a,e.push(a));return n[t.t].apply(n,t.a)},n.range=function(e){return arguments.length?(o=e,u=0,t={t:"range",a:arguments},n):o},n.rangePoints=function(r,s){arguments.length<2&&(s=0);var a=r[0],f=r[1],l=(f-a)/(Math.max(1,e.length-1)+s);return o=i(e.length<2?(a+f)/2:a+l*s/2,l),u=0,t={t:"rangePoints",a:arguments},n},n.rangeBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=(c-l)/(e.length-s+2*a);return o=i(l+h*a,h),f&&o.reverse(),u=h*(1-s),t={t:"rangeBands",a:arguments},n},n.rangeRoundBands=function(r,s,a){arguments.length<2&&(s=0),arguments.length<3&&(a=s);var f=r[1]<r[0],l=r[f-0],c=r[1-f],h=Math.floor((c-l)/(e.length-s+2*a)),p=c-l-(e.length-s)*h;return o=i(l+Math.round(p/2),h),f&&o.reverse(),u=Math.round(h*(1-s)),t={t:"rangeRoundBands",a:arguments},n},n.rangeBand=function(){return u},n.rangeExtent=function(){return _t(t.a[0])},n.copy=function(){return Kt(e,t)},n.domain(e)}function Qt(e,t){function n(){var n=0,s=e.length,o=t.length;i=[];while(++n<o)i[n-1]=d3.quantile(e,n/o);return r}function r(e){return isNaN(e=+e)?NaN:t[d3.bisect(i,e)]}var i;return r.domain=function(t){return arguments.length?(e=t.filter(function(e){return!isNaN(e)}).sort(d3.ascending),n()):e},r.range=function(e){return arguments.length?(t=e,n()):t},r.quantiles=function(){return i},r.copy=function(){return Qt(e,t)},n()}function Gt(e,t,n){function r(t){return n[Math.max(0,Math.min(o,Math.floor(s*(t-e))))]}function i(){return s=n.length/(t-e),o=n.length-1,r}var s,o;return r.domain=function(n){return arguments.length?(e=+n[0],t=+n[n.length-1],i()):[e,t]},r.range=function(e){return arguments.length?(n=e,i()):n},r.copy=function(){return Gt(e,t,n)},i()}function Yt(e,t){function n(n){return t[d3.bisect(e,n)]}return n.domain=function(t){return arguments.length?(e=t,n):e},n.range=function(e){return arguments.length?(t=e,n):t},n.copy=function(){return Yt(e,t)},n}function Zt(e){function t(e){return+e}return t.invert=t,t.domain=t.range=function(n){return arguments.length?(e=n.map(t),t):e},t.ticks=function(t){return qt(e,t)},t.tickFormat=function(t){return Rt(e,t)},t.copy=function(){return Zt(e)},t}function en(e){return e.innerRadius}function tn(e){return e.outerRadius}function nn(e){return e.startAngle}function rn(e){return e.endAngle}function sn(e){function t(t){function o(){a.push("M",s(e(l),f))}var a=[],l=[],c=-1,h=t.length,p,d=u(n),v=u(r);while(++c<h)i.call(this,p=t[c],c)?l.push([+d.call(this,p,c),+v.call(this,p,c)]):l.length&&(o(),l=[]);return l.length&&o(),a.length?a.join(""):null}var n=on,r=un,i=o,s=an,a=s.key,f=.7;return t.x=function(e){return arguments.length?(n=e,t):n},t.y=function(e){return arguments.length?(r=e,t):r},t.defined=function(e){return arguments.length?(i=e,t):i},t.interpolate=function(e){return arguments.length?(typeof e=="function"?a=s=e:a=(s=eo.get(e)||an).key,t):a},t.tension=function(e){return arguments.length?(f=e,t):f},t}function on(e){return e[0]}function un(e){return e[1]}function an(e){return e.join("L")}function fn(e){return an(e)+"Z"}function ln(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("V",(r=e[t])[1],"H",r[0]);return i.join("")}function cn(e){var t=0,n=e.length,r=e[0],i=[r[0],",",r[1]];while(++t<n)i.push("H",(r=e[t])[0],"V",r[1]);return i.join("")}function hn(e,t){return e.length<4?an(e):e[1]+vn(e.slice(1,e.length-1),mn(e,t))}function pn(e,t){return e.length<3?an(e):e[0]+vn((e.push(e[0]),e),mn([e[e.length-2]].concat(e,[e[1]]),t))}function dn(e,t,n){return e.length<3?an(e):e[0]+vn(e,mn(e,t))}function vn(e,t){if(t.length<1||e.length!=t.length&&e.length!=t.length+2)return an(e);var n=e.length!=t.length,r="",i=e[0],s=e[1],o=t[0],u=o,a=1;n&&(r+="Q"+(s[0]-o[0]*2/3)+","+(s[1]-o[1]*2/3)+","+s[0]+","+s[1],i=e[1],a=2);if(t.length>1){u=t[1],s=e[a],a++,r+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1];for(var f=2;f<t.length;f++,a++)s=e[a],u=t[f],r+="S"+(s[0]-u[0])+","+(s[1]-u[1])+","+s[0]+","+s[1]}if(n){var l=e[a];r+="Q"+(s[0]+u[0]*2/3)+","+(s[1]+u[1]*2/3)+","+l[0]+","+l[1]}return r}function mn(e,t){var n=[],r=(1-t)/2,i,s=e[0],o=e[1],u=1,a=e.length;while(++u<a)i=s,s=o,o=e[u],n.push([r*(o[0]-i[0]),r*(o[1]-i[1])]);return n}function gn(e){if(e.length<3)return an(e);var t=1,n=e.length,r=e[0],i=r[0],s=r[1],o=[i,i,i,(r=e[1])[0]],u=[s,s,s,r[1]],a=[i,",",s];Sn(a,o,u);while(++t<n)r=e[t],o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);t=-1;while(++t<2)o.shift(),o.push(r[0]),u.shift(),u.push(r[1]),Sn(a,o,u);return a.join("")}function yn(e){if(e.length<4)return an(e);var t=[],n=-1,r=e.length,i,s=[0],o=[0];while(++n<3)i=e[n],s.push(i[0]),o.push(i[1]);t.push(En(ro,s)+","+En(ro,o)),--n;while(++n<r)i=e[n],s.shift(),s.push(i[0]),o.shift(),o.push(i[1]),Sn(t,s,o);return t.join("")}function bn(e){var t,n=-1,r=e.length,i=r+4,s,o=[],u=[];while(++n<4)s=e[n%r],o.push(s[0]),u.push(s[1]);t=[En(ro,o),",",En(ro,u)],--n;while(++n<i)s=e[n%r],o.shift(),o.push(s[0]),u.shift(),u.push(s[1]),Sn(t,o,u);return t.join("")}function wn(e,t){var n=e.length-1;if(n){var r=e[0][0],i=e[0][1],s=e[n][0]-r,o=e[n][1]-i,u=-1,a,f;while(++u<=n)a=e[u],f=u/n,a[0]=t*a[0]+(1-t)*(r+f*s),a[1]=t*a[1]+(1-t)*(i+f*o)}return gn(e)}function En(e,t){return e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3]}function Sn(e,t,n){e.push("C",En(to,t),",",En(to,n),",",En(no,t),",",En(no,n),",",En(ro,t),",",En(ro,n))}function xn(e,t){return(t[1]-e[1])/(t[0]-e[0])}function Tn(e){var t=0,n=e.length-1,r=[],i=e[0],s=e[1],o=r[0]=xn(i,s);while(++t<n)r[t]=(o+(o=xn(i=s,s=e[t+1])))/2;return r[t]=o,r}function Nn(e){var t=[],n,r,i,s,o=Tn(e),u=-1,a=e.length-1;while(++u<a)n=xn(e[u],e[u+1]),Math.abs(n)<1e-6?o[u]=o[u+1]=0:(r=o[u]/n,i=o[u+1]/n,s=r*r+i*i,s>9&&(s=n*3/Math.sqrt(s),o[u]=s*r,o[u+1]=s*i));u=-1;while(++u<=a)s=(e[Math.min(a,u+1)][0]-e[Math.max(0,u-1)][0])/(6*(1+o[u]*o[u])),t.push([s||0,o[u]*s||0]);return t}function Cn(e){return e.length<3?an(e):e[0]+vn(e,Nn(e))}function kn(e){var t,n=-1,r=e.length,i,s;while(++n<r)t=e[n],i=t[0],s=t[1]+Ys,t[0]=i*Math.cos(s),t[1]=i*Math.sin(s);return e}function Ln(e){function t(t){function o(){l.push("M",f(e(v),p),h,c(e(d.reverse()),p),"Z")}var l=[],d=[],v=[],m=-1,g=t.length,y,b=u(n),w=u(i),E=n===r?function(){return x}:u(r),S=i===s?function(){return T}:u(s),x,T;while(++m<g)a.call(this,y=t[m],m)?(d.push([x=+b.call(this,y,m),T=+w.call(this,y,m)]),v.push([+E.call(this,y,m),+S.call(this,y,m)])):d.length&&(o(),d=[],v=[]);return d.length&&o(),l.length?l.join(""):null}var n=on,r=on,i=0,s=un,a=o,f=an,l=f.key,c=f,h="L",p=.7;return t.x=function(e){return arguments.length?(n=r=e,t):r},t.x0=function(e){return arguments.length?(n=e,t):n},t.x1=function(e){return arguments.length?(r=e,t):r},t.y=function(e){return arguments.length?(i=s=e,t):s},t.y0=function(e){return arguments.length?(i=e,t):i},t.y1=function(e){return arguments.length?(s=e,t):s},t.defined=function(e){return arguments.length?(a=e,t):a},t.interpolate=function(e){return arguments.length?(typeof e=="function"?l=f=e:l=(f=eo.get(e)||an).key,c=f.reverse||f,h=f.closed?"M":"L",t):l},t.tension=function(e){return arguments.length?(p=e,t):p},t}function An(e){return e.source}function On(e){return e.target}function Mn(e){return e.radius}function _n(e){return e.startAngle}function Dn(e){return e.endAngle}function Pn(e){return[e.x,e.y]}function Hn(e){return function(){var t=e.apply(this,arguments),n=t[0],r=t[1]+Ys;return[n*Math.cos(r),n*Math.sin(r)]}}function Bn(){return 64}function jn(){return"circle"}function Fn(e){var t=Math.sqrt(e/Math.PI);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+ -t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function In(e,t){e.attr("transform",function(e){return"translate("+t(e)+",0)"})}function qn(e,t){e.attr("transform",function(e){return"translate(0,"+t(e)+")"})}function Rn(e,t,n){i=[];if(n&&t.length>1){var r=_t(e.domain()),i,s=-1,o=t.length,u=(t[1]-t[0])/++n,a,f;while(++s<o)for(a=n;--a>0;)(f=+t[s]-a*u)>=r[0]&&i.push(f);for(--s,a=0;++a<n&&(f=+t[s]+a*u)<r[1];)i.push(f)}return i}function Un(){fo||(fo=d3.select("body").append("div").style("visibility","hidden").style("top",0).style("height",0).style("width",0).style("overflow-y","scroll").append("div").style("height","2000px").node().parentNode);var e=d3.event,t;try{fo.scrollTop=1e3,fo.dispatchEvent(e),t=1e3-fo.scrollTop}catch(n){t=e.wheelDelta||-e.detail*5}return t}function zn(e){var t=e.source,n=e.target,r=Xn(t,n),i=[t];while(t!==r)t=t.parent,i.push(t);var s=i.length;while(n!==r)i.splice(s,0,n),n=n.parent;return i}function Wn(e){var t=[],n=e.parent;while(n!=null)t.push(e),e=n,n=n.parent;return t.push(e),t}function Xn(e,t){if(e===t)return e;var n=Wn(e),r=Wn(t),i=n.pop(),s=r.pop(),o=null;while(i===s)o=i,i=n.pop(),s=r.pop();return o}function Vn(e){e.fixed|=2}function $n(e){e.fixed&=1}function Jn(e){e.fixed|=4}function Kn(e){e.fixed&=3}function Qn(e,t,n){var r=0,i=0;e.charge=0;if(!e.leaf){var s=e.nodes,o=s.length,u=-1,a;while(++u<o){a=s[u];if(a==null)continue;Qn(a,t,n),e.charge+=a.charge,r+=a.charge*a.cx,i+=a.charge*a.cy}}if(e.point){e.leaf||(e.point.x+=Math.random()-.5,e.point.y+=Math.random()-.5);var f=t*n[e.point.index];e.charge+=e.pointCharge=f,r+=f*e.point.x,i+=f*e.point.y}e.cx=r/e.charge,e.cy=i/e.charge}function Gn(e){return 20}function Yn(e){return 1}function Zn(e){return e.x}function er(e){return e.y}function tr(e,t,n){e.y0=t,e.y=n}function nr(e){return d3.range(e.length)}function rr(e){var t=-1,n=e[0].length,r=[];while(++t<n)r[t]=0;return r}function ir(e){var t=1,n=0,r=e[0][1],i,s=e.length;for(;t<s;++t)(i=e[t][1])>r&&(n=t,r=i);return n}function sr(e){return e.reduce(or,0)}function or(e,t){return e+t[1]}function ur(e,t){return ar(e,Math.ceil(Math.log(t.length)/Math.LN2+1))}function ar(e,t){var n=-1,r=+e[0],i=(e[1]-r)/t,s=[];while(++n<=t)s[n]=i*n+r;return s}function fr(e){return[d3.min(e),d3.max(e)]}function lr(e,t){return d3.rebind(e,t,"sort","children","value"),e.links=dr,e.nodes=function(t){return vo=!0,(e.nodes=e)(t)},e}function cr(e){return e.children}function hr(e){return e.value}function pr(e,t){return t.value-e.value}function dr(e){return d3.merge(e.map(function(e){return(e.children||[]).map(function(t){return{source:e,target:t}})}))}function vr(e,t){return e.value-t.value}function mr(e,t){var n=e._pack_next;e._pack_next=t,t._pack_prev=e,t._pack_next=n,n._pack_prev=t}function gr(e,t){e._pack_next=t,t._pack_prev=e}function yr(e,t){var n=t.x-e.x,r=t.y-e.y,i=e.r+t.r;return i*i-n*n-r*r>.001}function br(e){function t(e){r=Math.min(e.x-e.r,r),i=Math.max(e.x+e.r,i),s=Math.min(e.y-e.r,s),o=Math.max(e.y+e.r,o)}if(!(n=e.children)||!(p=n.length))return;var n,r=Infinity,i=-Infinity,s=Infinity,o=-Infinity,u,a,f,l,c,h,p;n.forEach(wr),u=n[0],u.x=-u.r,u.y=0,t(u);if(p>1){a=n[1],a.x=a.r,a.y=0,t(a);if(p>2){f=n[2],xr(u,a,f),t(f),mr(u,f),u._pack_prev=f,mr(f,a),a=u._pack_next;for(l=3;l<p;l++){xr(u,a,f=n[l]);var d=0,v=1,m=1;for(c=a._pack_next;c!==a;c=c._pack_next,v++)if(yr(c,f)){d=1;break}if(d==1)for(h=u._pack_prev;h!==c._pack_prev;h=h._pack_prev,m++)if(yr(h,f))break;d?(v<m||v==m&&a.r<u.r?gr(u,a=c):gr(u=h,a),l--):(mr(u,f),a=f,t(f))}}}var g=(r+i)/2,y=(s+o)/2,b=0;for(l=0;l<p;l++)f=n[l],f.x-=g,f.y-=y,b=Math.max(b,f.r+Math.sqrt(f.x*f.x+f.y*f.y));e.r=b,n.forEach(Er)}function wr(e){e._pack_next=e._pack_prev=e}function Er(e){delete e._pack_next,delete e._pack_prev}function Sr(e,t,n,r){var i=e.children;e.x=t+=r*e.x,e.y=n+=r*e.y,e.r*=r;if(i){var s=-1,o=i.length;while(++s<o)Sr(i[s],t,n,r)}}function xr(e,t,n){var r=e.r+n.r,i=t.x-e.x,s=t.y-e.y;if(r&&(i||s)){var o=t.r+n.r,u=i*i+s*s;o*=o,r*=r;var a=.5+(r-o)/(2*u),f=Math.sqrt(Math.max(0,2*o*(r+u)-(r-=u)*r-o*o))/(2*u);n.x=e.x+a*i+f*s,n.y=e.y+a*s-f*i}else n.x=e.x+r,n.y=e.y}function Tr(e){return 1+d3.max(e,function(e){return e.y})}function Nr(e){return e.reduce(function(e,t){return e+t.x},0)/e.length}function Cr(e){var t=e.children;return t&&t.length?Cr(t[0]):e}function kr(e){var t=e.children,n;return t&&(n=t.length)?kr(t[n-1]):e}function Lr(e,t){return e.parent==t.parent?1:2}function Ar(e){var t=e.children;return t&&t.length?t[0]:e._tree.thread}function Or(e){var t=e.children,n;return t&&(n=t.length)?t[n-1]:e._tree.thread}function Mr(e,t){var n=e.children;if(n&&(i=n.length)){var r,i,s=-1;while(++s<i)t(r=Mr(n[s],t),e)>0&&(e=r)}return e}function _r(e,t){return e.x-t.x}function Dr(e,t){return t.x-e.x}function Pr(e,t){return e.depth-t.depth}function Hr(e,t){function n(e,r){var i=e.children;if(i&&(a=i.length)){var s,o=null,u=-1,a;while(++u<a)s=i[u],n(s,o),o=s}t(e,r)}n(e,null)}function Br(e){var t=0,n=0,r=e.children,i=r.length,s;while(--i>=0)s=r[i]._tree,s.prelim+=t,s.mod+=t,t+=s.shift+(n+=s.change)}function jr(e,t,n){e=e._tree,t=t._tree;var r=n/(t.number-e.number);e.change+=r,t.change-=r,t.shift+=n,t.prelim+=n,t.mod+=n}function Fr(e,t,n){return e._tree.ancestor.parent==t.parent?e._tree.ancestor:n}function Ir(e){return{x:e.x,y:e.y,dx:e.dx,dy:e.dy}}function qr(e,t){var n=e.x+t[3],r=e.y+t[0],i=e.dx-t[1]-t[3],s=e.dy-t[0]-t[2];return i<0&&(n+=i/2,i=0),s<0&&(r+=s/2,s=0),{x:n,y:r,dx:i,dy:s}}function Rr(e,t){function n(e,r){d3.text(e,t,function(e){r(e&&n.parse(e))})}function r(t){return t.map(i).join(e)}function i(e){return o.test(e)?'"'+e.replace(/\"/g,'""')+'"':e}var s=new RegExp("\r\n|["+e+"\r\n]","g"),o=new RegExp('["'+e+"\n]"),u=e.charCodeAt(0);return n.parse=function(e){var t;return n.parseRows(e,function(e,n){if(n){var r={},i=-1,s=t.length;while(++i<s)r[t[i]]=e[i];return r}return t=e,null})},n.parseRows=function(e,t){function n(){if(s.lastIndex>=e.length)return i;if(l)return l=!1,r;var t=s.lastIndex;if(e.charCodeAt(t)===34){var n=t;while(n++<e.length)if(e.charCodeAt(n)===34){if(e.charCodeAt(n+1)!==34)break;n++}s.lastIndex=n+2;var o=e.charCodeAt(n+1);return o===13?(l=!0,e.charCodeAt(n+2)===10&&s.lastIndex++):o===10&&(l=!0),e.substring(t+1,n).replace(/""/g,'"')}var a=s.exec(e);return a?(l=a[0].charCodeAt(0)!==u,e.substring(t,a.index)):(s.lastIndex=e.length,e.substring(t))}var r={},i={},o=[],a=0,f,l;s.lastIndex=0;while((f=n())!==i){var c=[];while(f!==r&&f!==i)c.push(f),f=n();if(t&&!(c=t(c,a++)))continue;o.push(c)}return o},n.format=function(e){return e.map(r).join("\n")},n}function Ur(e,t){return function(n){return n&&e.hasOwnProperty(n.type)?e[n.type](n):t}}function zr(e){return"m0,"+e+"a"+e+","+e+" 0 1,1 0,"+ -2*e+"a"+e+","+e+" 0 1,1 0,"+2*e+"z"}function Wr(e,t){go.hasOwnProperty(e.type)&&go[e.type](e,t)}function Xr(e,t){Wr(e.geometry,t)}function Vr(e,t){for(var n=e.features,r=0,i=n.length;r<i;r++)Wr(n[r].geometry,t)}function $r(e,t){for(var n=e.geometries,r=0,i=n.length;r<i;r++)Wr(n[r],t)}function Jr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Kr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Qr(e,t){for(var n=e.coordinates,r=0,i=n.length;r<i;r++)for(var s=n[r][0],o=0,u=s.length;o<u;o++)t.apply(null,s[o])}function Gr(e,t){t.apply(null,e.coordinates)}function Yr(e,t){for(var n=e.coordinates[0],r=0,i=n.length;r<i;r++)t.apply(null,n[r])}function Zr(e){return e.source}function ei(e){return e.target}function ti(){function e(e){var t=Math.sin(e*=p)*d,n=Math.sin(p-e)*d,r=n*s+t*c,u=n*o+t*h,a=n*i+t*l;return[Math.atan2(u,r)/mo,Math.atan2(a,Math.sqrt(r*r+u*u))/mo]}var t,n,r,i,s,o,u,a,f,l,c,h,p,d;return e.distance=function(){return p==null&&(d=1/Math.sin(p=Math.acos(Math.max(-1,Math.min(1,i*l+r*f*Math.cos(u-t)))))),p},e.source=function(u){var a=Math.cos(t=u[0]*mo),f=Math.sin(t);return r=Math.cos(n=u[1]*mo),i=Math.sin(n),s=r*a,o=r*f,p=null,e},e.target=function(t){var n=Math.cos(u=t[0]*mo),r=Math.sin(u);return f=Math.cos(a=t[1]*mo),l=Math.sin(a),c=f*n,h=f*r,p=null,e},e}function ni(e,t){var n=ti().source(e).target(t);return n.distance(),n}function ri(e){var t=0,n=0;for(;;){if(e(t,n))return[t,n];t===0?(t=n+1,n=0):(t-=1,n+=1)}}function ii(e,t,n,r){var i,s,o,u,a,f,l;return i=r[e],s=i[0],o=i[1],i=r[t],u=i[0],a=i[1],i=r[n],f=i[0],l=i[1],(l-o)*(u-s)-(a-o)*(f-s)>0}function si(e,t,n){return(n[0]-t[0])*(e[1]-t[1])<(n[1]-t[1])*(e[0]-t[0])}function oi(e,t,n,r){var i=e[0],s=t[0],o=n[0],u=r[0],a=e[1],f=t[1],l=n[1],c=r[1],h=i-o,p=s-i,d=u-o,v=a-l,m=f-a,g=c-l,y=(d*v-g*h)/(g*p-d*m);return[i+y*p,a+y*m]}function ui(e,t){var n={list:e.map(function(e,t){return{index:t,x:e[0],y:e[1]}}).sort(function(e,t){return e.y<t.y?-1:e.y>t.y?1:e.x<t.x?-1:e.x>t.x?1:0}),bottomSite:null},r={list:[],leftEnd:null,rightEnd:null,init:function(){r.leftEnd=r.createHalfEdge(null,"l"),r.rightEnd=r.createHalfEdge(null,"l"),r.leftEnd.r=r.rightEnd,r.rightEnd.l=r.leftEnd,r.list.unshift(r.leftEnd,r.rightEnd)},createHalfEdge:function(e,t){return{edge:e,side:t,vertex:null,l:null,r:null}},insert:function(e,t){t.l=e,t.r=e.r,e.r.l=t,e.r=t},leftBound:function(e){var t=r.leftEnd;do t=t.r;while(t!=r.rightEnd&&i.rightOf(t,e));return t=t.l,t},del:function(e){e.l.r=e.r,e.r.l=e.l,e.edge=null},right:function(e){return e.r},left:function(e){return e.l},leftRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[e.side]},rightRegion:function(e){return e.edge==null?n.bottomSite:e.edge.region[wo[e.side]]}},i={bisect:function(e,t){var n={region:{l:e,r:t},ep:{l:null,r:null}},r=t.x-e.x,i=t.y-e.y,s=r>0?r:-r,o=i>0?i:-i;return n.c=e.x*r+e.y*i+(r*r+i*i)*.5,s>o?(n.a=1,n.b=i/r,n.c/=r):(n.b=1,n.a=r/i,n.c/=i),n},intersect:function(e,t){var n=e.edge,r=t.edge;if(!n||!r||n.region.r==r.region.r)return null;var i=n.a*r.b-n.b*r.a;if(Math.abs(i)<1e-10)return null;var s=(n.c*r.b-r.c*n.b)/i,o=(r.c*n.a-n.c*r.a)/i,u=n.region.r,a=r.region.r,f,l;u.y<a.y||u.y==a.y&&u.x<a.x?(f=e,l=n):(f=t,l=r);var c=s>=l.region.r.x;return c&&f.side==="l"||!c&&f.side==="r"?null:{x:s,y:o}},rightOf:function(e,t){var n=e.edge,r=n.region.r,i=t.x>r.x;if(i&&e.side==="l")return 1;if(!i&&e.side==="r")return 0;if(n.a===1){var s=t.y-r.y,o=t.x-r.x,u=0,a=0;!i&&n.b<0||i&&n.b>=0?a=u=s>=n.b*o:(a=t.x+t.y*n.b>n.c,n.b<0&&(a=!a),a||(u=1));if(!u){var f=r.x-n.region.l.x;a=n.b*(o*o-s*s)<f*s*(1+2*o/f+n.b*n.b),n.b<0&&(a=!a)}}else{var l=n.c-n.a*t.x,c=t.y-l,h=t.x-r.x,p=l-r.y;a=c*c>h*h+p*p}return e.side==="l"?a:!a},endPoint:function(e,n,r){e.ep[n]=r;if(!e.ep[wo[n]])return;t(e)},distance:function(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}},s={list:[],insert:function(e,t,n){e.vertex=t,e.ystar=t.y+n;for(var r=0,i=s.list,o=i.length;r<o;r++){var u=i[r];if(e.ystar>u.ystar||e.ystar==u.ystar&&t.x>u.vertex.x)continue;break}i.splice(r,0,e)},del:function(e){for(var t=0,n=s.list,r=n.length;t<r&&n[t]!=e;++t);n.splice(t,1)},empty:function(){return s.list.length===0},nextEvent:function(e){for(var t=0,n=s.list,r=n.length;t<r;++t)if(n[t]==e)return n[t+1];return null},min:function(){var e=s.list[0];return{x:e.vertex.x,y:e.ystar}},extractMin:function(){return s.list.shift()}};r.init(),n.bottomSite=n.list.shift();var o=n.list.shift(),u,a,f,l,c,h,p,d,v,m,g,y,b;for(;;){s.empty()||(u=s.min());if(o&&(s.empty()||o.y<u.y||o.y==u.y&&o.x<u.x))a=r.leftBound(o),f=r.right(a),p=r.rightRegion(a),y=i.bisect(p,o),h=r.createHalfEdge(y,"l"),r.insert(a,h),m=i.intersect(a,h),m&&(s.del(a),s.insert(a,m,i. -distance(m,o))),a=h,h=r.createHalfEdge(y,"r"),r.insert(a,h),m=i.intersect(h,f),m&&s.insert(h,m,i.distance(m,o)),o=n.list.shift();else{if(!!s.empty())break;a=s.extractMin(),l=r.left(a),f=r.right(a),c=r.right(f),p=r.leftRegion(a),d=r.rightRegion(f),g=a.vertex,i.endPoint(a.edge,a.side,g),i.endPoint(f.edge,f.side,g),r.del(a),s.del(f),r.del(f),b="l",p.y>d.y&&(v=p,p=d,d=v,b="r"),y=i.bisect(p,d),h=r.createHalfEdge(y,b),r.insert(l,h),i.endPoint(y,wo[b],g),m=i.intersect(l,h),m&&(s.del(l),s.insert(l,m,i.distance(m,p))),m=i.intersect(h,c),m&&s.insert(h,m,i.distance(m,p))}}for(a=r.right(r.leftEnd);a!=r.rightEnd;a=r.right(a))t(a.edge)}function ai(){return{leaf:!0,nodes:[],point:null}}function fi(e,t,n,r,i,s){if(!e(t,n,r,i,s)){var o=(n+i)*.5,u=(r+s)*.5,a=t.nodes;a[0]&&fi(e,a[0],n,r,o,u),a[1]&&fi(e,a[1],o,r,i,u),a[2]&&fi(e,a[2],n,u,o,s),a[3]&&fi(e,a[3],o,u,i,s)}}function li(e){return{x:e[0],y:e[1]}}function ci(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function hi(e){return e.substring(0,3)}function pi(e,t,n,r){var i,s,o=0,u=t.length,a=n.length;while(o<u){if(r>=a)return-1;i=t.charCodeAt(o++);if(i==37){s=Uo[t.charAt(o++)];if(!s||(r=s(e,n,r))<0)return-1}else if(i!=n.charCodeAt(r++))return-1}return r}function di(e){return new RegExp("^(?:"+e.map(d3.requote).join("|")+")","i")}function vi(e){var t=new r,n=-1,i=e.length;while(++n<i)t.set(e[n].toLowerCase(),n);return t}function mi(e,t,n){Bo.lastIndex=0;var r=Bo.exec(t.substring(n));return r?n+=r[0].length:-1}function gi(e,t,n){Ho.lastIndex=0;var r=Ho.exec(t.substring(n));return r?n+=r[0].length:-1}function yi(e,t,n){Io.lastIndex=0;var r=Io.exec(t.substring(n));return r?(e.m=qo.get(r[0].toLowerCase()),n+=r[0].length):-1}function bi(e,t,n){jo.lastIndex=0;var r=jo.exec(t.substring(n));return r?(e.m=Fo.get(r[0].toLowerCase()),n+=r[0].length):-1}function wi(e,t,n){return pi(e,Ro.c.toString(),t,n)}function Ei(e,t,n){return pi(e,Ro.x.toString(),t,n)}function Si(e,t,n){return pi(e,Ro.X.toString(),t,n)}function xi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+4));return r?(e.y=+r[0],n+=r[0].length):-1}function Ti(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.y=Ni(+r[0]),n+=r[0].length):-1}function Ni(e){return e+(e>68?1900:2e3)}function Ci(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.m=r[0]-1,n+=r[0].length):-1}function ki(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.d=+r[0],n+=r[0].length):-1}function Li(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.H=+r[0],n+=r[0].length):-1}function Ai(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.M=+r[0],n+=r[0].length):-1}function Oi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+2));return r?(e.S=+r[0],n+=r[0].length):-1}function Mi(e,t,n){zo.lastIndex=0;var r=zo.exec(t.substring(n,n+3));return r?(e.L=+r[0],n+=r[0].length):-1}function _i(e,t,n){var r=Wo.get(t.substring(n,n+=2).toLowerCase());return r==null?-1:(e.p=r,n)}function Di(e){var t=e.getTimezoneOffset(),n=t>0?"-":"+",r=~~(Math.abs(t)/60),i=Math.abs(t)%60;return n+Mo(r)+Mo(i)}function Pi(e){return e.toISOString()}function Hi(e,t,n){function r(t){var n=e(t),r=s(n,1);return t-n<r-t?n:r}function i(n){return t(n=e(new Eo(n-1)),1),n}function s(e,n){return t(e=new Eo(+e),n),e}function o(e,r,s){var o=i(e),u=[];if(s>1)while(o<r)n(o)%s||u.push(new Date(+o)),t(o,1);else while(o<r)u.push(new Date(+o)),t(o,1);return u}function u(e,t,n){try{Eo=ci;var r=new ci;return r._=e,o(r,t,n)}finally{Eo=Date}}e.floor=e,e.round=r,e.ceil=i,e.offset=s,e.range=o;var a=e.utc=Bi(e);return a.floor=a,a.round=Bi(r),a.ceil=Bi(i),a.offset=Bi(s),a.range=u,e}function Bi(e){return function(t,n){try{Eo=ci;var r=new ci;return r._=t,e(r,n)._}finally{Eo=Date}}}function ji(e,t,n){function r(t){return e(t)}return r.invert=function(t){return Ii(e.invert(t))},r.domain=function(t){return arguments.length?(e.domain(t),r):e.domain().map(Ii)},r.nice=function(e){return r.domain(Pt(r.domain(),function(){return e}))},r.ticks=function(n,i){var s=Fi(r.domain());if(typeof n!="function"){var o=s[1]-s[0],u=o/n,a=d3.bisect(Vo,u);if(a==Vo.length)return t.year(s,n);if(!a)return e.ticks(n).map(Ii);Math.log(u/Vo[a-1])<Math.log(Vo[a]/u)&&--a,n=t[a],i=n[1],n=n[0].range}return n(s[0],new Date(+s[1]+1),i)},r.tickFormat=function(){return n},r.copy=function(){return ji(e.copy(),t,n)},d3.rebind(r,e,"range","rangeRound","interpolate","clamp")}function Fi(e){var t=e[0],n=e[e.length-1];return t<n?[t,n]:[n,t]}function Ii(e){return new Date(e)}function qi(e){return function(t){var n=e.length-1,r=e[n];while(!r[1](t))r=e[--n];return r[0](t)}}function Ri(e){var t=new Date(e,0,1);return t.setFullYear(e),t}function Ui(e){var t=e.getFullYear(),n=Ri(t),r=Ri(t+1);return t+(e-n)/(r-n)}function zi(e){var t=new Date(Date.UTC(e,0,1));return t.setUTCFullYear(e),t}function Wi(e){var t=e.getUTCFullYear(),n=zi(t),r=zi(t+1);return t+(e-n)/(r-n)}Date.now||(Date.now=function(){return+(new Date)});try{document.createElement("div").style.setProperty("opacity",0,"")}catch(Xi){var Vi=CSSStyleDeclaration.prototype,$i=Vi.setProperty;Vi.setProperty=function(e,t,n){$i.call(this,e,t+"",n)}}d3={version:"2.10.3"};var Ji=n;try{Ji(document.documentElement.childNodes)[0].nodeType}catch(Ki){Ji=t}var Qi=[].__proto__?function(e,t){e.__proto__=t}:function(e,t){for(var n in t)e[n]=t[n]};d3.map=function(e){var t=new r;for(var n in e)t.set(n,e[n]);return t},e(r,{has:function(e){return Gi+e in this},get:function(e){return this[Gi+e]},set:function(e,t){return this[Gi+e]=t},remove:function(e){return e=Gi+e,e in this&&delete this[e]},keys:function(){var e=[];return this.forEach(function(t){e.push(t)}),e},values:function(){var e=[];return this.forEach(function(t,n){e.push(n)}),e},entries:function(){var e=[];return this.forEach(function(t,n){e.push({key:t,value:n})}),e},forEach:function(e){for(var t in this)t.charCodeAt(0)===Yi&&e.call(this,t.substring(1),this[t])}});var Gi="\0",Yi=Gi.charCodeAt(0);d3.functor=u,d3.rebind=function(e,t){var n=1,r=arguments.length,i;while(++n<r)e[i=arguments[n]]=a(e,t,t[i]);return e},d3.ascending=function(e,t){return e<t?-1:e>t?1:e>=t?0:NaN},d3.descending=function(e,t){return t<e?-1:t>e?1:t>=e?0:NaN},d3.mean=function(e,t){var n=e.length,r,i=0,s=-1,o=0;if(arguments.length===1)while(++s<n)f(r=e[s])&&(i+=(r-i)/++o);else while(++s<n)f(r=t.call(e,e[s],s))&&(i+=(r-i)/++o);return o?i:undefined},d3.median=function(e,t){return arguments.length>1&&(e=e.map(t)),e=e.filter(f),e.length?d3.quantile(e.sort(d3.ascending),.5):undefined},d3.min=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&i>s&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&i>s&&(i=s)}return i},d3.max=function(e,t){var n=-1,r=e.length,i,s;if(arguments.length===1){while(++n<r&&((i=e[n])==null||i!=i))i=undefined;while(++n<r)(s=e[n])!=null&&s>i&&(i=s)}else{while(++n<r&&((i=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&s>i&&(i=s)}return i},d3.extent=function(e,t){var n=-1,r=e.length,i,s,o;if(arguments.length===1){while(++n<r&&((i=o=e[n])==null||i!=i))i=o=undefined;while(++n<r)(s=e[n])!=null&&(i>s&&(i=s),o<s&&(o=s))}else{while(++n<r&&((i=o=t.call(e,e[n],n))==null||i!=i))i=undefined;while(++n<r)(s=t.call(e,e[n],n))!=null&&(i>s&&(i=s),o<s&&(o=s))}return[i,o]},d3.random={normal:function(e,t){var n=arguments.length;return n<2&&(t=1),n<1&&(e=0),function(){var n,r,i;do n=Math.random()*2-1,r=Math.random()*2-1,i=n*n+r*r;while(!i||i>1);return e+t*n*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(e,t){var n=arguments.length;n<2&&(t=1),n<1&&(e=0);var r=d3.random.normal();return function(){return Math.exp(e+t*r())}},irwinHall:function(e){return function(){for(var t=0,n=0;n<e;n++)t+=Math.random();return t/e}}},d3.sum=function(e,t){var n=0,r=e.length,i,s=-1;if(arguments.length===1)while(++s<r)isNaN(i=+e[s])||(n+=i);else while(++s<r)isNaN(i=+t.call(e,e[s],s))||(n+=i);return n},d3.quantile=function(e,t){var n=(e.length-1)*t+1,r=Math.floor(n),i=e[r-1],s=n-r;return s?i+s*(e[r]-i):i},d3.transpose=function(e){return d3.zip.apply(d3,e)},d3.zip=function(){if(!(i=arguments.length))return[];for(var e=-1,t=d3.min(arguments,l),n=new Array(t);++e<t;)for(var r=-1,i,s=n[e]=new Array(i);++r<i;)s[r]=arguments[r][e];return n},d3.bisector=function(e){return{left:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;e.call(t,t[s],s)<n?r=s+1:i=s}return r},right:function(t,n,r,i){arguments.length<3&&(r=0),arguments.length<4&&(i=t.length);while(r<i){var s=r+i>>>1;n<e.call(t,t[s],s)?i=s:r=s+1}return r}}};var Zi=d3.bisector(function(e){return e});d3.bisectLeft=Zi.left,d3.bisect=d3.bisectRight=Zi.right,d3.first=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])>0&&(i=s);return i},d3.last=function(e,t){var n=0,r=e.length,i=e[0],s;arguments.length===1&&(t=d3.ascending);while(++n<r)t.call(e,i,s=e[n])<=0&&(i=s);return i},d3.nest=function(){function e(t,s){if(s>=i.length)return u?u.call(n,t):o?t.sort(o):t;var a=-1,f=t.length,l=i[s++],c,h,p=new r,d,v={};while(++a<f)(d=p.get(c=l(h=t[a])))?d.push(h):p.set(c,[h]);return p.forEach(function(t,n){v[t]=e(n,s)}),v}function t(e,n){if(n>=i.length)return e;var r=[],o=s[n++],u;for(u in e)r.push({key:u,values:t(e[u],n)});return o&&r.sort(function(e,t){return o(e.key,t.key)}),r}var n={},i=[],s=[],o,u;return n.map=function(t){return e(t,0)},n.entries=function(n){return t(e(n,0),0)},n.key=function(e){return i.push(e),n},n.sortKeys=function(e){return s[i.length-1]=e,n},n.sortValues=function(e){return o=e,n},n.rollup=function(e){return u=e,n},n},d3.keys=function(e){var t=[];for(var n in e)t.push(n);return t},d3.values=function(e){var t=[];for(var n in e)t.push(e[n]);return t},d3.entries=function(e){var t=[];for(var n in e)t.push({key:n,value:e[n]});return t},d3.permute=function(e,t){var n=[],r=-1,i=t.length;while(++r<i)n[r]=e[t[r]];return n},d3.merge=function(e){return Array.prototype.concat.apply([],e)},d3.split=function(e,t){var n=[],r=[],i,s=-1,o=e.length;arguments.length<2&&(t=c);while(++s<o)t.call(r,i=e[s],s)?r=[]:(r.length||n.push(r),r.push(i));return n},d3.range=function(e,t,n){arguments.length<3&&(n=1,arguments.length<2&&(t=e,e=0));if((t-e)/n===Infinity)throw new Error("infinite range");var r=[],i=p(Math.abs(n)),s=-1,o;e*=i,t*=i,n*=i;if(n<0)while((o=e+n*++s)>t)r.push(o/i);else while((o=e+n*++s)<t)r.push(o/i);return r},d3.requote=function(e){return e.replace(es,"\\$&")};var es=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;d3.round=function(e,t){return t?Math.round(e*(t=Math.pow(10,t)))/t:Math.round(e)},d3.xhr=function(e,t,n){var r=new XMLHttpRequest;arguments.length<3?(n=t,t=null):t&&r.overrideMimeType&&r.overrideMimeType(t),r.open("GET",e,!0),t&&r.setRequestHeader("Accept",t),r.onreadystatechange=function(){if(r.readyState===4){var e=r.status;n(!e&&r.response||e>=200&&e<300||e===304?r:null)}},r.send(null)},d3.text=function(e,t,n){function r(e){n(e&&e.responseText)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)},d3.json=function(e,t){d3.text(e,"application/json",function(e){t(e?JSON.parse(e):null)})},d3.html=function(e,t){d3.text(e,"text/html",function(e){if(e!=null){var n=document.createRange();n.selectNode(document.body),e=n.createContextualFragment(e)}t(e)})},d3.xml=function(e,t,n){function r(e){n(e&&e.responseXML)}arguments.length<3&&(n=t,t=null),d3.xhr(e,t,r)};var ts={svg:"http://www.w3.org/2000/svg",xhtml:"http://www.w3.org/1999/xhtml",xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};d3.ns={prefix:ts,qualify:function(e){var t=e.indexOf(":"),n=e;return t>=0&&(n=e.substring(0,t),e=e.substring(t+1)),ts.hasOwnProperty(n)?{space:ts[n],local:e}:e}},d3.dispatch=function(){var e=new d,t=-1,n=arguments.length;while(++t<n)e[arguments[t]]=v(e);return e},d.prototype.on=function(e,t){var n=e.indexOf("."),r="";return n>0&&(r=e.substring(n+1),e=e.substring(0,n)),arguments.length<2?this[e].on(r):this[e].on(r,t)},d3.format=function(e){var t=ns.exec(e),n=t[1]||" ",r=t[3]||"",i=t[5],s=+t[6],o=t[7],u=t[8],a=t[9],f=1,l="",c=!1;u&&(u=+u.substring(1)),i&&(n="0",o&&(s-=Math.floor((s-1)/4)));switch(a){case"n":o=!0,a="g";break;case"%":f=100,l="%",a="f";break;case"p":f=100,l="%",a="r";break;case"d":c=!0,u=0;break;case"s":f=-1,a="r"}return a=="r"&&!u&&(a="g"),a=rs.get(a)||g,function(e){if(c&&e%1)return"";var t=e<0&&(e=-e)?"-":r;if(f<0){var h=d3.formatPrefix(e,u);e=h.scale(e),l=h.symbol}else e*=f;e=a(e,u);if(i){var p=e.length+t.length;p<s&&(e=(new Array(s-p+1)).join(n)+e),o&&(e=y(e)),e=t+e}else{o&&(e=y(e)),e=t+e;var p=e.length;p<s&&(e=(new Array(s-p+1)).join(n)+e)}return e+l}};var ns=/(?:([^{])?([<>=^]))?([+\- ])?(#)?(0)?([0-9]+)?(,)?(\.[0-9]+)?([a-zA-Z%])?/,rs=d3.map({g:function(e,t){return e.toPrecision(t)},e:function(e,t){return e.toExponential(t)},f:function(e,t){return e.toFixed(t)},r:function(e,t){return d3.round(e,t=m(e,t)).toFixed(Math.max(0,Math.min(20,t)))}}),is=["y","z","a","f","p","n","μ","m","","k","M","G","T","P","E","Z","Y"].map(b);d3.formatPrefix=function(e,t){var n=0;return e&&(e<0&&(e*=-1),t&&(e=d3.round(e,m(e,t))),n=1+Math.floor(1e-12+Math.log(e)/Math.LN10),n=Math.max(-24,Math.min(24,Math.floor((n<=0?n+1:n-1)/3)*3))),is[8+n/3]};var ss=T(2),os=T(3),us=function(){return x},as=d3.map({linear:us,poly:T,quad:function(){return ss},cubic:function(){return os},sin:function(){return N},exp:function(){return C},circle:function(){return k},elastic:L,back:A,bounce:function(){return O}}),fs=d3.map({"in":x,out:E,"in-out":S,"out-in":function(e){return S(E(e))}});d3.ease=function(e){var t=e.indexOf("-"),n=t>=0?e.substring(0,t):e,r=t>=0?e.substring(t+1):"in";return n=as.get(n)||us,r=fs.get(r)||x,w(r(n.apply(null,Array.prototype.slice.call(arguments,1))))},d3.event=null,d3.transform=function(e){var t=document.createElementNS(d3.ns.prefix.svg,"g");return(d3.transform=function(e){t.setAttribute("transform",e);var n=t.transform.baseVal.consolidate();return new P(n?n.matrix:cs)})(e)},P.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ls=180/Math.PI,cs={a:1,b:0,c:0,d:1,e:0,f:0};d3.interpolate=function(e,t){var n=d3.interpolators.length,r;while(--n>=0&&!(r=d3.interpolators[n](e,t)));return r},d3.interpolateNumber=function(e,t){return t-=e,function(n){return e+t*n}},d3.interpolateRound=function(e,t){return t-=e,function(n){return Math.round(e+t*n)}},d3.interpolateString=function(e,t){var n,r,i,s=0,o=0,u=[],a=[],f,l;hs.lastIndex=0;for(r=0;n=hs.exec(t);++r)n.index&&u.push(t.substring(s,o=n.index)),a.push({i:u.length,x:n[0]}),u.push(null),s=hs.lastIndex;s<t.length&&u.push(t.substring(s));for(r=0,f=a.length;(n=hs.exec(e))&&r<f;++r){l=a[r];if(l.x==n[0]){if(l.i)if(u[l.i+1]==null){u[l.i-1]+=l.x,u.splice(l.i,1);for(i=r+1;i<f;++i)a[i].i--}else{u[l.i-1]+=l.x+u[l.i+1],u.splice(l.i,2);for(i=r+1;i<f;++i)a[i].i-=2}else if(u[l.i+1]==null)u[l.i]=l.x;else{u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1);for(i=r+1;i<f;++i)a[i].i--}a.splice(r,1),f--,r--}else l.x=d3.interpolateNumber(parseFloat(n[0]),parseFloat(l.x))}while(r<f)l=a.pop(),u[l.i+1]==null?u[l.i]=l.x:(u[l.i]=l.x+u[l.i+1],u.splice(l.i+1,1)),f--;return u.length===1?u[0]==null?a[0].x:function(){return t}:function(e){for(r=0;r<f;++r)u[(l=a[r]).i]=l.x(e);return u.join("")}},d3.interpolateTransform=function(e,t){var n=[],r=[],i,s=d3.transform(e),o=d3.transform(t),u=s.translate,a=o.translate,f=s.rotate,l=o.rotate,c=s.skew,h=o.skew,p=s.scale,d=o.scale;return u[0]!=a[0]||u[1]!=a[1]?(n.push("translate(",null,",",null,")"),r.push({i:1,x:d3.interpolateNumber(u[0],a[0])},{i:3,x:d3.interpolateNumber(u[1],a[1])})):a[0]||a[1]?n.push("translate("+a+")"):n.push(""),f!=l?(f-l>180?l+=360:l-f>180&&(f+=360),r.push({i:n.push(n.pop()+"rotate(",null,")")-2,x:d3.interpolateNumber(f,l)})):l&&n.push(n.pop()+"rotate("+l+")"),c!=h?r.push({i:n.push(n.pop()+"skewX(",null,")")-2,x:d3.interpolateNumber(c,h)}):h&&n.push(n.pop()+"skewX("+h+")"),p[0]!=d[0]||p[1]!=d[1]?(i=n.push(n.pop()+"scale(",null,",",null,")"),r.push({i:i-4,x:d3.interpolateNumber(p[0],d[0])},{i:i-2,x:d3.interpolateNumber(p[1],d[1])})):(d[0]!=1||d[1]!=1)&&n.push(n.pop()+"scale("+d+")"),i=r.length,function(e){var t=-1,s;while(++t<i)n[(s=r[t]).i]=s.x(e);return n.join("")}},d3.interpolateRgb=function(e,t){e=d3.rgb(e),t=d3.rgb(t);var n=e.r,r=e.g,i=e.b,s=t.r-n,o=t.g-r,u=t.b-i;return function(e){return"#"+W(Math.round(n+s*e))+W(Math.round(r+o*e))+W(Math.round(i+u*e))}},d3.interpolateHsl=function(e,t){e=d3.hsl(e),t=d3.hsl(t);var n=e.h,r=e.s,i=e.l,s=t.h-n,o=t.s-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return Y(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateLab=function(e,t){e=d3.lab(e),t=d3.lab(t);var n=e.l,r=e.a,i=e.b,s=t.l-n,o=t.a-r,u=t.b-i;return function(e){return it(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateHcl=function(e,t){e=d3.hcl(e),t=d3.hcl(t);var n=e.h,r=e.c,i=e.l,s=t.h-n,o=t.c-r,u=t.l-i;return s>180?s-=360:s<-180&&(s+=360),function(e){return tt(n+s*e,r+o*e,i+u*e)+""}},d3.interpolateArray=function(e,t){var n=[],r=[],i=e.length,s=t.length,o=Math.min(e.length,t.length),u;for(u=0;u<o;++u)n.push(d3.interpolate(e[u],t[u]));for(;u<i;++u)r[u]=e[u];for(;u<s;++u)r[u]=t[u];return function(e){for(u=0;u<o;++u)r[u]=n[u](e);return r}},d3.interpolateObject=function(e,t){var n={},r={},i;for(i in e)i in t?n[i]=F(i)(e[i],t[i]):r[i]=e[i];for(i in t)i in e||(r[i]=t[i]);return function(e){for(i in n)r[i]=n[i](e);return r}};var hs=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;d3.interpolators=[d3.interpolateObject,function(e,t){return t instanceof Array&&d3.interpolateArray(e,t)},function(e,t){return(typeof e=="string"||typeof t=="string")&&d3.interpolateString(e+"",t+"")},function(e,t){return(typeof t=="string"?ds.has(t)||/^(#|rgb\(|hsl\()/.test(t):t instanceof R)&&d3.interpolateRgb(e,t)},function(e,t){return!isNaN(e=+e)&&!isNaN(t=+t)&&d3.interpolateNumber(e,t)}],R.prototype.toString=function(){return this.rgb()+""},d3.rgb=function(e,t,n){return arguments.length===1?e instanceof z?U(e.r,e.g,e.b):X(""+e,U,Y):U(~~e,~~t,~~n)};var ps=z.prototype=new R;ps.brighter=function(e){e=Math.pow(.7,arguments.length?e:1);var t=this.r,n=this.g,r=this.b,i=30;return!t&&!n&&!r?U(i,i,i):(t&&t<i&&(t=i),n&&n<i&&(n=i),r&&r<i&&(r=i),U(Math.min(255,Math.floor(t/e)),Math.min(255,Math.floor(n/e)),Math.min(255,Math.floor(r/e))))},ps.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),U(Math.floor(e*this.r),Math.floor(e*this.g),Math.floor(e*this.b))},ps.hsl=function(){return V(this.r,this.g,this.b)},ps.toString=function(){return"#"+W(this.r)+W(this.g)+W(this.b)};var ds=d3.map({aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"});ds.forEach(function(e,t){ds.set(e,X(t,U,Y))}),d3.hsl=function(e,t,n){return arguments.length===1?e instanceof G?Q(e.h,e.s,e.l):X(""+e,V,Q):Q(+e,+t,+n)};var vs=G.prototype=new R;vs.brighter=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,this.l/e)},vs.darker=function(e){return e=Math.pow(.7,arguments.length?e:1),Q(this.h,this.s,e*this.l)},vs.rgb=function(){return Y(this.h,this.s,this.l)},d3.hcl=function(e,t,n){return arguments.length===1?e instanceof et?Z(e.h,e.c,e.l):e instanceof rt?st(e.l,e.a,e.b):st((e=$((e=d3.rgb(e)).r,e.g,e.b)).l,e.a,e.b):Z(+e,+t,+n)};var ms=et.prototype=new R;ms.brighter=function(e){return Z(this.h,this.c,Math.min(100,this.l+gs*(arguments.length?e:1)))},ms.darker=function(e){return Z(this.h,this.c,Math.max(0,this.l-gs*(arguments.length?e:1)))},ms.rgb=function(){return tt(this.h,this.c,this.l).rgb()},d3.lab=function(e,t,n){return arguments.length===1?e instanceof rt?nt(e.l,e.a,e.b):e instanceof et?tt(e.l,e.c,e.h):$((e=d3.rgb(e)).r,e.g,e.b):nt(+e,+t,+n)};var gs=18,ys=.95047,bs=1,ws=1.08883,Es=rt.prototype=new R;Es.brighter=function(e){return nt(Math.min(100,this.l+gs*(arguments.length?e:1)),this.a,this.b)},Es.darker=function(e){return nt(Math.max(0,this.l-gs*(arguments.length?e:1)),this.a,this.b)},Es.rgb=function(){return it(this.l,this.a,this.b)};var Ss=function(e,t){return t.querySelector(e)},xs=function(e,t){return t.querySelectorAll(e)},Ts=document.documentElement,Ns=Ts.matchesSelector||Ts.webkitMatchesSelector||Ts.mozMatchesSelector||Ts.msMatchesSelector||Ts.oMatchesSelector,Cs=function(e,t){return Ns.call(e,t)};typeof Sizzle=="function"&&(Ss=function(e,t){return Sizzle(e,t)[0]||null},xs=function(e,t){return Sizzle.uniqueSort(Sizzle(e,t))},Cs=Sizzle.matchesSelector);var ks=[];d3.selection=function(){return Ls},d3.selection.prototype=ks,ks.select=function(e){var t=[],n,r,i,s;typeof e!="function"&&(e=lt(e));for(var o=-1,u=this.length;++o<u;){t.push(n=[]),n.parentNode=(i=this[o]).parentNode;for(var a=-1,f=i.length;++a<f;)(s=i[a])?(n.push(r=e.call(s,s.__data__,a)),r&&"__data__"in s&&(r.__data__=s.__data__)):n.push(null)}return ft(t)},ks.selectAll=function(e){var t=[],n,r;typeof e!="function"&&(e=ct(e));for(var i=-1,s=this.length;++i<s;)for(var o=this[i],u=-1,a=o.length;++u<a;)if(r=o[u])t.push(n=Ji(e.call(r,r.__data__,u))),n.parentNode=r;return ft(t)},ks.attr=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node();return e=d3.ns.qualify(e),e.local?n.getAttributeNS(e.space,e.local):n.getAttribute(e)}for(t in e)this.each(ht(t,e[t]));return this}return this.each(ht(e,t))},ks.classed=function(e,t){if(arguments.length<2){if(typeof e=="string"){var n=this.node(),r=(e=e.trim().split(/^|\s+/g)).length,i=-1;if(t=n.classList){while(++i<r)if(!t.contains(e[i]))return!1}else{t=n.className,t.baseVal!=null&&(t=t.baseVal);while(++i<r)if(!pt(e[i]).test(t))return!1}return!0}for(t in e)this.each(dt(t,e[t]));return this}return this.each(dt(e,t))},ks.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.each(mt(n,e[n],t));return this}if(r<2)return window.getComputedStyle(this.node(),null).getPropertyValue(e);n=""}return this.each(mt(e,t,n))},ks.property=function(e,t){if(arguments.length<2){if(typeof e=="string")return this.node()[e];for(t in e)this.each(gt(t,e[t]));return this}return this.each(gt(e,t))},ks.text=function(e){return arguments.length<1?this.node().textContent:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.textContent=t==null?"":t}:e==null?function(){this.textContent=""}:function(){this.textContent=e})},ks.html=function(e){return arguments.length<1?this.node().innerHTML:this.each(typeof e=="function"?function(){var t=e.apply(this,arguments);this.innerHTML=t==null?"":t}:e==null?function(){this.innerHTML=""}:function(){this.innerHTML=e})},ks.append=function(e){function t(){return this.appendChild(document.createElementNS(this.namespaceURI,e))}function n(){return this.appendChild(document.createElementNS(e.space,e.local))}return e=d3.ns.qualify(e),this.select(e.local?n:t)},ks.insert=function(e,t){function n(){return this.insertBefore(document.createElementNS(this.namespaceURI,e),Ss(t,this))}function r(){return this.insertBefore(document.createElementNS(e.space,e.local),Ss(t,this))}return e=d3.ns.qualify(e),this.select(e.local?r:n)},ks.remove=function(){return this.each(function(){var e=this.parentNode;e&&e.removeChild(this)})},ks.data=function(e,t){function n(e,n){var i,s=e.length,o=n.length,u=Math.min(s,o),c=Math.max(s,o),h=[],p=[],d=[],v,m;if(t){var g=new r,y=[],b,w=n.length;for(i=-1;++i<s;)b=t.call(v=e[i],v.__data__,i),g.has(b)?d[w++]=v:g.set(b,v),y.push(b);for(i=-1;++i<o;)b=t.call(n,m=n[i],i),g.has(b)?(h[i]=v=g.get(b),v.__data__=m,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null),g.remove(b);for(i=-1;++i<s;)g.has(y[i])&&(d[i]=e[i])}else{for(i=-1;++i<u;)v=e[i],m=n[i],v?(v.__data__=m,h[i]=v,p[i]=d[i]=null):(p[i]=yt(m),h[i]=d[i]=null);for(;i<o;++i)p[i]=yt(n[i]),h[i]=d[i]=null;for(;i<c;++i)d[i]=e[i],p[i]=h[i]=null}p.update=h,p.parentNode=h.parentNode=d.parentNode=e.parentNode,a.push(p),f.push(h),l.push(d)}var i=-1,s=this.length,o,u;if(!arguments.length){e=new Array(s=(o=this[0]).length);while(++i<s)if(u=o[i])e[i]=u.__data__;return e}var a=xt([]),f=ft([]),l=ft([]);if(typeof e=="function")while(++i<s)n(o=this[i],e.call(o,o.parentNode.__data__,i));else while(++i<s)n(o=this[i],e);return f.enter=function(){return a},f.exit=function(){return l},f},ks.datum=ks.map=function(e){return arguments.length<1?this.property("__data__"):this.property("__data__",e)},ks.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]),n.parentNode=(r=this[s]).parentNode;for(var u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i,i.__data__,u)&&n.push(i)}return ft(t)},ks.order=function(){for(var e=-1,t=this.length;++e<t;)for(var n=this[e],r=n.length-1,i=n[r],s;--r>=0;)if(s=n[r])i&&i!==s.nextSibling&&i.parentNode.insertBefore(s,i),i=s;return this},ks.sort=function(e){e=wt.apply(this,arguments);for(var t=-1,n=this.length;++t<n;)this[t].sort(e);return this.order()},ks.on=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t=!1);for(n in e)this.each(Et(n,e[n],t));return this}if(r<2)return(r=this.node()["__on"+e])&&r._;n=!1}return this.each(Et(e,t,n))},ks.each=function(e){return St(this,function(t,n,r){e.call(t,t.__data__,n,r)})},ks.call=function(e){return e.apply(this,(arguments[0]=this,arguments)),this},ks.empty=function(){return!this.node()},ks.node=function(e){for(var t=0,n=this.length;t<n;t++)for(var r=this[t],i=0,s=r.length;i<s;i++){var o=r[i];if(o)return o}return null},ks.transition=function(){var e=[],t,n;for(var r=-1,i=this.length;++r<i;){e.push(t=[]);for(var s=this[r],o=-1,u=s.length;++o<u;)t.push((n=s[o])?{node:n,delay:Bs,duration:js}:null)}return Tt(e,_s||++Ms,Date.now())};var Ls=ft([[document]]);Ls[0].parentNode=Ts,d3.select=function(e){return typeof e=="string"?Ls.select(e):ft([[e]])},d3.selectAll=function(e){return typeof e=="string"?Ls.selectAll(e):ft([Ji(e)])};var As=[];d3.selection.enter=xt,d3.selection.enter.prototype=As,As.append=ks.append,As.insert=ks.insert,As.empty=ks.empty,As.node=ks.node,As.select=function(e){var t=[],n,r,i,s,o;for(var u=-1,a=this.length;++u<a;){i=(s=this[u]).update,t.push(n=[]),n.parentNode=s.parentNode;for(var f=-1,l=s.length;++f<l;)(o=s[f])?(n.push(i[f]=r=e.call(s.parentNode,o.__data__,f)),r.__data__=o.__data__):n.push(null)}return ft(t)};var Os=[],Ms=0,_s=0,Ds=0,Ps=250,Hs=d3.ease("cubic-in-out"),Bs=Ds,js=Ps,Fs=Hs;Os.call=ks.call,d3.transition=function(e){return arguments.length?_s?e.transition():e:Ls.transition()},d3.transition.prototype=Os,Os.select=function(e){var t=[],n,r,i;typeof e!="function"&&(e=lt(e));for(var s=-1,o=this.length;++s<o;){t.push(n=[]);for(var u=this[s],a=-1,f=u.length;++a<f;)(i=u[a])&&(r=e.call(i.node,i.node.__data__,a))?("__data__"in i.node&&(r.__data__=i.node.__data__),n.push({node:r,delay:i.delay,duration:i.duration})):n.push(null)}return Tt(t,this.id,this.time).ease(this.ease())},Os.selectAll=function(e){var t=[],n,r,i;typeof e!="function"&&(e=ct(e));for(var s=-1,o=this.length;++s<o;)for(var u=this[s],a=-1,f=u.length;++a<f;)if(i=u[a]){r=e.call(i.node,i.node.__data__,a),t.push(n=[]);for(var l=-1,c=r.length;++l<c;)n.push({node:r[l],delay:i.delay,duration:i.duration})}return Tt(t,this.id,this.time).ease(this.ease())},Os.filter=function(e){var t=[],n,r,i;typeof e!="function"&&(e=bt(e));for(var s=0,o=this.length;s<o;s++){t.push(n=[]);for(var r=this[s],u=0,a=r.length;u<a;u++)(i=r[u])&&e.call(i.node,i.node.__data__,u)&&n.push(i)}return Tt(t,this.id,this.time).ease(this.ease())},Os.attr=function(e,t){if(arguments.length<2){for(t in e)this.attrTween(t,kt(e[t],t));return this}return this.attrTween(e,kt(t,e))},Os.attrTween=function(e,t){function n(e,n){var r=t.call(this,e,n,this.getAttribute(i));return r===Is?(this.removeAttribute(i),null):r&&function(e){this.setAttribute(i,r(e))}}function r(e,n){var r=t.call(this,e,n,this.getAttributeNS(i.space,i.local));return r===Is?(this.removeAttributeNS(i.space,i.local),null):r&&function(e){this.setAttributeNS(i.space,i.local,r(e))}}var i=d3.ns.qualify(e);return this.tween("attr."+e,i.local?r:n)},Os.style=function(e,t,n){var r=arguments.length;if(r<3){if(typeof e!="string"){r<2&&(t="");for(n in e)this.styleTween(n,kt(e[n],n),t);return this}n=""}return this.styleTween(e,kt(t,e),n)},Os.styleTween=function(e,t,n){return arguments.length<3&&(n=""),this.tween("style."+e,function(r,i){var s=t.call(this,r,i,window.getComputedStyle(this,null).getPropertyValue(e));return s===Is?(this.style.removeProperty(e),null):s&&function(t){this.style.setProperty(e,s(t),n)}})},Os.text=function(e){return this.tween("text",function(t,n){this.textContent=typeof e=="function"?e.call(this,t,n):e})},Os.remove=function(){return this.each("end.transition",function(){var e;!this.__transition__&&(e=this.parentNode)&&e.removeChild(this)})},Os.delay=function(e){return St(this,typeof e=="function"?function(t,n,r){t.delay=e.call(t=t.node,t.__data__,n,r)|0}:(e|=0,function(t){t.delay=e}))},Os.duration=function(e){return St(this,typeof e=="function"?function(t,n,r){t.duration=Math.max(1,e.call(t=t.node,t.__data__,n,r)|0)}:(e=Math.max(1,e|0),function(t){t.duration=e}))},Os.transition=function(){return this.select(s)},d3.tween=function(e,t){function n(n,r,i){var s=e.call(this,n,r);return s==null?i!=""&&Is:i!=s&&t(i,s+"")}function r(n,r,i){return i!=e&&t(i,e)}return typeof e=="function"?n:e==null?Ct:(e+="",r)};var Is={},qs=0,Rs={},Us=null,zs,Ws;d3.timer=function(e,t,n){if(arguments.length<3){if(arguments.length<2)t=0;else if(!isFinite(t))return;n=Date.now()}var r=Rs[e.id];r&&r.callback===e?(r.then=n,r.delay=t):Rs[e.id=++qs]=Us={callback:e,then:n,delay:t,next:Us},zs||(Ws=clearTimeout(Ws),zs=1,Xs(Lt))},d3.timer.flush=function(){var e,t=Date.now(),n=Us;while(n)e=t-n.then,n.delay||(n.flush=n.callback(e)),n=n.next;At()};var Xs=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout -(e,17)};d3.mouse=function(e){return Ot(e,_())};var Vs=/WebKit/.test(navigator.userAgent)?-1:0;d3.touches=function(e,t){return arguments.length<2&&(t=_().touches),t?Ji(t).map(function(t){var n=Ot(e,t);return n.identifier=t.identifier,n}):[]},d3.scale={},d3.scale.linear=function(){return Bt([0,1],[0,1],d3.interpolate,!1)},d3.scale.log=function(){return Wt(d3.scale.linear(),Xt)};var $s=d3.format(".0e");Xt.pow=function(e){return Math.pow(10,e)},Vt.pow=function(e){return-Math.pow(10,-e)},d3.scale.pow=function(){return $t(d3.scale.linear(),1)},d3.scale.sqrt=function(){return d3.scale.pow().exponent(.5)},d3.scale.ordinal=function(){return Kt([],{t:"range",a:[[]]})},d3.scale.category10=function(){return d3.scale.ordinal().range(Js)},d3.scale.category20=function(){return d3.scale.ordinal().range(Ks)},d3.scale.category20b=function(){return d3.scale.ordinal().range(Qs)},d3.scale.category20c=function(){return d3.scale.ordinal().range(Gs)};var Js=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],Ks=["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],Qs=["#393b79","#5254a3","#6b6ecf","#9c9ede","#637939","#8ca252","#b5cf6b","#cedb9c","#8c6d31","#bd9e39","#e7ba52","#e7cb94","#843c39","#ad494a","#d6616b","#e7969c","#7b4173","#a55194","#ce6dbd","#de9ed6"],Gs=["#3182bd","#6baed6","#9ecae1","#c6dbef","#e6550d","#fd8d3c","#fdae6b","#fdd0a2","#31a354","#74c476","#a1d99b","#c7e9c0","#756bb1","#9e9ac8","#bcbddc","#dadaeb","#636363","#969696","#bdbdbd","#d9d9d9"];d3.scale.quantile=function(){return Qt([],[])},d3.scale.quantize=function(){return Gt(0,1,[0,1])},d3.scale.threshold=function(){return Yt([.5],[0,1])},d3.scale.identity=function(){return Zt([0,1])},d3.svg={},d3.svg.arc=function(){function e(){var e=t.apply(this,arguments),s=n.apply(this,arguments),o=r.apply(this,arguments)+Ys,u=i.apply(this,arguments)+Ys,a=(u<o&&(a=o,o=u,u=a),u-o),f=a<Math.PI?"0":"1",l=Math.cos(o),c=Math.sin(o),h=Math.cos(u),p=Math.sin(u);return a>=Zs?e?"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"M0,"+e+"A"+e+","+e+" 0 1,0 0,"+ -e+"A"+e+","+e+" 0 1,0 0,"+e+"Z":"M0,"+s+"A"+s+","+s+" 0 1,1 0,"+ -s+"A"+s+","+s+" 0 1,1 0,"+s+"Z":e?"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L"+e*h+","+e*p+"A"+e+","+e+" 0 "+f+",0 "+e*l+","+e*c+"Z":"M"+s*l+","+s*c+"A"+s+","+s+" 0 "+f+",1 "+s*h+","+s*p+"L0,0"+"Z"}var t=en,n=tn,r=nn,i=rn;return e.innerRadius=function(n){return arguments.length?(t=u(n),e):t},e.outerRadius=function(t){return arguments.length?(n=u(t),e):n},e.startAngle=function(t){return arguments.length?(r=u(t),e):r},e.endAngle=function(t){return arguments.length?(i=u(t),e):i},e.centroid=function(){var e=(t.apply(this,arguments)+n.apply(this,arguments))/2,s=(r.apply(this,arguments)+i.apply(this,arguments))/2+Ys;return[Math.cos(s)*e,Math.sin(s)*e]},e};var Ys=-Math.PI/2,Zs=2*Math.PI-1e-6;d3.svg.line=function(){return sn(i)};var eo=d3.map({linear:an,"linear-closed":fn,"step-before":ln,"step-after":cn,basis:gn,"basis-open":yn,"basis-closed":bn,bundle:wn,cardinal:dn,"cardinal-open":hn,"cardinal-closed":pn,monotone:Cn});eo.forEach(function(e,t){t.key=e,t.closed=/-closed$/.test(e)});var to=[0,2/3,1/3,0],no=[0,1/3,2/3,0],ro=[0,1/6,2/3,1/6];d3.svg.line.radial=function(){var e=sn(kn);return e.radius=e.x,delete e.x,e.angle=e.y,delete e.y,e},ln.reverse=cn,cn.reverse=ln,d3.svg.area=function(){return Ln(i)},d3.svg.area.radial=function(){var e=Ln(kn);return e.radius=e.x,delete e.x,e.innerRadius=e.x0,delete e.x0,e.outerRadius=e.x1,delete e.x1,e.angle=e.y,delete e.y,e.startAngle=e.y0,delete e.y0,e.endAngle=e.y1,delete e.y1,e},d3.svg.chord=function(){function e(e,u){var a=t(this,s,e,u),f=t(this,o,e,u);return"M"+a.p0+r(a.r,a.p1,a.a1-a.a0)+(n(a,f)?i(a.r,a.p1,a.r,a.p0):i(a.r,a.p1,f.r,f.p0)+r(f.r,f.p1,f.a1-f.a0)+i(f.r,f.p1,a.r,a.p0))+"Z"}function t(e,t,n,r){var i=t.call(e,n,r),s=a.call(e,i,r),o=f.call(e,i,r)+Ys,u=l.call(e,i,r)+Ys;return{r:s,a0:o,a1:u,p0:[s*Math.cos(o),s*Math.sin(o)],p1:[s*Math.cos(u),s*Math.sin(u)]}}function n(e,t){return e.a0==t.a0&&e.a1==t.a1}function r(e,t,n){return"A"+e+","+e+" 0 "+ +(n>Math.PI)+",1 "+t}function i(e,t,n,r){return"Q 0,0 "+r}var s=An,o=On,a=Mn,f=nn,l=rn;return e.radius=function(t){return arguments.length?(a=u(t),e):a},e.source=function(t){return arguments.length?(s=u(t),e):s},e.target=function(t){return arguments.length?(o=u(t),e):o},e.startAngle=function(t){return arguments.length?(f=u(t),e):f},e.endAngle=function(t){return arguments.length?(l=u(t),e):l},e},d3.svg.diagonal=function(){function e(e,i){var s=t.call(this,e,i),o=n.call(this,e,i),u=(s.y+o.y)/2,a=[s,{x:s.x,y:u},{x:o.x,y:u},o];return a=a.map(r),"M"+a[0]+"C"+a[1]+" "+a[2]+" "+a[3]}var t=An,n=On,r=Pn;return e.source=function(n){return arguments.length?(t=u(n),e):t},e.target=function(t){return arguments.length?(n=u(t),e):n},e.projection=function(t){return arguments.length?(r=t,e):r},e},d3.svg.diagonal.radial=function(){var e=d3.svg.diagonal(),t=Pn,n=e.projection;return e.projection=function(e){return arguments.length?n(Hn(t=e)):t},e},d3.svg.mouse=d3.mouse,d3.svg.touches=d3.touches,d3.svg.symbol=function(){function e(e,r){return(io.get(t.call(this,e,r))||Fn)(n.call(this,e,r))}var t=jn,n=Bn;return e.type=function(n){return arguments.length?(t=u(n),e):t},e.size=function(t){return arguments.length?(n=u(t),e):n},e};var io=d3.map({circle:Fn,cross:function(e){var t=Math.sqrt(e/5)/2;return"M"+ -3*t+","+ -t+"H"+ -t+"V"+ -3*t+"H"+t+"V"+ -t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+ -t+"V"+t+"H"+ -3*t+"Z"},diamond:function(e){var t=Math.sqrt(e/(2*oo)),n=t*oo;return"M0,"+ -t+"L"+n+",0"+" 0,"+t+" "+ -n+",0"+"Z"},square:function(e){var t=Math.sqrt(e)/2;return"M"+ -t+","+ -t+"L"+t+","+ -t+" "+t+","+t+" "+ -t+","+t+"Z"},"triangle-down":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+n+"L"+t+","+ -n+" "+ -t+","+ -n+"Z"},"triangle-up":function(e){var t=Math.sqrt(e/so),n=t*so/2;return"M0,"+ -n+"L"+t+","+n+" "+ -t+","+n+"Z"}});d3.svg.symbolTypes=io.keys();var so=Math.sqrt(3),oo=Math.tan(30*Math.PI/180);d3.svg.axis=function(){function e(e){e.each(function(){var e=d3.select(this),c=a==null?t.ticks?t.ticks.apply(t,u):t.domain():a,h=f==null?t.tickFormat?t.tickFormat.apply(t,u):String:f,p=Rn(t,c,l),d=e.selectAll(".minor").data(p,String),v=d.enter().insert("line","g").attr("class","tick minor").style("opacity",1e-6),m=d3.transition(d.exit()).style("opacity",1e-6).remove(),g=d3.transition(d).style("opacity",1),y=e.selectAll("g").data(c,String),b=y.enter().insert("g","path").style("opacity",1e-6),w=d3.transition(y.exit()).style("opacity",1e-6).remove(),E=d3.transition(y).style("opacity",1),S,x=Dt(t),T=e.selectAll(".domain").data([0]),N=T.enter().append("path").attr("class","domain"),C=d3.transition(T),k=t.copy(),L=this.__chart__||k;this.__chart__=k,b.append("line").attr("class","tick"),b.append("text");var A=b.select("line"),O=E.select("line"),M=y.select("text").text(h),_=b.select("text"),D=E.select("text");switch(n){case"bottom":S=In,v.attr("y2",i),g.attr("x2",0).attr("y2",i),A.attr("y2",r),_.attr("y",Math.max(r,0)+o),O.attr("x2",0).attr("y2",r),D.attr("x",0).attr("y",Math.max(r,0)+o),M.attr("dy",".71em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+s+"V0H"+x[1]+"V"+s);break;case"top":S=In,v.attr("y2",-i),g.attr("x2",0).attr("y2",-i),A.attr("y2",-r),_.attr("y",-(Math.max(r,0)+o)),O.attr("x2",0).attr("y2",-r),D.attr("x",0).attr("y",-(Math.max(r,0)+o)),M.attr("dy","0em").attr("text-anchor","middle"),C.attr("d","M"+x[0]+","+ -s+"V0H"+x[1]+"V"+ -s);break;case"left":S=qn,v.attr("x2",-i),g.attr("x2",-i).attr("y2",0),A.attr("x2",-r),_.attr("x",-(Math.max(r,0)+o)),O.attr("x2",-r).attr("y2",0),D.attr("x",-(Math.max(r,0)+o)).attr("y",0),M.attr("dy",".32em").attr("text-anchor","end"),C.attr("d","M"+ -s+","+x[0]+"H0V"+x[1]+"H"+ -s);break;case"right":S=qn,v.attr("x2",i),g.attr("x2",i).attr("y2",0),A.attr("x2",r),_.attr("x",Math.max(r,0)+o),O.attr("x2",r).attr("y2",0),D.attr("x",Math.max(r,0)+o).attr("y",0),M.attr("dy",".32em").attr("text-anchor","start"),C.attr("d","M"+s+","+x[0]+"H0V"+x[1]+"H"+s)}if(t.ticks)b.call(S,L),E.call(S,k),w.call(S,k),v.call(S,L),g.call(S,k),m.call(S,k);else{var P=k.rangeBand()/2,H=function(e){return k(e)+P};b.call(S,H),E.call(S,H)}})}var t=d3.scale.linear(),n="bottom",r=6,i=6,s=6,o=3,u=[10],a=null,f,l=0;return e.scale=function(n){return arguments.length?(t=n,e):t},e.orient=function(t){return arguments.length?(n=t,e):n},e.ticks=function(){return arguments.length?(u=arguments,e):u},e.tickValues=function(t){return arguments.length?(a=t,e):a},e.tickFormat=function(t){return arguments.length?(f=t,e):f},e.tickSize=function(t,n,o){if(!arguments.length)return r;var u=arguments.length-1;return r=+t,i=u>1?+n:r,s=u>0?+arguments[u]:r,e},e.tickPadding=function(t){return arguments.length?(o=+t,e):o},e.tickSubdivide=function(t){return arguments.length?(l=+t,e):l},e},d3.svg.brush=function(){function e(s){s.each(function(){var s=d3.select(this),f=s.selectAll(".background").data([0]),l=s.selectAll(".extent").data([0]),c=s.selectAll(".resize").data(a,String),h;s.style("pointer-events","all").on("mousedown.brush",i).on("touchstart.brush",i),f.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),l.enter().append("rect").attr("class","extent").style("cursor","move"),c.enter().append("g").attr("class",function(e){return"resize "+e}).style("cursor",function(e){return uo[e]}).append("rect").attr("x",function(e){return/[ew]$/.test(e)?-3:null}).attr("y",function(e){return/^[ns]/.test(e)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),c.style("display",e.empty()?"none":null),c.exit().remove(),o&&(h=Dt(o),f.attr("x",h[0]).attr("width",h[1]-h[0]),n(s)),u&&(h=Dt(u),f.attr("y",h[0]).attr("height",h[1]-h[0]),r(s)),t(s)})}function t(e){e.selectAll(".resize").attr("transform",function(e){return"translate("+f[+/e$/.test(e)][0]+","+f[+/^s/.test(e)][1]+")"})}function n(e){e.select(".extent").attr("x",f[0][0]),e.selectAll(".extent,.n>rect,.s>rect").attr("width",f[1][0]-f[0][0])}function r(e){e.select(".extent").attr("y",f[0][1]),e.selectAll(".extent,.e>rect,.w>rect").attr("height",f[1][1]-f[0][1])}function i(){function i(){var e=d3.event.changedTouches;return e?d3.touches(v,e)[0]:d3.mouse(v)}function a(){d3.event.keyCode==32&&(S||(x=null,T[0]-=f[1][0],T[1]-=f[1][1],S=2),M())}function c(){d3.event.keyCode==32&&S==2&&(T[0]+=f[1][0],T[1]+=f[1][1],S=0,M())}function h(){var e=i(),s=!1;N&&(e[0]+=N[0],e[1]+=N[1]),S||(d3.event.altKey?(x||(x=[(f[0][0]+f[1][0])/2,(f[0][1]+f[1][1])/2]),T[0]=f[+(e[0]<x[0])][0],T[1]=f[+(e[1]<x[1])][1]):x=null),w&&p(e,o,0)&&(n(y),s=!0),E&&p(e,u,1)&&(r(y),s=!0),s&&(t(y),g({type:"brush",mode:S?"move":"resize"}))}function p(e,t,n){var r=Dt(t),i=r[0],s=r[1],o=T[n],u=f[1][n]-f[0][n],a,c;S&&(i-=o,s-=u+o),a=Math.max(i,Math.min(s,e[n])),S?c=(a+=o)+u:(x&&(o=Math.max(i,Math.min(s,2*x[n]-a))),o<a?(c=a,a=o):c=o);if(f[0][n]!==a||f[1][n]!==c)return l=null,f[0][n]=a,f[1][n]=c,!0}function d(){h(),y.style("pointer-events","all").selectAll(".resize").style("display",e.empty()?"none":null),d3.select("body").style("cursor",null),C.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),g({type:"brushend"}),M()}var v=this,m=d3.select(d3.event.target),g=s.of(v,arguments),y=d3.select(v),b=m.datum(),w=!/^(n|s)$/.test(b)&&o,E=!/^(e|w)$/.test(b)&&u,S=m.classed("extent"),x,T=i(),N,C=d3.select(window).on("mousemove.brush",h).on("mouseup.brush",d).on("touchmove.brush",h).on("touchend.brush",d).on("keydown.brush",a).on("keyup.brush",c);if(S)T[0]=f[0][0]-T[0],T[1]=f[0][1]-T[1];else if(b){var k=+/w$/.test(b),L=+/^n/.test(b);N=[f[1-k][0]-T[0],f[1-L][1]-T[1]],T[0]=f[k][0],T[1]=f[L][1]}else d3.event.altKey&&(x=T.slice());y.style("pointer-events","none").selectAll(".resize").style("display",null),d3.select("body").style("cursor",m.style("cursor")),g({type:"brushstart"}),h(),M()}var s=D(e,"brushstart","brush","brushend"),o=null,u=null,a=ao[0],f=[[0,0],[0,0]],l;return e.x=function(t){return arguments.length?(o=t,a=ao[!o<<1|!u],e):o},e.y=function(t){return arguments.length?(u=t,a=ao[!o<<1|!u],e):u},e.extent=function(t){var n,r,i,s,a;return arguments.length?(l=[[0,0],[0,0]],o&&(n=t[0],r=t[1],u&&(n=n[0],r=r[0]),l[0][0]=n,l[1][0]=r,o.invert&&(n=o(n),r=o(r)),r<n&&(a=n,n=r,r=a),f[0][0]=n|0,f[1][0]=r|0),u&&(i=t[0],s=t[1],o&&(i=i[1],s=s[1]),l[0][1]=i,l[1][1]=s,u.invert&&(i=u(i),s=u(s)),s<i&&(a=i,i=s,s=a),f[0][1]=i|0,f[1][1]=s|0),e):(t=l||f,o&&(n=t[0][0],r=t[1][0],l||(n=f[0][0],r=f[1][0],o.invert&&(n=o.invert(n),r=o.invert(r)),r<n&&(a=n,n=r,r=a))),u&&(i=t[0][1],s=t[1][1],l||(i=f[0][1],s=f[1][1],u.invert&&(i=u.invert(i),s=u.invert(s)),s<i&&(a=i,i=s,s=a))),o&&u?[[n,i],[r,s]]:o?[n,r]:u&&[i,s])},e.clear=function(){return l=null,f[0][0]=f[0][1]=f[1][0]=f[1][1]=0,e},e.empty=function(){return o&&f[0][0]===f[1][0]||u&&f[0][1]===f[1][1]},d3.rebind(e,s,"on")};var uo={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},ao=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]];d3.behavior={},d3.behavior.drag=function(){function e(){this.on("mousedown.drag",t).on("touchstart.drag",t)}function t(){function e(){var e=o.parentNode;return f?d3.touches(e).filter(function(e){return e.identifier===f})[0]:d3.mouse(e)}function t(){if(!o.parentNode)return i();var t=e(),n=t[0]-c[0],r=t[1]-c[1];h|=n|r,c=t,M(),u({type:"drag",x:t[0]+l[0],y:t[1]+l[1],dx:n,dy:r})}function i(){u({type:"dragend"}),h&&(M(),d3.event.target===a&&p.on("click.drag",s,!0)),p.on(f?"touchmove.drag-"+f:"mousemove.drag",null).on(f?"touchend.drag-"+f:"mouseup.drag",null)}function s(){M(),p.on("click.drag",null)}var o=this,u=n.of(o,arguments),a=d3.event.target,f=d3.event.touches&&d3.event.changedTouches[0].identifier,l,c=e(),h=0,p=d3.select(window).on(f?"touchmove.drag-"+f:"mousemove.drag",t).on(f?"touchend.drag-"+f:"mouseup.drag",i,!0);r?(l=r.apply(o,arguments),l=[l.x-c[0],l.y-c[1]]):l=[0,0],f||M(),u({type:"dragstart"})}var n=D(e,"drag","dragstart","dragend"),r=null;return e.origin=function(t){return arguments.length?(r=t,e):r},d3.rebind(e,n,"on")},d3.behavior.zoom=function(){function e(){this.on("mousedown.zoom",o).on("mousewheel.zoom",u).on("mousemove.zoom",a).on("DOMMouseScroll.zoom",u).on("dblclick.zoom",f).on("touchstart.zoom",l).on("touchmove.zoom",c).on("touchend.zoom",l)}function t(e){return[(e[0]-h[0])/d,(e[1]-h[1])/d]}function n(e){return[e[0]*d+h[0],e[1]*d+h[1]]}function r(e){d=Math.max(m[0],Math.min(m[1],e))}function i(e,t){t=n(t),h[0]+=e[0]-t[0],h[1]+=e[1]-t[1]}function s(e){b&&b.domain(y.range().map(function(e){return(e-h[0])/d}).map(y.invert)),E&&E.domain(w.range().map(function(e){return(e-h[1])/d}).map(w.invert)),d3.event.preventDefault(),e({type:"zoom",scale:d,translate:h})}function o(){function e(){f=1,i(d3.mouse(o),c),s(u)}function n(){f&&M(),l.on("mousemove.zoom",null).on("mouseup.zoom",null),f&&d3.event.target===a&&l.on("click.zoom",r,!0)}function r(){M(),l.on("click.zoom",null)}var o=this,u=g.of(o,arguments),a=d3.event.target,f=0,l=d3.select(window).on("mousemove.zoom",e).on("mouseup.zoom",n),c=t(d3.mouse(o));window.focus(),M()}function u(){p||(p=t(d3.mouse(this))),r(Math.pow(2,Un()*.002)*d),i(d3.mouse(this),p),s(g.of(this,arguments))}function a(){p=null}function f(){var e=d3.mouse(this),n=t(e);r(d3.event.shiftKey?d/2:d*2),i(e,n),s(g.of(this,arguments))}function l(){var e=d3.touches(this),n=Date.now();v=d,p={},e.forEach(function(e){p[e.identifier]=t(e)}),M();if(e.length===1){if(n-S<500){var o=e[0],u=t(e[0]);r(d*2),i(o,u),s(g.of(this,arguments))}S=n}}function c(){var e=d3.touches(this),t=e[0],n=p[t.identifier];if(o=e[1]){var o,u=p[o.identifier];t=[(t[0]+o[0])/2,(t[1]+o[1])/2],n=[(n[0]+u[0])/2,(n[1]+u[1])/2],r(d3.event.scale*v)}i(t,n),S=null,s(g.of(this,arguments))}var h=[0,0],p,d=1,v,m=lo,g=D(e,"zoom"),y,b,w,E,S;return e.translate=function(t){return arguments.length?(h=t.map(Number),e):h},e.scale=function(t){return arguments.length?(d=+t,e):d},e.scaleExtent=function(t){return arguments.length?(m=t==null?lo:t.map(Number),e):m},e.x=function(t){return arguments.length?(b=t,y=t.copy(),e):b},e.y=function(t){return arguments.length?(E=t,w=t.copy(),e):E},d3.rebind(e,g,"on")};var fo,lo=[0,Infinity];d3.layout={},d3.layout.bundle=function(){return function(e){var t=[],n=-1,r=e.length;while(++n<r)t.push(zn(e[n]));return t}},d3.layout.chord=function(){function e(){var e={},n=[],c=d3.range(o),h=[],p,d,v,m,g;r=[],i=[],p=0,m=-1;while(++m<o){d=0,g=-1;while(++g<o)d+=s[m][g];n.push(d),h.push(d3.range(o)),p+=d}a&&c.sort(function(e,t){return a(n[e],n[t])}),f&&h.forEach(function(e,t){e.sort(function(e,n){return f(s[t][e],s[t][n])})}),p=(2*Math.PI-u*o)/p,d=0,m=-1;while(++m<o){v=d,g=-1;while(++g<o){var y=c[m],b=h[y][g],w=s[y][b],E=d,S=d+=w*p;e[y+"-"+b]={index:y,subindex:b,startAngle:E,endAngle:S,value:w}}i[y]={index:y,startAngle:v,endAngle:d,value:(d-v)/p},d+=u}m=-1;while(++m<o){g=m-1;while(++g<o){var x=e[m+"-"+g],T=e[g+"-"+m];(x.value||T.value)&&r.push(x.value<T.value?{source:T,target:x}:{source:x,target:T})}}l&&t()}function t(){r.sort(function(e,t){return l((e.source.value+e.target.value)/2,(t.source.value+t.target.value)/2)})}var n={},r,i,s,o,u=0,a,f,l;return n.matrix=function(e){return arguments.length?(o=(s=e)&&s.length,r=i=null,n):s},n.padding=function(e){return arguments.length?(u=e,r=i=null,n):u},n.sortGroups=function(e){return arguments.length?(a=e,r=i=null,n):a},n.sortSubgroups=function(e){return arguments.length?(f=e,r=null,n):f},n.sortChords=function(e){return arguments.length?(l=e,r&&t(),n):l},n.chords=function(){return r||e(),r},n.groups=function(){return i||e(),i},n},d3.layout.force=function(){function e(e){return function(t,n,r,i,s){if(t.point!==e){var o=t.cx-e.x,u=t.cy-e.y,a=1/Math.sqrt(o*o+u*u);if((i-n)*a<d){var f=t.charge*a*a;return e.px-=o*f,e.py-=u*f,!0}if(t.point&&isFinite(a)){var f=t.pointCharge*a*a;e.px-=o*f,e.py-=u*f}}return!t.charge}}function t(e){e.px=d3.event.x,e.py=d3.event.y,n.resume()}var n={},r=d3.dispatch("start","tick","end"),s=[1,1],o,a,f=.9,l=Gn,c=Yn,h=-30,p=.1,d=.8,v,m=[],g=[],y,b,w;return n.tick=function(){if((a*=.99)<.005)return r.end({type:"end",alpha:a=0}),!0;var t=m.length,n=g.length,i,o,u,l,c,d,v,E,S;for(o=0;o<n;++o){u=g[o],l=u.source,c=u.target,E=c.x-l.x,S=c.y-l.y;if(d=E*E+S*S)d=a*b[o]*((d=Math.sqrt(d))-y[o])/d,E*=d,S*=d,c.x-=E*(v=l.weight/(c.weight+l.weight)),c.y-=S*v,l.x+=E*(v=1-v),l.y+=S*v}if(v=a*p){E=s[0]/2,S=s[1]/2,o=-1;if(v)while(++o<t)u=m[o],u.x+=(E-u.x)*v,u.y+=(S-u.y)*v}if(h){Qn(i=d3.geom.quadtree(m),a,w),o=-1;while(++o<t)(u=m[o]).fixed||i.visit(e(u))}o=-1;while(++o<t)u=m[o],u.fixed?(u.x=u.px,u.y=u.py):(u.x-=(u.px-(u.px=u.x))*f,u.y-=(u.py-(u.py=u.y))*f);r.tick({type:"tick",alpha:a})},n.nodes=function(e){return arguments.length?(m=e,n):m},n.links=function(e){return arguments.length?(g=e,n):g},n.size=function(e){return arguments.length?(s=e,n):s},n.linkDistance=function(e){return arguments.length?(l=u(e),n):l},n.distance=n.linkDistance,n.linkStrength=function(e){return arguments.length?(c=u(e),n):c},n.friction=function(e){return arguments.length?(f=e,n):f},n.charge=function(e){return arguments.length?(h=typeof e=="function"?e:+e,n):h},n.gravity=function(e){return arguments.length?(p=e,n):p},n.theta=function(e){return arguments.length?(d=e,n):d},n.alpha=function(e){return arguments.length?(a?e>0?a=e:a=0:e>0&&(r.start({type:"start",alpha:a=e}),d3.timer(n.tick)),n):a},n.start=function(){function e(e,n){var i=t(r),s=-1,o=i.length,u;while(++s<o)if(!isNaN(u=i[s][e]))return u;return Math.random()*n}function t(){if(!p){p=[];for(i=0;i<o;++i)p[i]=[];for(i=0;i<u;++i){var e=g[i];p[e.source.index].push(e.target),p[e.target.index].push(e.source)}}return p[r]}var r,i,o=m.length,u=g.length,a=s[0],f=s[1],p,d;for(r=0;r<o;++r)(d=m[r]).index=r,d.weight=0;y=[],b=[];for(r=0;r<u;++r)d=g[r],typeof d.source=="number"&&(d.source=m[d.source]),typeof d.target=="number"&&(d.target=m[d.target]),y[r]=l.call(this,d,r),b[r]=c.call(this,d,r),++d.source.weight,++d.target.weight;for(r=0;r<o;++r)d=m[r],isNaN(d.x)&&(d.x=e("x",a)),isNaN(d.y)&&(d.y=e("y",f)),isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);w=[];if(typeof h=="function")for(r=0;r<o;++r)w[r]=+h.call(this,m[r],r);else for(r=0;r<o;++r)w[r]=h;return n.resume()},n.resume=function(){return n.alpha(.1)},n.stop=function(){return n.alpha(0)},n.drag=function(){o||(o=d3.behavior.drag().origin(i).on("dragstart",Vn).on("drag",t).on("dragend",$n)),this.on("mouseover.force",Jn).on("mouseout.force",Kn).call(o)},d3.rebind(n,r,"on")},d3.layout.partition=function(){function e(t,n,r,i){var s=t.children;t.x=n,t.y=t.depth*i,t.dx=r,t.dy=i;if(s&&(u=s.length)){var o=-1,u,a,f;r=t.value?r/t.value:0;while(++o<u)e(a=s[o],n,f=a.value*r,i),n+=f}}function t(e){var n=e.children,r=0;if(n&&(s=n.length)){var i=-1,s;while(++i<s)r=Math.max(r,t(n[i]))}return 1+r}function n(n,s){var o=r.call(this,n,s);return e(o[0],0,i[0],i[1]/t(o[0])),o}var r=d3.layout.hierarchy(),i=[1,1];return n.size=function(e){return arguments.length?(i=e,n):i},lr(n,r)},d3.layout.pie=function(){function e(s,o){var u=s.map(function(n,r){return+t.call(e,n,r)}),a=+(typeof r=="function"?r.apply(this,arguments):r),f=((typeof i=="function"?i.apply(this,arguments):i)-r)/d3.sum(u),l=d3.range(s.length);n!=null&&l.sort(n===co?function(e,t){return u[t]-u[e]}:function(e,t){return n(s[e],s[t])});var c=[];return l.forEach(function(e){var t;c[e]={data:s[e],value:t=u[e],startAngle:a,endAngle:a+=t*f}}),c}var t=Number,n=co,r=0,i=2*Math.PI;return e.value=function(n){return arguments.length?(t=n,e):t},e.sort=function(t){return arguments.length?(n=t,e):n},e.startAngle=function(t){return arguments.length?(r=t,e):r},e.endAngle=function(t){return arguments.length?(i=t,e):i},e};var co={};d3.layout.stack=function(){function e(i,a){var f=i.map(function(n,r){return t.call(e,n,r)}),l=f.map(function(t,n){return t.map(function(t,n){return[o.call(e,t,n),u.call(e,t,n)]})}),c=n.call(e,l,a);f=d3.permute(f,c),l=d3.permute(l,c);var h=r.call(e,l,a),p=f.length,d=f[0].length,v,m,g;for(m=0;m<d;++m){s.call(e,f[0][m],g=h[m],l[0][m][1]);for(v=1;v<p;++v)s.call(e,f[v][m],g+=l[v-1][m][1],l[v][m][1])}return i}var t=i,n=nr,r=rr,s=tr,o=Zn,u=er;return e.values=function(n){return arguments.length?(t=n,e):t},e.order=function(t){return arguments.length?(n=typeof t=="function"?t:ho.get(t)||nr,e):n},e.offset=function(t){return arguments.length?(r=typeof t=="function"?t:po.get(t)||rr,e):r},e.x=function(t){return arguments.length?(o=t,e):o},e.y=function(t){return arguments.length?(u=t,e):u},e.out=function(t){return arguments.length?(s=t,e):s},e};var ho=d3.map({"inside-out":function(e){var t=e.length,n,r,i=e.map(ir),s=e.map(sr),o=d3.range(t).sort(function(e,t){return i[e]-i[t]}),u=0,a=0,f=[],l=[];for(n=0;n<t;++n)r=o[n],u<a?(u+=s[r],f.push(r)):(a+=s[r],l.push(r));return l.reverse().concat(f)},reverse:function(e){return d3.range(e.length).reverse()},"default":nr}),po=d3.map({silhouette:function(e){var t=e.length,n=e[0].length,r=[],i=0,s,o,u,a=[];for(o=0;o<n;++o){for(s=0,u=0;s<t;s++)u+=e[s][o][1];u>i&&(i=u),r.push(u)}for(o=0;o<n;++o)a[o]=(i-r[o])/2;return a},wiggle:function(e){var t=e.length,n=e[0],r=n.length,i=0,s,o,u,a,f,l,c,h,p,d=[];d[0]=h=p=0;for(o=1;o<r;++o){for(s=0,a=0;s<t;++s)a+=e[s][o][1];for(s=0,f=0,c=n[o][0]-n[o-1][0];s<t;++s){for(u=0,l=(e[s][o][1]-e[s][o-1][1])/(2*c);u<s;++u)l+=(e[u][o][1]-e[u][o-1][1])/c;f+=l*e[s][o][1]}d[o]=h-=a?f/a*c:0,h<p&&(p=h)}for(o=0;o<r;++o)d[o]-=p;return d},expand:function(e){var t=e.length,n=e[0].length,r=1/t,i,s,o,u=[];for(s=0;s<n;++s){for(i=0,o=0;i<t;i++)o+=e[i][s][1];if(o)for(i=0;i<t;i++)e[i][s][1]/=o;else for(i=0;i<t;i++)e[i][s][1]=r}for(s=0;s<n;++s)u[s]=0;return u},zero:rr});d3.layout.histogram=function(){function e(e,s){var o=[],u=e.map(n,this),a=r.call(this,u,s),f=i.call(this,a,u,s),l,s=-1,c=u.length,h=f.length-1,p=t?1:1/c,d;while(++s<h)l=o[s]=[],l.dx=f[s+1]-(l.x=f[s]),l.y=0;if(h>0){s=-1;while(++s<c)d=u[s],d>=a[0]&&d<=a[1]&&(l=o[d3.bisect(f,d,1,h)-1],l.y+=p,l.push(e[s]))}return o}var t=!0,n=Number,r=fr,i=ur;return e.value=function(t){return arguments.length?(n=t,e):n},e.range=function(t){return arguments.length?(r=u(t),e):r},e.bins=function(t){return arguments.length?(i=typeof t=="number"?function(e){return ar(e,t)}:u(t),e):i},e.frequency=function(n){return arguments.length?(t=!!n,e):t},e},d3.layout.hierarchy=function(){function e(t,o,u){var a=i.call(n,t,o),f=vo?t:{data:t};f.depth=o,u.push(f);if(a&&(c=a.length)){var l=-1,c,h=f.children=[],p=0,d=o+1,v;while(++l<c)v=e(a[l],d,u),v.parent=f,h.push(v),p+=v.value;r&&h.sort(r),s&&(f.value=p)}else s&&(f.value=+s.call(n,t,o)||0);return f}function t(e,r){var i=e.children,o=0;if(i&&(a=i.length)){var u=-1,a,f=r+1;while(++u<a)o+=t(i[u],f)}else s&&(o=+s.call(n,vo?e:e.data,r)||0);return s&&(e.value=o),o}function n(t){var n=[];return e(t,0,n),n}var r=pr,i=cr,s=hr;return n.sort=function(e){return arguments.length?(r=e,n):r},n.children=function(e){return arguments.length?(i=e,n):i},n.value=function(e){return arguments.length?(s=e,n):s},n.revalue=function(e){return t(e,0),e},n};var vo=!1;d3.layout.pack=function(){function e(e,i){var s=t.call(this,e,i),o=s[0];o.x=0,o.y=0,Hr(o,function(e){e.r=Math.sqrt(e.value)}),Hr(o,br);var u=r[0],a=r[1],f=Math.max(2*o.r/u,2*o.r/a);if(n>0){var l=n*f/2;Hr(o,function(e){e.r+=l}),Hr(o,br),Hr(o,function(e){e.r-=l}),f=Math.max(2*o.r/u,2*o.r/a)}return Sr(o,u/2,a/2,1/f),s}var t=d3.layout.hierarchy().sort(vr),n=0,r=[1,1];return e.size=function(t){return arguments.length?(r=t,e):r},e.padding=function(t){return arguments.length?(n=+t,e):n},lr(e,t)},d3.layout.cluster=function(){function e(e,i){var s=t.call(this,e,i),o=s[0],u,a=0,f,l;Hr(o,function(e){var t=e.children;t&&t.length?(e.x=Nr(t),e.y=Tr(t)):(e.x=u?a+=n(e,u):0,e.y=0,u=e)});var c=Cr(o),h=kr(o),p=c.x-n(c,h)/2,d=h.x+n(h,c)/2;return Hr(o,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=(1-(o.y?e.y/o.y:1))*r[1]}),s}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.tree=function(){function e(e,i){function s(e,t){var r=e.children,i=e._tree;if(r&&(o=r.length)){var o,a=r[0],f,l=a,c,h=-1;while(++h<o)c=r[h],s(c,f),l=u(c,f,l),f=c;Br(e);var p=.5*(a._tree.prelim+c._tree.prelim);t?(i.prelim=t._tree.prelim+n(e,t),i.mod=i.prelim-p):i.prelim=p}else t&&(i.prelim=t._tree.prelim+n(e,t))}function o(e,t){e.x=e._tree.prelim+t;var n=e.children;if(n&&(i=n.length)){var r=-1,i;t+=e._tree.mod;while(++r<i)o(n[r],t)}}function u(e,t,r){if(t){var i=e,s=e,o=t,u=e.parent.children[0],a=i._tree.mod,f=s._tree.mod,l=o._tree.mod,c=u._tree.mod,h;while(o=Or(o),i=Ar(i),o&&i)u=Ar(u),s=Or(s),s._tree.ancestor=e,h=o._tree.prelim+l-i._tree.prelim-a+n(o,i),h>0&&(jr(Fr(o,e,r),e,h),a+=h,f+=h),l+=o._tree.mod,a+=i._tree.mod,c+=u._tree.mod,f+=s._tree.mod;o&&!Or(s)&&(s._tree.thread=o,s._tree.mod+=l-f),i&&!Ar(u)&&(u._tree.thread=i,u._tree.mod+=a-c,r=e)}return r}var a=t.call(this,e,i),f=a[0];Hr(f,function(e,t){e._tree={ancestor:e,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),s(f),o(f,-f._tree.prelim);var l=Mr(f,Dr),c=Mr(f,_r),h=Mr(f,Pr),p=l.x-n(l,c)/2,d=c.x+n(c,l)/2,v=h.depth||1;return Hr(f,function(e){e.x=(e.x-p)/(d-p)*r[0],e.y=e.depth/v*r[1],delete e._tree}),a}var t=d3.layout.hierarchy().sort(null).value(null),n=Lr,r=[1,1];return e.separation=function(t){return arguments.length?(n=t,e):n},e.size=function(t){return arguments.length?(r=t,e):r},lr(e,t)},d3.layout.treemap=function(){function e(e,t){var n=-1,r=e.length,i,s;while(++n<r)s=(i=e[n]).value*(t<0?0:t),i.area=isNaN(s)||s<=0?0:s}function t(n){var s=n.children;if(s&&s.length){var o=l(n),u=[],a=s.slice(),f,c=Infinity,h,p=Math.min(o.dx,o.dy),d;e(a,o.dx*o.dy/n.value),u.area=0;while((d=a.length)>0)u.push(f=a[d-1]),u.area+=f.area,(h=r(u,p))<=c?(a.pop(),c=h):(u.area-=u.pop().area,i(u,p,o,!1),p=Math.min(o.dx,o.dy),u.length=u.area=0,c=Infinity);u.length&&(i(u,p,o,!0),u.length=u.area=0),s.forEach(t)}}function n(t){var r=t.children;if(r&&r.length){var s=l(t),o=r.slice(),u,a=[];e(o,s.dx*s.dy/t.value),a.area=0;while(u=o.pop())a.push(u),a.area+=u.area,u.z!=null&&(i(a,u.z?s.dx:s.dy,s,!o.length),a.length=a.area=0);r.forEach(n)}}function r(e,t){var n=e.area,r,i=0,s=Infinity,o=-1,u=e.length;while(++o<u){if(!(r=e[o].area))continue;r<s&&(s=r),r>i&&(i=r)}return n*=n,t*=t,n?Math.max(t*i*p/n,n/(t*s*p)):Infinity}function i(e,t,n,r){var i=-1,s=e.length,o=n.x,a=n.y,f=t?u(e.area/t):0,l;if(t==n.dx){if(r||f>n.dy)f=n.dy;while(++i<s)l=e[i],l.x=o,l.y=a,l.dy=f,o+=l.dx=Math.min(n.x+n.dx-o,f?u(l.area/f):0);l.z=!0,l.dx+=n.x+n.dx-o,n.y+=f,n.dy-=f}else{if(r||f>n.dx)f=n.dx;while(++i<s)l=e[i],l.x=o,l.y=a,l.dx=f,a+=l.dy=Math.min(n.y+n.dy-a,f?u(l.area/f):0);l.z=!1,l.dy+=n.y+n.dy-a,n.x+=f,n.dx-=f}}function s(r){var i=h||o(r),s=i[0];return s.x=0,s.y=0,s.dx=a[0],s.dy=a[1],h&&o.revalue(s),e([s],s.dx*s.dy/s.value),(h?n:t)(s),c&&(h=i),i}var o=d3.layout.hierarchy(),u=Math.round,a=[1,1],f=null,l=Ir,c=!1,h,p=.5*(1+Math.sqrt(5));return s.size=function(e){return arguments.length?(a=e,s):a},s.padding=function(e){function t(t){var n=e.call(s,t,t.depth);return n==null?Ir(t):qr(t,typeof n=="number"?[n,n,n,n]:n)}function n(t){return qr(t,e)}if(!arguments.length)return f;var r;return l=(f=e)==null?Ir:(r=typeof e)==="function"?t:r==="number"?(e=[e,e,e,e],n):n,s},s.round=function(e){return arguments.length?(u=e?Math.round:Number,s):u!=Number},s.sticky=function(e){return arguments.length?(c=e,h=null,s):c},s.ratio=function(e){return arguments.length?(p=e,s):p},lr(s,o)},d3.csv=Rr(",","text/csv"),d3.tsv=Rr(" ","text/tab-separated-values"),d3.geo={};var mo=Math.PI/180;d3.geo.azimuthal=function(){function e(e){var n=e[0]*mo-s,o=e[1]*mo,f=Math.cos(n),l=Math.sin(n),c=Math.cos(o),h=Math.sin(o),p=t!=="orthographic"?a*h+u*c*f:null,d,v=t==="stereographic"?1/(1+p):t==="gnomonic"?1/p:t==="equidistant"?(d=Math.acos(p),d?d/Math.sin(d):0):t==="equalarea"?Math.sqrt(2/(1+p)):1,m=v*c*l,g=v*(a*c*f-u*h);return[r*m+i[0],r*g+i[1]]}var t="orthographic",n,r=200,i=[480,250],s,o,u,a;return e.invert=function(e){var n=(e[0]-i[0])/r,o=(e[1]-i[1])/r,f=Math.sqrt(n*n+o*o),l=t==="stereographic"?2*Math.atan(f):t==="gnomonic"?Math.atan(f):t==="equidistant"?f:t==="equalarea"?2*Math.asin(.5*f):Math.asin(f),c=Math.sin(l),h=Math.cos(l);return[(s+Math.atan2(n*c,f*u*h+o*a*c))/mo,Math.asin(h*a-(f?o*c*u/f:0))/mo]},e.mode=function(n){return arguments.length?(t=n+"",e):t},e.origin=function(t){return arguments.length?(n=t,s=n[0]*mo,o=n[1]*mo,u=Math.cos(o),a=Math.sin(o),e):n},e.scale=function(t){return arguments.length?(r=+t,e):r},e.translate=function(t){return arguments.length?(i=[+t[0],+t[1]],e):i},e.origin([0,0])},d3.geo.albers=function(){function e(e){var t=u*(mo*e[0]-o),n=Math.sqrt(a-2*u*Math.sin(mo*e[1]))/u;return[i*n*Math.sin(t)+s[0],i*(n*Math.cos(t)-f)+s[1]]}function t(){var t=mo*r[0],i=mo*r[1],s=mo*n[1],l=Math.sin(t),c=Math.cos(t);return o=mo*n[0],u=.5*(l+Math.sin(i)),a=c*c+2*u*l,f=Math.sqrt(a-2*u*Math.sin(s))/u,e}var n=[-98,38],r=[29.5,45.5],i=1e3,s=[480,250],o,u,a,f;return e.invert=function(e){var t=(e[0]-s[0])/i,n=(e[1]-s[1])/i,r=f+n,l=Math.atan2(t,r),c=Math.sqrt(t*t+r*r);return[(o+l/u)/mo,Math.asin((a-c*c*u*u)/(2*u))/mo]},e.origin=function(e){return arguments.length?(n=[+e[0],+e[1]],t()):n},e.parallels=function(e){return arguments.length?(r=[+e[0],+e[1]],t()):r},e.scale=function(t){return arguments.length?(i=+t,e):i},e.translate=function(t){return arguments.length?(s=[+t[0],+t[1]],e):s},t()},d3.geo.albersUsa=function(){function e(e){var s=e[0],o=e[1];return(o>50?n:s<-140?r:o<21?i:t)(e)}var t=d3.geo.albers(),n=d3.geo.albers().origin([-160,60]).parallels([55,65]),r=d3.geo.albers().origin([-160,20]).parallels([8,18]),i=d3.geo.albers().origin([-60,10]).parallels([8,18]);return e.scale=function(s){return arguments.length?(t.scale(s),n.scale(s*.6),r.scale(s),i.scale(s*1.5),e.translate(t.translate())):t.scale()},e.translate=function(s){if(!arguments.length)return t.translate();var o=t.scale()/1e3,u=s[0],a=s[1];return t.translate(s),n.translate([u-400*o,a+170*o]),r.translate([u-190*o,a+200*o]),i.translate([u+580*o,a+430*o]),e},e.scale(t.scale())},d3.geo.bonne=function(){function e(e){var u=e[0]*mo-r,a=e[1]*mo-i;if(s){var f=o+s-a,l=u*Math.cos(a)/f;u=f*Math.sin(l),a=f*Math.cos(l)-o}else u*=Math.cos(a),a*=-1;return[t*u+n[0],t*a+n[1]]}var t=200,n=[480,250],r,i,s,o;return e.invert=function(e){var i=(e[0]-n[0])/t,u=(e[1]-n[1])/t;if(s){var a=o+u,f=Math.sqrt(i*i+a*a);u=o+s-f,i=r+f*Math.atan2(i,a)/Math.cos(u)}else u*=-1,i/=Math.cos(u);return[i/mo,u/mo]},e.parallel=function(t){return arguments.length?(o=1/Math.tan(s=t*mo),e):s/mo},e.origin=function(t){return arguments.length?(r=t[0]*mo,i=t[1]*mo,e):[r/mo,i/mo]},e.scale=function( -n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e.origin([0,0]).parallel(45)},d3.geo.equirectangular=function(){function e(e){var r=e[0]/360,i=-e[1]/360;return[t*r+n[0],t*i+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,-360*i]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.mercator=function(){function e(e){var r=e[0]/360,i=-(Math.log(Math.tan(Math.PI/4+e[1]*mo/2))/mo)/360;return[t*r+n[0],t*Math.max(-0.5,Math.min(.5,i))+n[1]]}var t=500,n=[480,250];return e.invert=function(e){var r=(e[0]-n[0])/t,i=(e[1]-n[1])/t;return[360*r,2*Math.atan(Math.exp(-360*i*mo))/mo-90]},e.scale=function(n){return arguments.length?(t=+n,e):t},e.translate=function(t){return arguments.length?(n=[+t[0],+t[1]],e):n},e},d3.geo.path=function(){function e(e,t){typeof s=="function"&&(o=zr(s.apply(this,arguments))),f(e);var n=a.length?a.join(""):null;return a=[],n}function t(e){return u(e).join(",")}function n(e){var t=i(e[0]),n=0,r=e.length;while(++n<r)t-=i(e[n]);return t}function r(e){var t=d3.geom.polygon(e[0].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i=r[0],s=r[1],o=n,a=0,f=e.length;while(++a<f)t=d3.geom.polygon(e[a].map(u)),n=t.area(),r=t.centroid(n<0?(n*=-1,1):-1),i-=r[0],s-=r[1],o-=n;return[i,s,6*o]}function i(e){return Math.abs(d3.geom.polygon(e.map(u)).area())}var s=4.5,o=zr(s),u=d3.geo.albersUsa(),a=[],f=Ur({FeatureCollection:function(e){var t=e.features,n=-1,r=t.length;while(++n<r)a.push(f(t[n].geometry))},Feature:function(e){f(e.geometry)},Point:function(e){a.push("M",t(e.coordinates),o)},MultiPoint:function(e){var n=e.coordinates,r=-1,i=n.length;while(++r<i)a.push("M",t(n[r]),o)},LineString:function(e){var n=e.coordinates,r=-1,i=n.length;a.push("M");while(++r<i)a.push(t(n[r]),"L");a.pop()},MultiLineString:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1,u=s.length,a.push("M");while(++o<u)a.push(t(s[o]),"L");a.pop()}},Polygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u;while(++r<i){s=n[r],o=-1;if((u=s.length-1)>0){a.push("M");while(++o<u)a.push(t(s[o]),"L");a[a.length-1]="Z"}}},MultiPolygon:function(e){var n=e.coordinates,r=-1,i=n.length,s,o,u,f,l,c;while(++r<i){s=n[r],o=-1,u=s.length;while(++o<u){f=s[o],l=-1;if((c=f.length-1)>0){a.push("M");while(++l<c)a.push(t(f[l]),"L");a[a.length-1]="Z"}}}},GeometryCollection:function(e){var t=e.geometries,n=-1,r=t.length;while(++n<r)a.push(f(t[n]))}}),l=e.area=Ur({FeatureCollection:function(e){var t=0,n=e.features,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t},Feature:function(e){return l(e.geometry)},Polygon:function(e){return n(e.coordinates)},MultiPolygon:function(e){var t=0,r=e.coordinates,i=-1,s=r.length;while(++i<s)t+=n(r[i]);return t},GeometryCollection:function(e){var t=0,n=e.geometries,r=-1,i=n.length;while(++r<i)t+=l(n[r]);return t}},0),c=e.centroid=Ur({Feature:function(e){return c(e.geometry)},Polygon:function(e){var t=r(e.coordinates);return[t[0]/t[2],t[1]/t[2]]},MultiPolygon:function(e){var t=0,n=e.coordinates,i,s=0,o=0,u=0,a=-1,f=n.length;while(++a<f)i=r(n[a]),s+=i[0],o+=i[1],u+=i[2];return[s/u,o/u]}});return e.projection=function(t){return u=t,e},e.pointRadius=function(t){return typeof t=="function"?s=t:(s=+t,o=zr(s)),e},e},d3.geo.bounds=function(e){var t=Infinity,n=Infinity,r=-Infinity,i=-Infinity;return Wr(e,function(e,s){e<t&&(t=e),e>r&&(r=e),s<n&&(n=s),s>i&&(i=s)}),[[t,n],[r,i]]};var go={Feature:Xr,FeatureCollection:Vr,GeometryCollection:$r,LineString:Jr,MultiLineString:Kr,MultiPoint:Jr,MultiPolygon:Qr,Point:Gr,Polygon:Yr};d3.geo.circle=function(){function e(){}function t(e){return a.distance(e)<u}function n(e){var t=-1,n=e.length,i=[],s,o,f,l,c;while(++t<n)c=a.distance(f=e[t]),c<u?(o&&i.push(ni(o,f)((l-u)/(l-c))),i.push(f),s=o=null):(o=f,!s&&i.length&&(i.push(ni(i[i.length-1],o)((u-l)/(c-l))),s=o)),l=c;return s=e[0],o=i[0],o&&f[0]===s[0]&&f[1]===s[1]&&(f[0]!==o[0]||f[1]!==o[1])&&i.push(o),r(i)}function r(e){var t=0,n=e.length,r,i,s=n?[e[0]]:e,o,u=a.source();while(++t<n){o=a.source(e[t-1])(e[t]).coordinates;for(r=0,i=o.length;++r<i;)s.push(o[r])}return a.source(u),s}var s=[0,0],o=89.99,u=o*mo,a=d3.geo.greatArc().source(s).target(i);e.clip=function(e){return typeof s=="function"&&a.source(s.apply(this,arguments)),f(e)||null};var f=Ur({FeatureCollection:function(e){var t=e.features.map(f).filter(i);return t&&(e=Object.create(e),e.features=t,e)},Feature:function(e){var t=f(e.geometry);return t&&(e=Object.create(e),e.geometry=t,e)},Point:function(e){return t(e.coordinates)&&e},MultiPoint:function(e){var n=e.coordinates.filter(t);return n.length&&{type:e.type,coordinates:n}},LineString:function(e){var t=n(e.coordinates);return t.length&&(e=Object.create(e),e.coordinates=t,e)},MultiLineString:function(e){var t=e.coordinates.map(n).filter(function(e){return e.length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},Polygon:function(e){var t=e.coordinates.map(n);return t[0].length&&(e=Object.create(e),e.coordinates=t,e)},MultiPolygon:function(e){var t=e.coordinates.map(function(e){return e.map(n)}).filter(function(e){return e[0].length});return t.length&&(e=Object.create(e),e.coordinates=t,e)},GeometryCollection:function(e){var t=e.geometries.map(f).filter(i);return t.length&&(e=Object.create(e),e.geometries=t,e)}});return e.origin=function(t){return arguments.length?(s=t,typeof s!="function"&&a.source(s),e):s},e.angle=function(t){return arguments.length?(u=(o=+t)*mo,e):o},d3.rebind(e,a,"precision")},d3.geo.greatArc=function(){function e(){var t=e.distance.apply(this,arguments),r=0,u=s/t,a=[n];while((r+=u)<1)a.push(o(r));return a.push(i),{type:"LineString",coordinates:a}}var t=Zr,n,r=ei,i,s=6*mo,o=ti();return e.distance=function(){return typeof t=="function"&&o.source(n=t.apply(this,arguments)),typeof r=="function"&&o.target(i=r.apply(this,arguments)),o.distance()},e.source=function(r){return arguments.length?(t=r,typeof t!="function"&&o.source(n=t),e):t},e.target=function(t){return arguments.length?(r=t,typeof r!="function"&&o.target(i=r),e):r},e.precision=function(t){return arguments.length?(s=t*mo,e):s/mo},e},d3.geo.greatCircle=d3.geo.circle,d3.geom={},d3.geom.contour=function(e,t){var n=t||ri(e),r=[],i=n[0],s=n[1],o=0,u=0,a=NaN,f=NaN,l=0;do l=0,e(i-1,s-1)&&(l+=1),e(i,s-1)&&(l+=2),e(i-1,s)&&(l+=4),e(i,s)&&(l+=8),l===6?(o=f===-1?-1:1,u=0):l===9?(o=0,u=a===1?-1:1):(o=yo[l],u=bo[l]),o!=a&&u!=f&&(r.push([i,s]),a=o,f=u),i+=o,s+=u;while(n[0]!=i||n[1]!=s);return r};var yo=[1,0,1,1,-1,0,-1,1,0,0,0,0,-1,0,-1,NaN],bo=[0,-1,0,0,0,-1,0,0,1,-1,1,1,0,-1,0,NaN];d3.geom.hull=function(e){if(e.length<3)return[];var t=e.length,n=t-1,r=[],i=[],s,o,u=0,a,f,l,c,h,p,d,v;for(s=1;s<t;++s)e[s][1]<e[u][1]?u=s:e[s][1]==e[u][1]&&(u=e[s][0]<e[u][0]?s:u);for(s=0;s<t;++s){if(s===u)continue;f=e[s][1]-e[u][1],a=e[s][0]-e[u][0],r.push({angle:Math.atan2(f,a),index:s})}r.sort(function(e,t){return e.angle-t.angle}),d=r[0].angle,p=r[0].index,h=0;for(s=1;s<n;++s)o=r[s].index,d==r[s].angle?(a=e[p][0]-e[u][0],f=e[p][1]-e[u][1],l=e[o][0]-e[u][0],c=e[o][1]-e[u][1],a*a+f*f>=l*l+c*c?r[s].index=-1:(r[h].index=-1,d=r[s].angle,h=s,p=o)):(d=r[s].angle,h=s,p=o);i.push(u);for(s=0,o=0;s<2;++o)r[o].index!==-1&&(i.push(r[o].index),s++);v=i.length;for(;o<n;++o){if(r[o].index===-1)continue;while(!ii(i[v-2],i[v-1],r[o].index,e))--v;i[v++]=r[o].index}var m=[];for(s=0;s<v;++s)m.push(e[i[s]]);return m},d3.geom.polygon=function(e){return e.area=function(){var t=0,n=e.length,r=e[n-1][0]*e[0][1],i=e[n-1][1]*e[0][0];while(++t<n)r+=e[t-1][0]*e[t][1],i+=e[t-1][1]*e[t][0];return(i-r)*.5},e.centroid=function(t){var n=-1,r=e.length,i=0,s=0,o,u=e[r-1],a;arguments.length||(t=-1/(6*e.area()));while(++n<r)o=u,u=e[n],a=o[0]*u[1]-u[0]*o[1],i+=(o[0]+u[0])*a,s+=(o[1]+u[1])*a;return[i*t,s*t]},e.clip=function(t){var n,r=-1,i=e.length,s,o,u=e[i-1],a,f,l;while(++r<i){n=t.slice(),t.length=0,a=e[r],f=n[(o=n.length)-1],s=-1;while(++s<o)l=n[s],si(l,u,a)?(si(f,u,a)||t.push(oi(f,l,u,a)),t.push(l)):si(f,u,a)&&t.push(oi(f,l,u,a)),f=l;u=a}return t},e},d3.geom.voronoi=function(e){var t=e.map(function(){return[]});return ui(e,function(e){var n,r,i,s,o,u;e.a===1&&e.b>=0?(n=e.ep.r,r=e.ep.l):(n=e.ep.l,r=e.ep.r),e.a===1?(o=n?n.y:-1e6,i=e.c-e.b*o,u=r?r.y:1e6,s=e.c-e.b*u):(i=n?n.x:-1e6,o=e.c-e.a*i,s=r?r.x:1e6,u=e.c-e.a*s);var a=[i,o],f=[s,u];t[e.region.l.index].push(a,f),t[e.region.r.index].push(a,f)}),t.map(function(t,n){var r=e[n][0],i=e[n][1];return t.forEach(function(e){e.angle=Math.atan2(e[0]-r,e[1]-i)}),t.sort(function(e,t){return e.angle-t.angle}).filter(function(e,n){return!n||e.angle-t[n-1].angle>1e-10})})};var wo={l:"r",r:"l"};d3.geom.delaunay=function(e){var t=e.map(function(){return[]}),n=[];return ui(e,function(n){t[n.region.l.index].push(e[n.region.r.index])}),t.forEach(function(t,r){var i=e[r],s=i[0],o=i[1];t.forEach(function(e){e.angle=Math.atan2(e[0]-s,e[1]-o)}),t.sort(function(e,t){return e.angle-t.angle});for(var u=0,a=t.length-1;u<a;u++)n.push([i,t[u],t[u+1]])}),n},d3.geom.quadtree=function(e,t,n,r,i){function s(e,t,n,r,i,s){if(isNaN(t.x)||isNaN(t.y))return;if(e.leaf){var u=e.point;u?Math.abs(u.x-t.x)+Math.abs(u.y-t.y)<.01?o(e,t,n,r,i,s):(e.point=null,o(e,u,n,r,i,s),o(e,t,n,r,i,s)):e.point=t}else o(e,t,n,r,i,s)}function o(e,t,n,r,i,o){var u=(n+i)*.5,a=(r+o)*.5,f=t.x>=u,l=t.y>=a,c=(l<<1)+f;e.leaf=!1,e=e.nodes[c]||(e.nodes[c]=ai()),f?n=u:i=u,l?r=a:o=a,s(e,t,n,r,i,o)}var u,a=-1,f=e.length;f&&isNaN(e[0].x)&&(e=e.map(li));if(arguments.length<5)if(arguments.length===3)i=r=n,n=t;else{t=n=Infinity,r=i=-Infinity;while(++a<f)u=e[a],u.x<t&&(t=u.x),u.y<n&&(n=u.y),u.x>r&&(r=u.x),u.y>i&&(i=u.y);var l=r-t,c=i-n;l>c?i=n+l:r=t+c}var h=ai();return h.add=function(e){s(h,e,t,n,r,i)},h.visit=function(e){fi(e,h,t,n,r,i)},e.forEach(h.add),h},d3.time={};var Eo=Date,So=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ci.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){xo.setUTCDate.apply(this._,arguments)},setDay:function(){xo.setUTCDay.apply(this._,arguments)},setFullYear:function(){xo.setUTCFullYear.apply(this._,arguments)},setHours:function(){xo.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){xo.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){xo.setUTCMinutes.apply(this._,arguments)},setMonth:function(){xo.setUTCMonth.apply(this._,arguments)},setSeconds:function(){xo.setUTCSeconds.apply(this._,arguments)},setTime:function(){xo.setTime.apply(this._,arguments)}};var xo=Date.prototype,To="%a %b %e %H:%M:%S %Y",No="%m/%d/%y",Co="%H:%M:%S",ko=So,Lo=ko.map(hi),Ao=["January","February","March","April","May","June","July","August","September","October","November","December"],Oo=Ao.map(hi);d3.time.format=function(e){function t(t){var r=[],i=-1,s=0,o,u;while(++i<n)e.charCodeAt(i)==37&&(r.push(e.substring(s,i),(u=Ro[o=e.charAt(++i)])?u(t):o),s=i+1);return r.push(e.substring(s,i)),r.join("")}var n=e.length;return t.parse=function(t){var n={y:1900,m:0,d:1,H:0,M:0,S:0,L:0},r=pi(n,e,t,0);if(r!=t.length)return null;"p"in n&&(n.H=n.H%12+n.p*12);var i=new Eo;return i.setFullYear(n.y,n.m,n.d),i.setHours(n.H,n.M,n.S,n.L),i},t.toString=function(){return e},t};var Mo=d3.format("02d"),_o=d3.format("03d"),Do=d3.format("04d"),Po=d3.format("2d"),Ho=di(ko),Bo=di(Lo),jo=di(Ao),Fo=vi(Ao),Io=di(Oo),qo=vi(Oo),Ro={a:function(e){return Lo[e.getDay()]},A:function(e){return ko[e.getDay()]},b:function(e){return Oo[e.getMonth()]},B:function(e){return Ao[e.getMonth()]},c:d3.time.format(To),d:function(e){return Mo(e.getDate())},e:function(e){return Po(e.getDate())},H:function(e){return Mo(e.getHours())},I:function(e){return Mo(e.getHours()%12||12)},j:function(e){return _o(1+d3.time.dayOfYear(e))},L:function(e){return _o(e.getMilliseconds())},m:function(e){return Mo(e.getMonth()+1)},M:function(e){return Mo(e.getMinutes())},p:function(e){return e.getHours()>=12?"PM":"AM"},S:function(e){return Mo(e.getSeconds())},U:function(e){return Mo(d3.time.sundayOfYear(e))},w:function(e){return e.getDay()},W:function(e){return Mo(d3.time.mondayOfYear(e))},x:d3.time.format(No),X:d3.time.format(Co),y:function(e){return Mo(e.getFullYear()%100)},Y:function(e){return Do(e.getFullYear()%1e4)},Z:Di,"%":function(e){return"%"}},Uo={a:mi,A:gi,b:yi,B:bi,c:wi,d:ki,e:ki,H:Li,I:Li,L:Mi,m:Ci,M:Ai,p:_i,S:Oi,x:Ei,X:Si,y:Ti,Y:xi},zo=/^\s*\d+/,Wo=d3.map({am:0,pm:1});d3.time.format.utc=function(e){function t(e){try{Eo=ci;var t=new Eo;return t._=e,n(t)}finally{Eo=Date}}var n=d3.time.format(e);return t.parse=function(e){try{Eo=ci;var t=n.parse(e);return t&&t._}finally{Eo=Date}},t.toString=n.toString,t};var Xo=d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ");d3.time.format.iso=Date.prototype.toISOString?Pi:Xo,Pi.parse=function(e){var t=new Date(e);return isNaN(t)?null:t},Pi.toString=Xo.toString,d3.time.second=Hi(function(e){return new Eo(Math.floor(e/1e3)*1e3)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*1e3)},function(e){return e.getSeconds()}),d3.time.seconds=d3.time.second.range,d3.time.seconds.utc=d3.time.second.utc.range,d3.time.minute=Hi(function(e){return new Eo(Math.floor(e/6e4)*6e4)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*6e4)},function(e){return e.getMinutes()}),d3.time.minutes=d3.time.minute.range,d3.time.minutes.utc=d3.time.minute.utc.range,d3.time.hour=Hi(function(e){var t=e.getTimezoneOffset()/60;return new Eo((Math.floor(e/36e5-t)+t)*36e5)},function(e,t){e.setTime(e.getTime()+Math.floor(t)*36e5)},function(e){return e.getHours()}),d3.time.hours=d3.time.hour.range,d3.time.hours.utc=d3.time.hour.utc.range,d3.time.day=Hi(function(e){var t=new Eo(1970,0);return t.setFullYear(e.getFullYear(),e.getMonth(),e.getDate()),t},function(e,t){e.setDate(e.getDate()+t)},function(e){return e.getDate()-1}),d3.time.days=d3.time.day.range,d3.time.days.utc=d3.time.day.utc.range,d3.time.dayOfYear=function(e){var t=d3.time.year(e);return Math.floor((e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*6e4)/864e5)},So.forEach(function(e,t){e=e.toLowerCase(),t=7-t;var n=d3.time[e]=Hi(function(e){return(e=d3.time.day(e)).setDate(e.getDate()-(e.getDay()+t)%7),e},function(e,t){e.setDate(e.getDate()+Math.floor(t)*7)},function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)-(n!==t)});d3.time[e+"s"]=n.range,d3.time[e+"s"].utc=n.utc.range,d3.time[e+"OfYear"]=function(e){var n=d3.time.year(e).getDay();return Math.floor((d3.time.dayOfYear(e)+(n+t)%7)/7)}}),d3.time.week=d3.time.sunday,d3.time.weeks=d3.time.sunday.range,d3.time.weeks.utc=d3.time.sunday.utc.range,d3.time.weekOfYear=d3.time.sundayOfYear,d3.time.month=Hi(function(e){return e=d3.time.day(e),e.setDate(1),e},function(e,t){e.setMonth(e.getMonth()+t)},function(e){return e.getMonth()}),d3.time.months=d3.time.month.range,d3.time.months.utc=d3.time.month.utc.range,d3.time.year=Hi(function(e){return e=d3.time.day(e),e.setMonth(0,1),e},function(e,t){e.setFullYear(e.getFullYear()+t)},function(e){return e.getFullYear()}),d3.time.years=d3.time.year.range,d3.time.years.utc=d3.time.year.utc.range;var Vo=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],$o=[[d3.time.second,1],[d3.time.second,5],[d3.time.second,15],[d3.time.second,30],[d3.time.minute,1],[d3.time.minute,5],[d3.time.minute,15],[d3.time.minute,30],[d3.time.hour,1],[d3.time.hour,3],[d3.time.hour,6],[d3.time.hour,12],[d3.time.day,1],[d3.time.day,2],[d3.time.week,1],[d3.time.month,1],[d3.time.month,3],[d3.time.year,1]],Jo=[[d3.time.format("%Y"),function(e){return!0}],[d3.time.format("%B"),function(e){return e.getMonth()}],[d3.time.format("%b %d"),function(e){return e.getDate()!=1}],[d3.time.format("%a %d"),function(e){return e.getDay()&&e.getDate()!=1}],[d3.time.format("%I %p"),function(e){return e.getHours()}],[d3.time.format("%I:%M"),function(e){return e.getMinutes()}],[d3.time.format(":%S"),function(e){return e.getSeconds()}],[d3.time.format(".%L"),function(e){return e.getMilliseconds()}]],Ko=d3.scale.linear(),Qo=qi(Jo);$o.year=function(e,t){return Ko.domain(e.map(Ui)).ticks(t).map(Ri)},d3.time.scale=function(){return ji(d3.scale.linear(),$o,Qo)};var Go=$o.map(function(e){return[e[0].utc,e[1]]}),Yo=[[d3.time.format.utc("%Y"),function(e){return!0}],[d3.time.format.utc("%B"),function(e){return e.getUTCMonth()}],[d3.time.format.utc("%b %d"),function(e){return e.getUTCDate()!=1}],[d3.time.format.utc("%a %d"),function(e){return e.getUTCDay()&&e.getUTCDate()!=1}],[d3.time.format.utc("%I %p"),function(e){return e.getUTCHours()}],[d3.time.format.utc("%I:%M"),function(e){return e.getUTCMinutes()}],[d3.time.format.utc(":%S"),function(e){return e.getUTCSeconds()}],[d3.time.format.utc(".%L"),function(e){return e.getUTCMilliseconds()}]],Zo=qi(Yo);Go.year=function(e,t){return Ko.domain(e.map(Wi)).ticks(t).map(zi)},d3.time.scale.utc=function(){return ji(d3.scale.linear(),Go,Zo)}})(); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js deleted file mode 100644 index bc3fbc81b26..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/jquery-1.8.2.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! jQuery v1.8.2 jquery.com | jquery.org/license */ -(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js deleted file mode 100644 index 328ecd528a9..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/main.js +++ /dev/null @@ -1,180 +0,0 @@ - -function setValidators() { - $('#MismatchesInIndexForm').bootstrapValidator({ - fields: { - indexMismatch: { - validators: { - regexp: { - regexp: /^(([0-1]))$/i, - message: 'The value is not 0 or 1' - } - } - } - } - }); - $('#laneRangeForm').bootstrapValidator({ - fields: { - laneRange: { - validators: { - regexp: { - regexp: /^(([1-8]+)|([1-8]+-[1-8]+))((,(\s*)(([1-8]+)|([1-8]+-[1-8]+)))*)$/i, - message: 'The value is not list of valid lanes or intervals.' - } - } - } - } - }); -} - -function createVis() { - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function enableSubmission() { - $('#submitBtn').prop('disabled', false); -} - -function disableSubmission() { - $('#submitBtn').prop('disabled', true); -} - -function displayReturnedTable(data) { - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - var dataToShow = data.result; - console.log(dataToShow.rows[0][0].value); - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").attr("class", "alert") - .data(dataToShow.rows) - .enter() - .append("div") - .attr("class", function (row) { - if (row[0].value == 0 || row[0].value > 99) { - if(row[0].value == 100) - enableSubmission(); - if(row[0].value == 101) - disableSubmission(); - return "alert alert-success"; - } - return "alert alert-danger"; - }) - .html(function (row) { - return row[1].value; - }) - - var button = d3.select("#container") - .append("div") - - button.selectAll("button") - .data(dataToShow.rows) - .enter() - .append("div") - .append("button") - .attr("id", function (row) { - return row[0].value; - }) - .attr("class", function (row) { - if (row[0].value == 100) { - return "btn btn-success"; - } - return "btn btn-danger"; - }) - //.attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function (row) { - if (row[0].value == 0) { - return "OK" ; - } - return "Fail"; - }); - -} - -function hideButtons(data) { - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - -function spinner(target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - -function callIngestionService(method) { - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - - if(method == 'startJob') { - $('#laneRangeForm').data('bootstrapValidator').validate() - if(!$('#laneRangeForm').data('bootstrapValidator').isValid()) { - $('#laneRangeForm').focus(); - return; - } - } - - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - - - var permIdentifier = context.getEntityIdentifier() - myUserId = context.getSessionId().split("-")[0]; - - var submissionParameters = - { - sampleId: permIdentifier, - userId : myUserId, - method: method, - type : context.getEntityKind() - }; - addProcessingParameters(submissionParameters); - - console.log(submissionParameters) - - var target = document.getElementById('progress'); - spinner(target) -// dsu.server.createReportFromAggregationService("DSS1", "triggerbee", submissionParameters, displayReturnedTable); -} - -function addProcessingParameters(parameters) { - if($('#allLanes').is(':checked')) - parameters.laneRange = 'all'; - else - parameters.laneRange = $('#laneRange').val(); - parameters.sampleSheet = $('#sampleSheet').is(':checked'); - parameters.failedReads = $('#failedReads').is(':checked'); - parameters.mismatch = $('#indexMismatch').val(); - parameters.email =$('#email').is(':checked'); -} - -function refresh() { - callIngestionService("pollJob") -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js deleted file mode 100644 index ee2e8171738..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-action-deferrer.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A utility class for deferring an action until all of some kind of action has completed - * - * @argument dependencies An array of the keys for the dependencies. - */ - -function openbisActionDeferrer(pendingAction, dependencies) { - this.pendingAction = pendingAction; - this.dependencies = {}; - var newme = this; - dependencies.forEach(function(key) { - newme.dependencies[key] = false; - }); -} - -/** - * Note that a dependency completed. Execute the pending action if appropriate. - */ -openbisActionDeferrer.prototype.dependencyCompleted = function(key) { - this.dependencies[key] = true; - var shouldExecute = true; - for (prop in this.dependencies) { - if (false == this.dependencies[prop]) { - shouldExecute = false; - break; - } - } - if (shouldExecute) { - this.pendingAction(); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js deleted file mode 100644 index 52e7336254a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-dsu.js +++ /dev/null @@ -1,103 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - -/** - * Get the flow lanes for a sequencing sample. - */ -openbis_dsu.prototype.retrieveFlowLanesForSequencingSample = function(sample, action) -{ - var projectCode = null; - - if(sample.bis.experimentIdentifierOrNull){ - var experimentIdentifierRegexp = /\/(.*)\/(.*)\/(.*)/g; - var experimentIdentifierMatch = experimentIdentifierRegexp.exec(sample.bis.experimentIdentifierOrNull); - projectCode = experimentIdentifierMatch[2]; - }else{ - action(null); - return; - } - - var experimentCriteria = - { - targetEntityKind : "EXPERIMENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PROJECT", - "fieldType":"ATTRIBUTE", - "desiredValue": projectCode - } ] - } - }; - - var parentCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sample.bis.code - } ] - } - }; - - var sampleCriteria = - { - subCriterias : [ experimentCriteria, parentCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_FLOW_LANE" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js deleted file mode 100644 index 7d1ece5965c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-login.js +++ /dev/null @@ -1,77 +0,0 @@ -/** - * A module for configuring the login page to openBIS. It hides and shows - * the login form and main content as necessary. It invokes a specified - * function on successful login. - * - * This module assumes that the page follows the structure of our standard - * login page. This means that the Following elements are defined : - * - * div#login-form-div - * form#login-form - * input#username - * input#password - * button#login-button - * div#main - * button#logout-button - * - * Assuming these elements are defined, this module configures their appeareance - * and behavior.The div#main element is initially hidden until the user logs in. - * Once logged in, the div#login-form-div element is hidden and the div#main - * element is made visible. - * - * @module openbis-login - * @requires jquery - */ - - -/** - * Configure the login page to hide and show the login form and main content - * as appropriate - * - * @param openbis The openbis facade object - * @param onLogin The function to be called when login succeeds. - * @function - */ - -function openbisLoginPage(openbis, onLogin) -{ - this.openbis = openbis; - this.onLogin = onLogin; -} - -openbisLoginPage.prototype.configure = function(){ - var loginPage = this; - - $('#main').hide(); - - var username = $("#username").value; - if(username == null || username.length==0) { - $("#username").focus(); - } else { - $("#login-button").focus(); - } - - $('#logout-button').click(function() { - loginPage.openbis.logout(function(data) { - $("#login-form-div").show(); - $("#main").hide(); - $("#username").focus(); - }); - }); - - $('#login-form').submit(function() { - loginPage.openbis.login( $.trim($('#username').val()), $.trim($('#password').val()), function(data) { loginPage.onLogin(data) }) - }); - - loginPage.openbis.ifRestoredSessionActive(function(data) { loginPage.onLogin(data) }); - - // Make the ENTER key the default button - $("login-form input").keypress(function (e) { - if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) { - $('button[type=submit].default').click(); - return false; - } else { - return true; - } - }); -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js deleted file mode 100644 index 29c57a8145e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-request-cache.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Caches openBIS JSON responses into the local browser storage. - * - * Once the local storage is populated with data from real - * server interactions, the UI development can be done offline - * based on the cached server responses. - * - * USAGE : include this script in your app *after* the openbis facade. - * Be careful not to distribute it to your customers. - * - * <script type="text/javascript" src="openbis-request-cache.js"></script> - * - * To clear the cache, you can call "localStorage.clear()" in a browser console. - */ - -var original_ajax_request_func = _openbisInternal.prototype.ajaxRequest; - -_openbisInternal.prototype.ajaxRequest = function(settings) { - - function getCacheId(settings) { - var methodName = settings.data['method'] - if (methodName.toLowerCase().indexOf('authenticate') != -1) { - // do not store sensitive parameters information - // for login methods (e.g. username/password) - return methodName - } else { - var params = settings.data['params'] - return methodName + '-' + JSON.stringify(params) - } - } - - var cacheId = getCacheId(settings) - var cachedResponse = localStorage.getItem(cacheId) - - if (cachedResponse == null) { - var originalCallback = settings.success - settings.success = function(response) { - localStorage.setItem(cacheId, JSON.stringify(response)) - originalCallback(response) - } - original_ajax_request_func(settings); - } else { - // async execution after a delay of 100ms - setTimeout(function() { - settings.success(JSON.parse(cachedResponse)) - }, 100) - - } -} - -alert("This app includes development code. For production, do not forget to remove the reference to openbis-request-cache.js") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js deleted file mode 100644 index a39730902bb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis-screening.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * ======================================================= - * OpenBIS screening facade internal code (DO NOT USE!!!) - * ======================================================= - */ - -if(typeof openbis == 'undefined' || typeof _openbisInternal == 'undefined'){ - alert('Loading of openbis-screening.js failed - openbis.js is missing'); -} - -var _openbisInternalGeneric = _openbisInternal; - -var _openbisInternal = function(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -$.extend(_openbisInternal.prototype, _openbisInternalGeneric.prototype); - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - _openbisInternalGeneric.prototype.init.call(this, openbisUrlOrNull); - this.screeningUrl = this.openbisUrl + "/rmi-screening-api-v1.json" -} - -_openbisInternal.prototype.getScreeningDataStoreApiUrlForDataStoreUrl = function(dataStoreUrl){ - return dataStoreUrl + "/rmi-datastore-server-screening-api-v1.json" -} - -var _openbisGeneric = openbis; - -/** - * ========================= - * OpenBIS screening facade - * ========================= - * - * The facade provides access to the following services: - * - * - all services that the generic OpenBIS facade provides (see openbis.js file) - * - ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer - * - ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening - * - */ - -var openbis = function(openbisUrlOrNull){ - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -$.extend(openbis.prototype, _openbisGeneric.prototype); - -/** - * ==================================================================================== - * ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.IScreeningApiServer methods - * ==================================================================================== - */ - -/** - * @see IScreeningApiServer.listPlates(String) - * @method - */ -openbis.prototype.listPlates = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlates(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.listPlatesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlates", - "params" : [ this.getSession(), experimentIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateMetadataList(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.getPlateMetadataList = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateMetadataList", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String) - * @method - */ -openbis.prototype.listAllExperiments = function(action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listExperiments(String, String) - * @method - */ -openbis.prototype.listExperimentsVisibleToUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), userId ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listFeatureVectorDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listFeatureVectorDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listFeatureVectorDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listRawImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listRawImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listRawImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listSegmentationImageDatasets(String, List<? extends PlateIdentifier>) - * @method - */ -openbis.prototype.listSegmentationImageDatasets = function(plateIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listSegmentationImageDatasets", - "params" : [ this.getSession(), plateIdentifiers ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getDatasetIdentifiers(String, List<String>) - * @method - */ -openbis.prototype.getDatasetIdentifiers = function(datasetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getDatasetIdentifiers", - "params" : [ this.getSession(), datasetCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, ExperimentIdentifier, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForExperimentAndMaterial = function(experimentIdentifer, materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), experimentIdentifer, materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, MaterialIdentifier, boolean) - * @method - */ -openbis.prototype.listPlateWellsForMaterial = function(materialIdentifier, findDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), materialIdentifier, findDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateWells(String, PlateIdentifier) - * @method - */ -openbis.prototype.listPlateWells = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateWells", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getWellSample(String, WellIdentifier) - * @method - */ -openbis.prototype.getWellSample = function(wellIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getWellSample", - "params" : [ this.getSession(), wellIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getPlateSample(String, PlateIdentifier) - * @method - */ -openbis.prototype.getPlateSample = function(plateIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getPlateSample", - "params" : [ this.getSession(), plateIdentifier ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listPlateMaterialMapping(String, List<PlateIdentifier>, MaterialTypeIdentifier) - * @method - */ -openbis.prototype.listPlateMaterialMapping = function(plateIdentifiers, materialTypeIdentifierOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listPlateMaterialMapping", - "params" : [ this.getSession(), plateIdentifiers, materialTypeIdentifierOrNull ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.getExperimentImageMetadata(String, ExperimentIdentifier) - * @method - */ -openbis.prototype.getExperimentImageMetadata = function(experimentIdentifer, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "getExperimentImageMetadata", - "params" : [ this.getSession(), experimentIdentifer ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatureCodes(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatureCodes = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatureCodes", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableFeatures(String, List<? extends IFeatureVectorDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableFeatures = function(featureDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableFeatures", - "params" : [ this.getSession(), featureDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeatures(String, List<FeatureVectorDatasetReference>, List<String>) - * @method - */ -openbis.prototype.loadFeatures = function(featureDatasets, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeatures", - "params" : [ this.getSession(), featureDatasets, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadFeaturesForDatasetWellReferences(String, List<FeatureVectorDatasetWellReference>, List<String>) - * @method - */ -openbis.prototype.loadFeaturesForDatasetWellReferences = function(datasetWellReferences, featureCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadFeaturesForDatasetWellReferences", - "params" : [ this.getSession(), datasetWellReferences, featureCodes ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, boolean) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConversion = function(imageReferences, convertToPng, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "convertToPng" : convertToPng - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadThumbnailImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageSize = function(imageReferences, size, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "size" : size - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferences = function(imageReferences, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, LoadImageConfiguration) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageConfiguration = function(imageReferences, configuration, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "configuration" : configuration - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "format" : format - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadImagesBase64(String, List<PlateImageReference>, IImageRepresentationFormatSelectionCriterion...) - * @method - */ -openbis.prototype.loadImagesBase64ForImageReferencesAndImageRepresentationFormatCriteria = function(imageReferences, criteria, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "imageReferences" : imageReferences, - "criteria" : criteria - } - }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listImageMetadata(String, List<? extends IImageDatasetIdentifier>) - * @method - */ -openbis.prototype.listImageMetadata = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listImageMetadata", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.listAvailableImageRepresentationFormats(String, List<? extends IDatasetIdentifier>) - * @method - */ -openbis.prototype.listAvailableImageRepresentationFormats = function(imageDatasets, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "listAvailableImageRepresentationFormats", - "params" : [ this.getSession(), imageDatasets ] }, - success: action - }); -} - -/** - * @see IScreeningApiServer.loadPhysicalThumbnailsBase64(String, List<PlateImageReference>, ImageRepresentationFormat) - * @method - */ -openbis.prototype.loadPhysicalThumbnailsBase64ForImageReferencesAndImageRepresentationFormat = function(imageReferences, format, action) { - this._internal.ajaxRequest({ - url: this._internal.screeningUrl, - data: { "method" : "loadPhysicalThumbnailsBase64", - "params" : [ this.getSession(), imageReferences, format ] }, - success: action - }); -} - -/** - * ===================================================================================== - * ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening methods - * ===================================================================================== - */ - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, List<WellPosition>, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndWellPositionsAndChannelAndImageSize = function(dataSetIdentifier, wellPositions, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadImagesBase64(String, IDatasetIdentifier, String, ImageSize) - * @method - */ -openbis.prototype.loadImagesBase64ForDataSetIdentifierAndChannelAndImageSize = function(dataSetIdentifier, channel, thumbnailSizeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel, - "thumbnailSizeOrNull" : thumbnailSizeOrNull - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.loadThumbnailImagesBase64(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.loadThumbnailImagesBase64ForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "loadThumbnailImagesBase64", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, String) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannel = function(dataSetIdentifier, wellPositions, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listPlateImageReferences(String, IDatasetIdentifier, List<WellPosition>, List<String>) - * @method - */ -openbis.prototype.listPlateImageReferencesForDataSetIdentifierAndWellPositionsAndChannels = function(dataSetIdentifier, wellPositions, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listPlateImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "wellPositions" : wellPositions, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, String) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannel = function(dataSetIdentifier, channel, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channel" : channel - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listImageReferences(String, IDatasetIdentifier, List<String>) - * @method - */ -openbis.prototype.listImageReferencesForDataSetIdentifierAndChannels = function(dataSetIdentifier, channels, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(dataSetIdentifier.datastoreServerUrl), - data: { "method" : "listImageReferences", - "params" : { - "sessionToken" : this.getSession(), - "dataSetIdentifier" : dataSetIdentifier, - "channels" : channels - } - }, - success: action - }); -} - -/** - * @see IDssServiceRpcScreening.listAvailableFeatureLists(String, IFeatureVectorDatasetIdentifier) - * @method - */ -openbis.prototype.listAvailableFeatureLists = function(featureVectorDataSet, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "listAvailableFeatureLists", - params : [this.getSession(), featureVectorDataSet] - }, - success: action - }); -}; - -/** - * @see IDssServiceRpcScreening.getFeatureList(String, IFeatureVectorDatasetIdentifier, String) - * @method - */ -openbis.prototype.getFeatureList = function(featureVectorDataSet, featureListCode, action) { - this._internal.ajaxRequest({ - url: this._internal.getScreeningDataStoreApiUrlForDataStoreUrl(featureVectorDataSet.datastoreServerUrl), - data: { "method" : "getFeatureList", - params : [this.getSession(), featureVectorDataSet, featureListCode] - }, - success: action - }); -}; - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js deleted file mode 100644 index f5476a74d56..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/openbis.js +++ /dev/null @@ -1,1987 +0,0 @@ -/** - * ============================================= - * OpenBIS facade internal code (DO NOT USE!!!) - * ============================================= - */ - -if(typeof $ == 'undefined'){ - alert('Loading of openbis.js failed - jquery.js is missing'); -} - -function _openbisInternal(openbisUrlOrNull){ - this.init(openbisUrlOrNull); -} - -_openbisInternal.prototype.init = function(openbisUrlOrNull){ - this.openbisUrl = this.normalizeOpenbisUrl(openbisUrlOrNull); - this.generalInfoServiceUrl = this.openbisUrl + "/rmi-general-information-v1.json"; - this.generalInfoChangingServiceUrl = this.openbisUrl + "/rmi-general-information-changing-v1.json"; - this.queryServiceUrl = this.openbisUrl + "/rmi-query-v1.json"; - this.webInfoServiceUrl = this.openbisUrl + "/rmi-web-information-v1.json" -} - -_openbisInternal.prototype.log = function(msg){ - if(console){ - console.log(msg); - } -} - -_openbisInternal.prototype.normalizeOpenbisUrl = function(openbisUrlOrNull){ - var parts = this.parseUri(window.location); - - if(openbisUrlOrNull){ - var openbisParts = this.parseUri(openbisUrlOrNull); - - for(openbisPartName in openbisParts){ - var openbisPartValue = openbisParts[openbisPartName]; - - if(openbisPartValue){ - parts[openbisPartName] = openbisPartValue; - } - } - } - - return parts.protocol + "://" + parts.authority + "/openbis/openbis"; -} - -_openbisInternal.prototype.jsonRequestData = function(params) { - params["id"] = "1"; - params["jsonrpc"] = "2.0"; - return JSON.stringify(params) -} - -_openbisInternal.prototype.ajaxRequest = function(settings) { - settings.type = "POST"; - settings.processData = false; - settings.dataType = "json"; - settings.data = this.jsonRequestData(settings.data); - settings.success = this.ajaxRequestSuccess(settings.success); - // we call the same settings.success function for backward compatibility - settings.error = this.ajaxRequestError(settings.success); - $.ajax(settings) -} - -_openbisInternal.prototype.ajaxRequestSuccess = function(action){ - var openbisObj = this; - return function(response){ - if(response.error){ - openbisObj.log("Request failed: " + JSON.stringify(response.error)); - } - if(action){ - action(response); - } - }; -} - -_openbisInternal.prototype.ajaxRequestError = function(action){ - var openbisObj = this; - return function(xhr, status, error){ - openbisObj.log("Request failed: " + error); - if(action){ - action({ - "error" : "Request failed: " + error - }); - } - }; -} - -// Functions for working with cookies (see http://www.quirksmode.org/js/cookies.html) - -_openbisInternal.prototype.createCookie = function(name,value,days) { - if (days) { - var date = new Date(); - date.setTime(date.getTime()+(days*24*60*60*1000)); - var expires = "; expires="+date.toGMTString(); - } - else var expires = ""; - document.cookie = name+"="+value+expires+"; path=/"; -} - -_openbisInternal.prototype.readCookie = function(name) { - var nameEQ = name + "="; - var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { - var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); - } - return null; -} - -_openbisInternal.prototype.eraseCookie = function(name) { - this.createCookie(name,"",-1); -} - -// parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License (see http://blog.stevenlevithan.com/archives/parseuri) - -_openbisInternal.prototype.parseUri = function(str) { - var options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } - }; - - var o = options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) uri[o.key[i]] = m[i] || ""; - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -} - -_openbisInternal.prototype.listDataStores = function(action){ - this.ajaxRequest({ - url: this.generalInfoServiceUrl, - data: { "method" : "listDataStores", - "params" : [ this.sessionToken ] - }, - success: action - }); -} - -_openbisInternal.prototype.initDataStores = function(action){ - var openbisInternal = this; - - if(typeof this.dataStores === "undefined"){ - this.listDataStores(function(response){ - if(response.result){ - openbisInternal.dataStores = response.result; - }else{ - openbisInternal.dataStores = []; - } - action(); - }); - }else{ - action(); - } -} - -_openbisInternal.prototype.getDataStoreUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else{ - if(dataStoreCodeOrNull){ - var dataStoreUrl = null; - $.each(openbisInternal.dataStores, function(index, dataStore){ - if(dataStore.code == dataStoreCodeOrNull){ - dataStoreUrl = dataStore.downloadUrl; - } - }); - if(dataStoreUrl){ - action(dataStoreUrl); - }else{ - throw "Couldn't get a data store url because data store with " + dataStoreCodeOrNull + " code does not exist."; - } - }else{ - if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - throw "There is more than one data store configured. Please specify a data store code to get a data store url."; - } - } - } - }); -} - -_openbisInternal.prototype.getDataStoreUrlForDataSetCode = function(dataSetCode, action) { - var openbisInternal = this; - - this.initDataStores(function(){ - if(openbisInternal.dataStores.length == 0){ - throw "Couldn't get a data store url as there are no data stores configured."; - }else if(openbisInternal.dataStores.length == 1){ - action(openbisInternal.dataStores[0].downloadUrl); - }else{ - openbisInternal.ajaxRequest({ - url: openbisInternal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ openbisInternal.sessionToken, dataSetCode ] - }, - success: function(response){ - var hostUrl = response.result; - - if(hostUrl){ - action(hostUrl + "/datastore_server"); - }else{ - throw "Couldn't get a data store url for a data set with " + dataSetCode + " code because the data set does not exist."; - } - } - }); - } - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataStoreCode = function(dataStoreCodeOrNull, action) { - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreApiUrlForDataSetCode = function(dataSetCode, action) { - this.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - action(dataStoreUrl + "/rmi-dss-api-v1.json"); - }); -} - -_openbisInternal.prototype.getDataStoreHostForDataStoreCode = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var parts = openbisObj.parseUri(dataStoreUrl); - action(parts.protocol + "://" + parts.authority); - }); -} - -/** - * =============== - * OpenBIS facade - * =============== - * - * The facade provides access to the following services: - * - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService - * - ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer - * - ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService - * - ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric - * - * @class - * - */ - -function openbis(openbisUrlOrNull) { - this._internal = new _openbisInternal(openbisUrlOrNull); -} - -/** - * ================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService methods - * ================================================================================== - */ - -/** - * Log into openBIS. - * - * @see IGeneralInformationService.tryToAuthenticateForAllServices(String, String) - * @method - */ -openbis.prototype.login = function(userId, userPassword, action) { - var openbisObj = this - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryToAuthenticateForAllServices", - "params" : [ userId, userPassword ] - }, - success: - function(loginResponse) { - if(loginResponse.error){ - alert("Login failed"); - }else{ - openbisObj._internal.sessionToken = loginResponse.result; - openbisObj.rememberSession(); - } - openbisObj._internal.initDataStores(function(){ - action(loginResponse); - }); - } - }); -} - -/** - * Stores the current session in a cookie. - * - * @method - */ -openbis.prototype.rememberSession = function() { - this._internal.createCookie('openbis', this.getSession(), 1); -} - -/** - * Removes the current session from a cookie. - * - * @method - */ -openbis.prototype.forgetSession = function() { - this._internal.eraseCookie('openbis'); -} - -/** - * Restores the current session from a cookie. - * - * @method - */ -openbis.prototype.restoreSession = function() { - this._internal.sessionToken = this._internal.readCookie('openbis'); -} - -/** - * Sets the current session. - * - * @method - */ -openbis.prototype.useSession = function(sessionToken){ - this._internal.sessionToken = sessionToken; -} - -/** - * Returns the current session. - * - * @method - */ -openbis.prototype.getSession = function(){ - return this._internal.sessionToken; -} - -/** - * Checks whether the current session is still active. - * - * @see IGeneralInformationService.isSessionActive(String) - * @method - */ -openbis.prototype.isSessionActive = function(action) { - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "isSessionActive", - "params" : [ this.getSession() ] - }, - success: action - }); - }else{ - action({ result : false }) - } -} - -/** - * Restores the current session from a cookie and executes - * the specified action if the session is still active. - * - * @see restoreSession() - * @see isSessionActive() - * @method - */ -openbis.prototype.ifRestoredSessionActive = function(action) { - this.restoreSession(); - this.isSessionActive(function(data) { if (data.result) action(data) }); -} - -/** - * Log out of openBIS. - * - * @see IGeneralInformationService.logout(String) - * @method - */ -openbis.prototype.logout = function(action) { - this.forgetSession(); - - if(this.getSession()){ - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "logout", - "params" : [ this.getSession() ] - }, - success: action - }); - }else if(action){ - action({ result : null }); - } -} - -/** - * @see IGeneralInformationService.listNamedRoleSets(String) - * @method - */ -openbis.prototype.listNamedRoleSets = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listNamedRoleSets", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSpacesWithProjectsAndRoleAssignments(String, String) - * @method - */ -openbis.prototype.listSpacesWithProjectsAndRoleAssignments = function(databaseInstanceCodeOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSpacesWithProjectsAndRoleAssignments", - "params" : [ this.getSession(), databaseInstanceCodeOrNull ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForSamples = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForSamples", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamples(String, SearchCriteria, EnumSet<SampleFetchOption>) - * @method - */ -openbis.prototype.searchForSamplesWithFetchOptions = function(searchCriteria, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamples", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForSamplesOnBehalfOfUser(String, SearchCriteria, EnumSet<SampleFetchOption>, String) - * @method - */ -openbis.prototype.searchForSamplesOnBehalfOfUser = function(searchCriteria, fetchOptions, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "searchForSamplesOnBehalfOfUser", - "params" : [ - this.getSession(), - searchCriteria, - fetchOptions, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterSamplesVisibleToUser(String, List<Sample>, String) - * @method - */ -openbis.prototype.filterSamplesVisibleToUser = function(allSamples, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { - "method" : "filterSamplesVisibleToUser", - "params" : [ - this.getSession(), - allSamples, - userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperiment(String, String) - * @method - */ -openbis.prototype.listSamplesForExperiment = function(experimentIdentifier, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperiment", - "params" : [ this.getSession(), experimentIdentifier ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSamplesForExperimentOnBehalfOfUser(String, String, String) - * @method - */ -openbis.prototype.listSamplesForExperimentOnBehalfOfUser = function(experimentIdentifier, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSamplesForExperimentOnBehalfOfUser", - "params" : [ this.getSession(), experimentIdentifier, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>) - * @method - */ -openbis.prototype.listDataSetsForSamples = function(samples, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperiments = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingSamples(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingSamples = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingSamples", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentsHavingDataSets(String, List<Project>, String) - * @method - */ -openbis.prototype.listExperimentsHavingDataSets = function(projects, experimentType, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentsHavingDataSets", - "params" : [ this.getSession(), projects, experimentType ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterExperimentsVisibleToUser(String, List<Experiment>, String) - * @method - */ -openbis.prototype.filterExperimentsVisibleToUser = function(allExperiments, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterExperimentsVisibleToUser", - "params" : [ this.getSession(), allExperiments, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForSample(String, Sample, boolean) - * @method - */ -openbis.prototype.listDataSetsForSample = function(sample, restrictToDirectlyConnected, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForSample", - "params" : [ this.getSession(), sample, restrictToDirectlyConnected ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataStores(String) - * @method - */ -openbis.prototype.listDataStores = function(action) { - this._internal.listDataStores(action); -} - -/** - * @see IGeneralInformationService.getDefaultPutDataStoreBaseURL(String) - * @method - */ -openbis.prototype.getDefaultPutDataStoreBaseURL = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDefaultPutDataStoreBaseURL", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.tryGetDataStoreBaseURL(String) - * @method - */ -openbis.prototype.tryGetDataStoreBaseURL = function(dataSetCode, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "tryGetDataStoreBaseURL", - "params" : [ this.getSession(), dataSetCode ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataStoreBaseURLs(String, List<String>) - * @method - */ -openbis.prototype.getDataStoreBaseURLs = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataStoreBaseURLs", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetTypes(String) - * @method - */ -openbis.prototype.listDataSetTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listSampleTypes(String) - * @method - */ -openbis.prototype.listSampleTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listSampleTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperimentTypes(String) - * @method - */ -openbis.prototype.listExperimentTypes = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperimentTypes", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listVocabularies(String) - * @method - */ -openbis.prototype.listVocabularies = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listVocabularies", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSets(String, List<Sample>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForSamplesWithConnections = function(samples, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSets", - "params" : [ this.getSession(), samples, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsOnBehalfOfUser(String, List<Sample>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForSamplesOnBehalfOfUser = function(samples, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), samples, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperiments(String, List<Experiment>, EnumSet<Connections>) - * @method - */ -openbis.prototype.listDataSetsForExperiments = function(experiments, connectionsToGet, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperiments", - "params" : [ this.getSession(), experiments, connectionsToGet ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listDataSetsForExperimentsOnBehalfOfUser(String, List<Experiment>, EnumSet<Connections>, String) - * @method - */ -openbis.prototype.listDataSetsForExperimentsOnBehalfOfUser = function(experiments, connectionsToGet, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listDataSetsForExperimentsOnBehalfOfUser", - "params" : [ this.getSession(), experiments, connectionsToGet, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>) - * @method - */ -openbis.prototype.getDataSetMetaData = function(dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getDataSetMetaData(String, List<String>, EnumSet<DataSetFetchOption>) - * @method - */ -openbis.prototype.getDataSetMetaDataWithFetchOptions = function(dataSetCodes, fetchOptions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getDataSetMetaData", - "params" : [ this.getSession(), dataSetCodes, fetchOptions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSets(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForDataSets = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSets", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForDataSetsOnBehalfOfUser(String, SearchCriteria, String) - * @method - */ -openbis.prototype.searchForDataSetsOnBehalfOfUser = function(searchCriteria, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForDataSetsOnBehalfOfUser", - "params" : [ this.getSession(), - searchCriteria, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.filterDataSetsVisibleToUser(String, List<DataSet>, String) - * @method - */ -openbis.prototype.filterDataSetsVisibleToUser = function(allDataSets, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "filterDataSetsVisibleToUser", - "params" : [ this.getSession(), - allDataSets, - userId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listExperiments(String, List<String>) - * @method - */ -openbis.prototype.listExperimentsForIdentifiers = function(experimentIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listExperiments", - "params" : [ this.getSession(), - experimentIdentifiers ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForExperiments(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForExperiments = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForExperiments", - "params" : [ this.getSession(), - searchCriteria ] }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjects(String) - * @method - */ -openbis.prototype.listProjects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listProjectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listProjectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listProjectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMaterialByCodes(String, List<MaterialIdentifier>) - * @method - */ -openbis.prototype.getMaterialByCodes = function(materialIdentifiers, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMaterialByCodes", - "params" : [ this.getSession(), materialIdentifiers ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.searchForMaterials(String, SearchCriteria) - * @method - */ -openbis.prototype.searchForMaterials = function(searchCriteria, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "searchForMaterials", - "params" : [ this.getSession(), searchCriteria ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojects(String) - * @method - */ -openbis.prototype.listMetaprojects = function(action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojects", - "params" : [ this.getSession() ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listMetaprojectsOnBehalfOfUser(String, String) - * @method - */ -openbis.prototype.listMetaprojectsOnBehalfOfUser = function(userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listMetaprojectsOnBehalfOfUser", - "params" : [ this.getSession(), userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.getMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaproject", - "params" : [ this.getSession(), metaprojectId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.getMetaprojectOnBehalfOfUser(String, IMetaprojectId, String) - * @method - */ -openbis.prototype.getMetaprojectOnBehalfOfUser = function(metaprojectId, userId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "getMetaprojectOnBehalfOfUser", - "params" : [ this.getSession(), metaprojectId, userId ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForProject(String, IProjectId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForProject = function(projectId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForProject", - "params" : [ this.getSession(), projectId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForExperiment(String, IExperimentId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForExperiment = function(experimentId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForExperiment", - "params" : [ this.getSession(), experimentId, allVersions ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationService.listAttachmentsForSample(String, ISampleId, boolean) - * @method - */ -openbis.prototype.listAttachmentsForSample = function(sampleId, allVersions, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoServiceUrl, - data: { "method" : "listAttachmentsForSample", - "params" : [ this.getSession(), sampleId, allVersions ] - }, - success: action - }); -} - -/** - * ========================================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationChangingService methods - * ========================================================================================== - */ - -/** - * @see IGeneralInformationChangingService.updateSampleProperties(String, long, Map<String,String>) - * @method - */ -openbis.prototype.updateSampleProperties = function(sampleId, properties, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateSampleProperties", - "params" : [ this.getSession(), sampleId, properties ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addUnofficialVocabularyTerm(String, Long, NewVocabularyTerm) - * @method - */ -openbis.prototype.addUnofficialVocabularyTerm = function(vocabularyId, term, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addUnofficialVocabularyTerm", - "params" : [ this.getSession(), vocabularyId, term ] - }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.getWebAppSettings(String, String) - * @method - */ -openbis.prototype.getWebAppSettings = function(webappId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "getWebAppSettings", - params : [ this.getSession(), webappId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.setWebAppSettings(String, WebAppSettings) - * @method - */ -openbis.prototype.setWebAppSettings = function(webappSettings, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "setWebAppSettings", - params : [ this.getSession(), webappSettings ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.createMetaproject(String, String, String) - * @method - */ -openbis.prototype.createMetaproject = function(name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "createMetaproject", - params : [ this.getSession(), name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.updateMetaproject(String, IMetaprojectId, String, String) - * @method - */ -openbis.prototype.updateMetaproject = function(metaprojectId, name, descriptionOrNull, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "updateMetaproject", - params : [ this.getSession(), metaprojectId, name, descriptionOrNull ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.deleteMetaproject(String, IMetaprojectId) - * @method - */ -openbis.prototype.deleteMetaproject = function(metaprojectId, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "deleteMetaproject", - params : [ this.getSession(), metaprojectId ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.addToMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.addToMetaproject = function(metaprojectId, assignmentsToAdd, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "addToMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToAdd ] }, - success: action - }); -} - -/** - * @see IGeneralInformationChangingService.removeFromMetaproject(String, IMetaprojectId, MetaprojectAssignmentsIds) - * @method - */ -openbis.prototype.removeFromMetaproject = function(metaprojectId, assignmentsToRemove, action) { - this._internal.ajaxRequest({ - url: this._internal.generalInfoChangingServiceUrl, - data: { "method" : "removeFromMetaproject", - params : [ this.getSession(), metaprojectId, assignmentsToRemove ] }, - success: action - }); -} - -/** - * ============================================================================ - * ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer methods - * ============================================================================ - */ - -/** - * @see IQueryApiServer.listQueries(String) - * @method - */ -openbis.prototype.listQueries = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listQueries", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.executeQuery(String, long, Map<String, String>) - * @method - */ -openbis.prototype.executeQuery = function(queryId, parameterBindings, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "executeQuery", - "params" : [ this.getSession(), queryId, parameterBindings ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listTableReportDescriptions(String) - * @method - */ -openbis.prototype.listTableReportDescriptions = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listTableReportDescriptions", - "params" : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromDataSets(String, String, String, List<String>) - * @method - */ -openbis.prototype.createReportFromDataSets = function(dataStoreCode, serviceKey, dataSetCodes, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromDataSets", - params : [ this.getSession(), dataStoreCode, serviceKey, dataSetCodes ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.listAggregationServices(String) - * @method - */ -openbis.prototype.listAggregationServices = function(action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "listAggregationServices", - params : [ this.getSession() ] }, - success: action - }); -} - -/** - * @see IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) - * @method - */ -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - this._internal.ajaxRequest({ - url: this._internal.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.getSession(), dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - - -/** - * ============================================================================== - * ch.systemsx.cisd.openbis.generic.shared.api.v1.IWebInformationService methods - * ============================================================================== - */ - -/** - * Returns the current server side session. - * - * @see IWebInformationService.getSessionToken() - * @method - */ -openbis.prototype.getSessionTokenFromServer = function(action) { - this._internal.ajaxRequest({ - url: this._internal.webInfoServiceUrl, - data: { "method" : "getSessionToken" }, - success: action - }); -} - -/** - * ================================================================================= - * ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.IDssServiceRpcGeneric methods - * ================================================================================= - */ - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.listFilesForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, DataSetFileDTO) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFile = function(fileOrFolder, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), fileOrFolder ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileInSession = function(fileOrFolder, action) { - this.getDownloadUrlForFileForDataSetInSession(fileOrFolder.dataSetCode, fileOrFolder.path, action); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, DataSetFileDTO, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetFileWithTimeout = function(fileOrFolder, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(fileOrFolder.dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), fileOrFolder, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.listFilesForDataSet(String, String, String, boolean) - * @method - */ -openbis.prototype.listFilesForDataSet = function(dataSetCode, path, recursive, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "listFilesForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path, recursive ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSet(String, String, String) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSet = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, path ] }, - success: action - }); - }); -} - -/** - * Returns a download url that is valid as long as the user session is valid. - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetInSession = function(dataSetCode, path, action) { - var openbisObj = this; - this._internal.getDataStoreUrlForDataSetCode(dataSetCode, function(dataStoreUrl){ - var pathWithoutSlash = path.charAt(0) == "/" ? path.substr(1) : path; - var url = dataStoreUrl + "/" + dataSetCode + "/" + pathWithoutSlash + "?sessionID=" + openbisObj.getSession(); - action(url); - }); -} - -/** - * @see IDssServiceRpcGeneric.getDownloadUrlForFileForDataSetWithTimeout(String, String, String, long) - * @method - */ -openbis.prototype.getDownloadUrlForFileForDataSetWithTimeout = function(dataSetCode, path, validityDurationInSeconds, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getDownloadUrlForFileForDataSetWithTimeout", - "params" : [ openbisObj.getSession(), dataSetCode, path, validityDurationInSeconds ] }, - success: action - }); - }); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploader = function(uploaderContainer, oncomplete){ - this.createSessionWorkspaceUploaderForDataStore(uploaderContainer, null, oncomplete); -} - -/** - * Creates a session workspace file uploader inside the specified uploaderContainer element and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceUploaderForDataStore = function(uploaderContainer, dataStoreCodeOrNull, oncomplete){ - var uploaderSupported = window.File && window.FileReader && window.XMLHttpRequest; - - if(!uploaderSupported){ - alert("Uploader is not supported by your browser."); - return; - } - - var $this = this; - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - // figure out what is the location of the openbis.js script and assume that uploader resources are served by the same server - var openbisScriptLocation = $('script[src*=openbis\\.js]').attr('src'); - var uploaderDirectoryLocation = jsFileLocation = openbisScriptLocation.replace(/js\/openbis\.js/g, 'uploader'); - - $('head').append('<link rel="stylesheet" media="screen" type="text/css" href="' + uploaderDirectoryLocation + '/css/src/upload.css" />'); - $('head').append('<script charset="utf-8" type="text/javascript" src="' + uploaderDirectoryLocation + '/js/src/upload.js" />'); - - $(uploaderContainer).load(uploaderDirectoryLocation + "/index.html", function(){ - Uploader.init({ - smart_mode: true, - chunk_size: 1000*1024, - file_upload_url: dataStoreUrl + "/session_workspace_file_upload", - form_upload_url: dataStoreUrl + "/session_workspace_form_upload", - file_download_url: dataStoreUrl + "/session_workspace_file_download", - oncomplete: oncomplete, - sessionID: $this.getSession() - }); - }); - }); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrl = function(filePath, action){ - return this.createSessionWorkspaceDownloadUrlForDataStore(filePath, null, action); -} - -/** - * Creates a session workspace download url for a file with the specified filePath and for the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadUrlForDataStore = function(filePath, dataStoreCodeOrNull, action){ - var openbisObj = this; - - this._internal.getDataStoreUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreUrl){ - var downloadUrl = dataStoreUrl + "/session_workspace_file_download?sessionID=" + openbisObj.getSession() + "&filePath=" + filePath; - action(downloadUrl); - }); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the default data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLink = function(filePath, linkText, action){ - return this.createSessionWorkspaceDownloadLinkForDataStore(filePath, linkText, null, action); -} - -/** - * Create a session workspace download link for a file with the specified filePath at the specified data store. - * @method - */ -openbis.prototype.createSessionWorkspaceDownloadLinkForDataStore = function(filePath, linkText, dataStoreCodeOrNull, action){ - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - var link = $("<a href='" + downloadUrl + "'>" + (linkText ? linkText : filePath) + "</a>"); - action(link); - }); -} - -/** - * Downloads a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFile = function(filePath, action) { - this.downloadSessionWorkspaceFileForDataStore(filePath, null, action); -} - -/** - * Downloads a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.downloadSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this.createSessionWorkspaceDownloadUrlForDataStore(filePath, dataStoreCodeOrNull, function(downloadUrl){ - $.ajax({ - type: "GET", - dataType: "text", - url: downloadUrl, - success: openbisObj._internal.ajaxRequestSuccess(action), - error: openbisObj._internal.ajaxRequestError(action) - }); - }); -} - -/** - * Deletes a session workspace file with the specified filePath from the default data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFile = function(filePath, action) { - this.deleteSessionWorkspaceFileForDataStore(filePath, null, action) -} - -/** - * Deletes a session workspace file with the specified filePath from the specified data store. - * @method - */ -openbis.prototype.deleteSessionWorkspaceFileForDataStore = function(filePath, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "deleteSessionWorkspaceFile", - "params" : [ openbisObj.getSession(), filePath ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.getPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.getPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "getPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.tryGetPathToDataSet(String, String, String) - * @method - */ -openbis.prototype.tryGetPathToDataSet = function(dataSetCode, overrideStoreRootPathOrNull, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "tryGetPathToDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, overrideStoreRootPathOrNull ] }, - success: action - }); - }); -} - -/** - * List shares from the default data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllShares = function(action) { - this.listAllSharesForDataStore(null, action); -} - -/** - * List shares from the specified data store. - * - * @see IDssServiceRpcGeneric.listAllShares(String) - * @method - */ -openbis.prototype.listAllSharesForDataStore = function(dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "listAllShares", - "params" : [ openbisObj.getSession() ] - }, - success: action - }); - }); -} - -/** - * @see IDssServiceRpcGeneric.shuffleDataSet(String, String, String) - * @method - */ -openbis.prototype.shuffleDataSet = function(dataSetCode, shareId, action) { - var openbisObj = this; - this._internal.getDataStoreApiUrlForDataSetCode(dataSetCode, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { "method" : "shuffleDataSet", - "params" : [ openbisObj.getSession(), dataSetCode, shareId ] }, - success: action - }); - }); -} - -/** - * Get a validation script from the default data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScript = function(dataSetTypeOrNull, action) { - this.getValidationScriptForDataStore(dataSetTypeOrNull, null, action); -} - -/** - * Get a validation script from the specified data store. - * - * @see IDssServiceRpcGeneric.getValidationScript(String, String) - * @method - */ -openbis.prototype.getValidationScriptForDataStore = function(dataSetTypeOrNull, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreApiUrlForDataStoreCode(dataStoreCodeOrNull, function(dataStoreApiUrl){ - openbisObj._internal.ajaxRequest({ - url: dataStoreApiUrl, - data: { - "method" : "getValidationScript", - "params" : [ openbisObj.getSession(), dataSetTypeOrNull ] - }, - success: action - }); - }); -} - -/** - * Get a url that will produce a graph with the given configuration at the default data store. - * - * @method - */ -openbis.prototype.getGraphUrl = function(graphConfig, action) { - this.getGraphUrlForDataStore(graphConfig, null, action); -} - -/** - * Get a url that will produce a graph with the given configuration at the specified data store. - * - * @method - */ -openbis.prototype.getGraphUrlForDataStore = function(graphConfig, dataStoreCodeOrNull, action) { - var openbisObj = this; - - this._internal.getDataStoreHostForDataStoreCode(dataStoreCodeOrNull, function(dataStoreHost) { - var graphUrl = dataStoreHost + "/graphservice/?sessionID=" + openbisObj.getSession(); - for (prop in graphConfig) { - graphUrl += "&" + prop + "=" + encodeURIComponent(graphConfig[prop]); - } - action(graphUrl); - }); -} - -/** - * ===================== - * OpenBIS graph config - * ===================== - * - * Defines the configuration for a graph generated by the server's graphservice. - * - * To use, set properties on the object with keys that match the name of the servlet - * parameters of the graphservice and then call the method getGraphUrl on the openbis - * object. Do *not* set the sessionID paramter -- this will be filled in by the openbis - * object. - * - * The graphservice is documented here: https://wiki-bsse.ethz.ch/display/openBISDoc/Configuring+Graphs+and+Plots - * - * @class - * - */ -function openbisGraphConfig(filename, graphtype, title) { - this.file = filename; - this["graph-type"] = graphtype; - this.title = title; -} - - -/** - * ===================================================== - * OpenBIS webapp context internal code (DO NOT USE!!!) - * ===================================================== - */ - -function _openbisWebAppContextInternal(){ - this.webappCode = this.getParameter("webapp-code"); - this.sessionId = this.getParameter("session-id"); - this.entityKind = this.getParameter("entity-kind"); - this.entityType = this.getParameter("entity-type"); - this.entityIdentifier = this.getParameter("entity-identifier"); - this.entityPermId = this.getParameter("entity-perm-id"); -} - -_openbisWebAppContextInternal.prototype.getParameter = function(parameterName){ - var match = location.search.match(RegExp("[?|&]"+parameterName+'=(.+?)(&|$)')); - if(match && match[1]){ - return decodeURIComponent(match[1].replace(/\+/g,' ')); - }else{ - return null; - } -} - -/** - * ======================= - * OpenBIS webapp context - * ======================= - * - * Provides a context information for webapps that are embedded inside the OpenBIS UI. - * - * @class - * - */ -function openbisWebAppContext(){ - this._internal = new _openbisWebAppContextInternal(); -} - -openbisWebAppContext.prototype.getWebappCode = function(){ - return this._internal.webappCode; -} - -openbisWebAppContext.prototype.getSessionId = function(){ - return this._internal.sessionId; -} - -openbisWebAppContext.prototype.getEntityKind = function(){ - return this._internal.entityKind; -} - -openbisWebAppContext.prototype.getEntityType = function(){ - return this._internal.entityType; -} - -openbisWebAppContext.prototype.getEntityIdentifier = function(){ - return this._internal.entityIdentifier; -} - -openbisWebAppContext.prototype.getEntityPermId = function(){ - return this._internal.entityPermId; -} - -openbisWebAppContext.prototype.getParameter = function(parameterName){ - return this._internal.getParameter(parameterName); -} - -/** - * ======================= - * OpenBIS Search Criteria - * ======================= - * - * Methods and classes for constructing search criteria objects for use in searches. - */ - -/** - * It is easier to construct instances of match clauses using one of the factory methods: - * - * createPropertyMatch - * createAttributeMatch - * createTimeAttributeMatch - * createAnyPropertyMatch - * createAnyFieldMatch - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause - * @class - */ -function SearchCriteriaMatchClause(type, fieldType, fieldCode, desiredValue) { - this["@type"] = type; - this["fieldType"] = fieldType; - this["fieldCode"] = fieldCode; - this["desiredValue"] = desiredValue; - // compareMode should be one of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - this["compareMode"] = "EQUALS"; -} - -/** - * Factory method to create a match for a property. - * - * @param propertyCode The code of the property to compare against - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createPropertyMatch(String, String) - * @method - */ -SearchCriteriaMatchClause.createPropertyMatch = function(propertyCode, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("PropertyMatchClause", "PROPERTY", propertyCode, desiredValue); - matchClause["propertyCode"] = propertyCode; - return matchClause; -} - -/** - * Factory method to create a match for an attribute. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute. - * It should come from this list: - * // common - * "CODE", "TYPE", "PERM_ID", - * // for sample or experiment - * "SPACE", - * // for experiment - * "PROJECT", - * // for all types of entities - * "METAPROJECT" - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseAttribute, String) - * @method - */ -SearchCriteriaMatchClause.createAttributeMatch = function(attribute, desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AttributeMatchClause", "ATTRIBUTE", attribute, desiredValue); - matchClause["attribute"] = attribute; - return matchClause; -} - -/** - * Factory method to create a MatchClause matching against registration or modification - * date. - * - * @param attribute Should be a valid ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseTimeAttribute - * It should come from this list: REGISTRATION_DATE, MODIFICATION_DATE - * - * @param mode One of "LESS_THAN_OR_EQUAL", "EQUALS", "GREATER_THAN_OR_EQUAL" - * @param date The date to compare against, format YYYY-MM-DD - * @timezone The time zone of the date ("+1", "-5", "0", etc.) - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAttributeMatch(MatchClauseTimeAttribute, CompareMode, String, String) - * @method - */ -SearchCriteriaMatchClause.createTimeAttributeMatch = function(attribute, mode, date, timezone) -{ - var matchClause = new SearchCriteriaMatchClause("TimeAttributeMatchClause", "ATTRIBUTE", attribute, date); - matchClause["attribute"] = attribute; - matchClause["compareMode"] = mode; - matchClause["timeZone"] = timezone; - return matchClause; -} - -/** - * Factory method to create a match for against any property. - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyPropertyMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyPropertyMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyPropertyMatchClause", "ANY_PROPERTY", null, desiredValue); - return matchClause; -} - -/** - * Factory method to create a match for against any field (property or attribute). - * - * @param desiredValue The value used in the comparison - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause.createAnyFieldMatch(String) - * @method - */ -SearchCriteriaMatchClause.createAnyFieldMatch = function(desiredValue) { - var matchClause = new SearchCriteriaMatchClause("AnyFieldMatchClause", "ANY_FIELD", null, desiredValue); - return matchClause; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria - * @class - */ -function SearchCriteria() { - this["@type"] = "SearchCriteria"; - // operator should be either of "MATCH_ALL_CLAUSES" or "MATCH_ANY_CLAUSES" - this["operator"] = "MATCH_ALL_CLAUSES"; - this["matchClauses"] = []; - this["subCriterias"] = []; -} - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addMatchClause(MatchClause) - * @method - */ -SearchCriteria.prototype.addMatchClause = function(matchClause) { - this["matchClauses"].push(matchClause); -}; - -/** - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.addSubCriteria(SearchSubCriteria) - * @method - */ -SearchCriteria.prototype.addSubCriteria = function(subCriteria) { - this["subCriterias"].push(subCriteria); -}; - - -/** - * It is easier to construct instances of sub criteria using one of the factory methods: - * - * createSampleParentCriteria - * createSampleChildCriteria - * createSampleContainerCriteria - * createSampleCriteria - * createExperimentCriteria - * createDataSetContainerCriteria - * createDataSetParentCriteria - * createDataSetChildCriteria - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria - * @class - */ -function SearchSubCriteria(targetEntityKind, searchCriteria) { - this["@type"] = "SearchSubCriteria"; - this["targetEntityKind"] = targetEntityKind; - this["criteria"] = searchCriteria; -} - -/** - * Factory method to create a match for a sample parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a sample child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CHILD", searchCriteria) -} - -/** - * Factory method to create a match for a sample container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a sample. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createSampleCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createSampleCriteria = function(searchCriteria) { - return new SearchSubCriteria("SAMPLE", searchCriteria) -} - -/** - * Factory method to create a match for an experiment. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createExperimentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createExperimentCriteria = function(searchCriteria) { - return new SearchSubCriteria("EXPERIMENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set container. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetContainerCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetContainerCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CONTAINER", searchCriteria) -} - -/** - * Factory method to create a match for a data set parent. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetParentCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetParentCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_PARENT", searchCriteria) -} - -/** - * Factory method to create a match for a data set child. - * - * @see ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria.createDataSetChildCriteria(SearchCriteria) - * @method - */ -SearchSubCriteria.createDataSetChildCriteria = function(searchCriteria) { - return new SearchSubCriteria("DATA_SET_CHILD", searchCriteria) -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js deleted file mode 100644 index 942980c82a0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/html/js/spin.min.js +++ /dev/null @@ -1,2 +0,0 @@ -//fgnass.github.com/spin.js#v1.2.7 -!function(e,t,n){function o(e,n){var r=t.createElement(e||"div"),i;for(i in n)r[i]=n[i];return r}function u(e){for(var t=1,n=arguments.length;t<n;t++)e.appendChild(arguments[t]);return e}function f(e,t,n,r){var o=["opacity",t,~~(e*100),n,r].join("-"),u=.01+n/r*100,f=Math.max(1-(1-e)/t*(100-u),e),l=s.substring(0,s.indexOf("Animation")).toLowerCase(),c=l&&"-"+l+"-"||"";return i[o]||(a.insertRule("@"+c+"keyframes "+o+"{"+"0%{opacity:"+f+"}"+u+"%{opacity:"+e+"}"+(u+.01)+"%{opacity:1}"+(u+t)%100+"%{opacity:"+e+"}"+"100%{opacity:"+f+"}"+"}",a.cssRules.length),i[o]=1),o}function l(e,t){var i=e.style,s,o;if(i[t]!==n)return t;t=t.charAt(0).toUpperCase()+t.slice(1);for(o=0;o<r.length;o++){s=r[o]+t;if(i[s]!==n)return s}}function c(e,t){for(var n in t)e.style[l(e,n)||n]=t[n];return e}function h(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var i in r)e[i]===n&&(e[i]=r[i])}return e}function p(e){var t={x:e.offsetLeft,y:e.offsetTop};while(e=e.offsetParent)t.x+=e.offsetLeft,t.y+=e.offsetTop;return t}var r=["webkit","Moz","ms","O"],i={},s,a=function(){var e=o("style",{type:"text/css"});return u(t.getElementsByTagName("head")[0],e),e.sheet||e.styleSheet}(),d={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"auto",left:"auto",position:"relative"},v=function m(e){if(!this.spin)return new m(e);this.opts=h(e||{},m.defaults,d)};v.defaults={},h(v.prototype,{spin:function(e){this.stop();var t=this,n=t.opts,r=t.el=c(o(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex}),i=n.radius+n.length+n.width,u,a;e&&(e.insertBefore(r,e.firstChild||null),a=p(e),u=p(r),c(r,{left:(n.left=="auto"?a.x-u.x+(e.offsetWidth>>1):parseInt(n.left,10)+i)+"px",top:(n.top=="auto"?a.y-u.y+(e.offsetHeight>>1):parseInt(n.top,10)+i)+"px"})),r.setAttribute("aria-role","progressbar"),t.lines(r,t.opts);if(!s){var f=0,l=n.fps,h=l/n.speed,d=(1-n.opacity)/(h*n.trail/100),v=h/n.lines;(function m(){f++;for(var e=n.lines;e;e--){var i=Math.max(1-(f+e*v)%h*d,n.opacity);t.opacity(r,n.lines-e,i,n)}t.timeout=t.el&&setTimeout(m,~~(1e3/l))})()}return t},stop:function(){var e=this.el;return e&&(clearTimeout(this.timeout),e.parentNode&&e.parentNode.removeChild(e),this.el=n),this},lines:function(e,t){function i(e,r){return c(o(),{position:"absolute",width:t.length+t.width+"px",height:t.width+"px",background:e,boxShadow:r,transformOrigin:"left",transform:"rotate("+~~(360/t.lines*n+t.rotate)+"deg) translate("+t.radius+"px"+",0)",borderRadius:(t.corners*t.width>>1)+"px"})}var n=0,r;for(;n<t.lines;n++)r=c(o(),{position:"absolute",top:1+~(t.width/2)+"px",transform:t.hwaccel?"translate3d(0,0,0)":"",opacity:t.opacity,animation:s&&f(t.opacity,t.trail,n,t.lines)+" "+1/t.speed+"s linear infinite"}),t.shadow&&u(r,c(i("#000","0 0 4px #000"),{top:"2px"})),u(e,u(r,i(t.color,"0 0 1px rgba(0,0,0,.1)")));return e},opacity:function(e,t,n){t<e.childNodes.length&&(e.childNodes[t].style.opacity=n)}}),function(){function e(e,t){return o("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',t)}var t=c(o("group"),{behavior:"url(#default#VML)"});!l(t,"transform")&&t.adj?(a.addRule(".spin-vml","behavior:url(#default#VML)"),v.prototype.lines=function(t,n){function s(){return c(e("group",{coordsize:i+" "+i,coordorigin:-r+" "+ -r}),{width:i,height:i})}function l(t,i,o){u(a,u(c(s(),{rotation:360/n.lines*t+"deg",left:~~i}),u(c(e("roundrect",{arcsize:n.corners}),{width:r,height:n.width,left:n.radius,top:-n.width>>1,filter:o}),e("fill",{color:n.color,opacity:n.opacity}),e("stroke",{opacity:0}))))}var r=n.length+n.width,i=2*r,o=-(n.width+n.length)*2+"px",a=c(s(),{position:"absolute",top:o,left:o}),f;if(n.shadow)for(f=1;f<=n.lines;f++)l(f,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(f=1;f<=n.lines;f++)l(f);return u(t,a)},v.prototype.opacity=function(e,t,n,r){var i=e.firstChild;r=r.shadow&&r.lines||0,i&&t+r<i.childNodes.length&&(i=i.childNodes[t+r],i=i&&i.firstChild,i=i&&i.firstChild,i&&(i.opacity=n))}):s=l(t,"animation")}(),typeof define=="function"&&define.amd?define(function(){return v}):e.Spinner=v}(window,document); \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties deleted file mode 100644 index 26b2c9b16e7..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/demultiplexing/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Demultiplex diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css deleted file mode 100644 index 31d71932834..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/body-style.css +++ /dev/null @@ -1,60 +0,0 @@ - -input { -border: 0px solid; -height: 25px; -border-color:#000000; -outline: none; -font: 18px "Trebuchet MS"; -} - -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { -font: 10px; -color:#999999; - } -h3 { font: 12px; } - -.greytext {font: 18px "Trebuchet MS";} -.greytext:link {color:#BDBDBD; text-decoration:none} -.greytext:visited {color:#BDBDBD; text-decoration:none} -.greytext:active {color:#BDBDBD; text-decoration:none} -.greytext:hover {color:#000000; text-decoration:none} -.greytext input {color:#999999; text-decoration:none} - - -.box { -background-color: white; -text-rendering: optimizeLegibility; --webkit-border-radius: 6px; -height: 50px; -width: 480px; -margin-top: 30px; -padding: 8px 8px 8px 50px; -border: 3px solid #999999; -box-sizing: border-box; --webkit-box-sizing: border-box; --moz-box-sizing: border-box; -border-radius: 6px 6px 6px 6px; -} - -.loginname { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px 10px; -} - -.password { -background-image: url(images/sprite.png); -background-repeat: no-repeat; -background-position: 5px -30px; -} - -.loginbutton { -margin-top: 30px; -} - -div -{ -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css deleted file mode 100644 index 37c8cbc7bef..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/button.css +++ /dev/null @@ -1,39 +0,0 @@ -button { - font: 18px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 6px; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; - width: 150px; -} - -button.first { - border-top-left-radius: 6px; - border-bottom-left-radius: 6px; -} - -button.last { - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; -} - -button.active { - background-color:red; -} - -button:hover { - background-color: grey; - cursor: pointer; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js deleted file mode 100644 index e1c0831c88e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/d3.time.js +++ /dev/null @@ -1,692 +0,0 @@ -(function(){d3.time = {}; - -var d3_time = Date; -d3.time.format = function(template) { - var n = template.length; - - function format(date) { - var string = [], - i = -1, - j = 0, - c, - f; - while (++i < n) { - if (template.charCodeAt(i) == 37) { - string.push( - template.substring(j, i), - (f = d3_time_formats[c = template.charAt(++i)]) - ? f(date) : c); - j = i + 1; - } - } - string.push(template.substring(j, i)); - return string.join(""); - } - - format.parse = function(string) { - var date = new d3_time(1900, 0, 1), - i = d3_time_parse(date, template, string, 0); - if (i != string.length) return null; - if (date.hour12) { - var hours = date.getHours() % 12; - date.setHours(date.hour12pm ? hours + 12 : hours); - } - delete date.hour12; - delete date.hour12pm; - return date; - }; - - format.toString = function() { - return template; - }; - - return format; -}; - -function d3_time_parse(date, template, string, j) { - var c, - p, - i = 0, - n = template.length, - m = string.length; - while (i < n) { - if (j >= m) return -1; - c = template.charCodeAt(i++); - if (c == 37) { - p = d3_time_parsers[template.charAt(i++)]; - if (!p || ((j = p(date, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } - } - return j; -} - -var d3_time_zfill2 = d3.format("02d"), - d3_time_zfill3 = d3.format("03d"), - d3_time_zfill4 = d3.format("04d"), - d3_time_sfill2 = d3.format("2d"); - -var d3_time_formats = { - a: function(d) { return d3_time_weekdays[d.getDay()].substring(0, 3); }, - A: function(d) { return d3_time_weekdays[d.getDay()]; }, - b: function(d) { return d3_time_months[d.getMonth()].substring(0, 3); }, - B: function(d) { return d3_time_months[d.getMonth()]; }, - c: d3.time.format("%a %b %e %H:%M:%S %Y"), - d: function(d) { return d3_time_zfill2(d.getDate()); }, - e: function(d) { return d3_time_sfill2(d.getDate()); }, - H: function(d) { return d3_time_zfill2(d.getHours()); }, - I: function(d) { return d3_time_zfill2(d.getHours() % 12 || 12); }, - j: d3_time_dayOfYear, - L: function(d) { return d3_time_zfill3(d.getMilliseconds()); }, - m: function(d) { return d3_time_zfill2(d.getMonth() + 1); }, - M: function(d) { return d3_time_zfill2(d.getMinutes()); }, - p: function(d) { return d.getHours() >= 12 ? "PM" : "AM"; }, - S: function(d) { return d3_time_zfill2(d.getSeconds()); }, - U: d3_time_weekNumberSunday, - w: function(d) { return d.getDay(); }, - W: d3_time_weekNumberMonday, - x: d3.time.format("%m/%d/%y"), - X: d3.time.format("%H:%M:%S"), - y: function(d) { return d3_time_zfill2(d.getFullYear() % 100); }, - Y: function(d) { return d3_time_zfill4(d.getFullYear() % 10000); }, - Z: d3_time_zone, - "%": function(d) { return "%"; } -}; - -var d3_time_parsers = { - a: d3_time_parseWeekdayAbbrev, - A: d3_time_parseWeekday, - b: d3_time_parseMonthAbbrev, - B: d3_time_parseMonth, - c: d3_time_parseLocaleFull, - d: d3_time_parseDay, - e: d3_time_parseDay, - H: d3_time_parseHour24, - I: d3_time_parseHour12, - // j: function(d, s, i) { /*TODO day of year [001,366] */ return i; }, - L: d3_time_parseMilliseconds, - m: d3_time_parseMonthNumber, - M: d3_time_parseMinutes, - p: d3_time_parseAmPm, - S: d3_time_parseSeconds, - // U: function(d, s, i) { /*TODO week number (sunday) [00,53] */ return i; }, - // w: function(d, s, i) { /*TODO weekday [0,6] */ return i; }, - // W: function(d, s, i) { /*TODO week number (monday) [00,53] */ return i; }, - x: d3_time_parseLocaleDate, - X: d3_time_parseLocaleTime, - y: d3_time_parseYear, - Y: d3_time_parseFullYear - // , - // Z: function(d, s, i) { /*TODO time zone */ return i; }, - // "%": function(d, s, i) { /*TODO literal % */ return i; } -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekdayAbbrev(date, string, i) { - return string.substring(i, i += 3).toLowerCase() in d3_time_weekdayAbbrevLookup ? i : -1; -} - -var d3_time_weekdayAbbrevLookup = { - sun: 3, - mon: 3, - tue: 3, - wed: 3, - thu: 3, - fri: 3, - sat: 3 -}; - -// Note: weekday is validated, but does not set the date. -function d3_time_parseWeekday(date, string, i) { - d3_time_weekdayRe.lastIndex = 0; - var n = d3_time_weekdayRe.exec(string.substring(i, i + 10)); - return n ? i += n[0].length : -1; -} - -var d3_time_weekdayRe = /^(?:Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)/ig; - -var d3_time_weekdays = [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" -]; - -function d3_time_parseMonthAbbrev(date, string, i) { - var n = d3_time_monthAbbrevLookup[string.substring(i, i += 3).toLowerCase()]; - return n == null ? -1 : (date.setMonth(n), i); -} - -var d3_time_monthAbbrevLookup = { - jan: 0, - feb: 1, - mar: 2, - apr: 3, - may: 4, - jun: 5, - jul: 6, - aug: 7, - sep: 8, - oct: 9, - nov: 10, - dec: 11 -}; - -function d3_time_parseMonth(date, string, i) { - d3_time_monthRe.lastIndex = 0; - var n = d3_time_monthRe.exec(string.substring(i, i + 12)); - return n ? (date.setMonth(d3_time_monthLookup[n[0].toLowerCase()]), i += n[0].length) : -1; -} - -var d3_time_monthRe = /^(?:January|February|March|April|May|June|July|August|September|October|November|December)/ig; - -var d3_time_monthLookup = { - january: 0, - february: 1, - march: 2, - april: 3, - may: 4, - june: 5, - july: 6, - august: 7, - september: 8, - october: 9, - november: 10, - december: 11 -}; - -var d3_time_months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December" -]; - -function d3_time_parseLocaleFull(date, string, i) { - return d3_time_parse(date, d3_time_formats.c.toString(), string, i); -} - -function d3_time_parseLocaleDate(date, string, i) { - return d3_time_parse(date, d3_time_formats.x.toString(), string, i); -} - -function d3_time_parseLocaleTime(date, string, i) { - return d3_time_parse(date, d3_time_formats.X.toString(), string, i); -} - -function d3_time_parseFullYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 4)); - return n ? (date.setFullYear(n[0]), i += n[0].length) : -1; -} - -function d3_time_parseYear(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setFullYear(d3_time_century() + +n[0]), i += n[0].length) : -1; -} - -function d3_time_century() { - return ~~(new Date().getFullYear() / 1000) * 1000; -} - -function d3_time_parseMonthNumber(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMonth(n[0] - 1), i += n[0].length) : -1; -} - -function d3_time_parseDay(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setDate(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [0,23]. -function d3_time_parseHour24(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setHours(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't validate that the hour is in the range [1,12]. -function d3_time_parseHour12(date, string, i) { - date.hour12 = true; - return d3_time_parseHour24(date, string, i); -} - -function d3_time_parseMinutes(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setMinutes(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseSeconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 2)); - return n ? (date.setSeconds(+n[0]), i += n[0].length) : -1; -} - -function d3_time_parseMilliseconds(date, string, i) { - d3_time_numberRe.lastIndex = 0; - var n = d3_time_numberRe.exec(string.substring(i, i + 3)); - return n ? (date.setMilliseconds(+n[0]), i += n[0].length) : -1; -} - -// Note: we don't look at the next directive. -var d3_time_numberRe = /\s*\d+/; - -function d3_time_parseAmPm(date, string, i) { - var n = d3_time_amPmLookup[string.substring(i, i += 2).toLowerCase()]; - return n == null ? -1 : (date.hour12pm = n, i); -} - -var d3_time_amPmLookup = { - am: 0, - pm: 1 -}; - -function d3_time_year(d) { - return new d3_time(d.getFullYear(), 0, 1); -} - -function d3_time_daysElapsed(d0, d1) { - return ~~((d1 - d0) / 864e5 - (d1.getTimezoneOffset() - d0.getTimezoneOffset()) / 1440); -} - -function d3_time_dayOfYear(d) { - return d3_time_zfill3(1 + d3_time_daysElapsed(d3_time_year(d), d)); -} - -function d3_time_weekNumberSunday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + d0.getDay()) / 7)); -} - -function d3_time_weekNumberMonday(d) { - var d0 = d3_time_year(d); - return d3_time_zfill2(~~((d3_time_daysElapsed(d0, d) + (d0.getDay() + 6) % 7) / 7)); -} - -// TODO table of time zone offset names? -function d3_time_zone(d) { - var z = d.getTimezoneOffset(), - zs = z > 0 ? "-" : "+", - zh = ~~(Math.abs(z) / 60), - zm = Math.abs(z) % 60; - return zs + d3_time_zfill2(zh) + d3_time_zfill2(zm); -} -d3.time.format.utc = function(template) { - var local = d3.time.format(template); - - function format(date) { - try { - d3_time = d3_time_format_utc; - var utc = new d3_time(); - utc._ = date; - return local(utc); - } finally { - d3_time = Date; - } - } - - format.parse = function(string) { - try { - d3_time = d3_time_format_utc; - var date = local.parse(string); - return date && date._; - } finally { - d3_time = Date; - } - }; - - format.toString = local.toString; - - return format; -}; - -function d3_time_format_utc() { - this._ = new Date(Date.UTC.apply(this, arguments)); -} - -d3_time_format_utc.prototype = { - getDate: function() { return this._.getUTCDate(); }, - getDay: function() { return this._.getUTCDay(); }, - getFullYear: function() { return this._.getUTCFullYear(); }, - getHours: function() { return this._.getUTCHours(); }, - getMilliseconds: function() { return this._.getUTCMilliseconds(); }, - getMinutes: function() { return this._.getUTCMinutes(); }, - getMonth: function() { return this._.getUTCMonth(); }, - getSeconds: function() { return this._.getUTCSeconds(); }, - getTimezoneOffset: function() { return 0; }, - valueOf: function() { return this._.getTime(); }, - setDate: function(x) { this._.setUTCDate(x); }, - setDay: function(x) { this._.setUTCDay(x); }, - setFullYear: function(x) { this._.setUTCFullYear(x); }, - setHours: function(x) { this._.setUTCHours(x); }, - setMilliseconds: function(x) { this._.setUTCMilliseconds(x); }, - setMinutes: function(x) { this._.setUTCMinutes(x); }, - setMonth: function(x) { this._.setUTCMonth(x); }, - setSeconds: function(x) { this._.setUTCSeconds(x); } -}; -var d3_time_formatIso = d3.time.format.utc("%Y-%m-%dT%H:%M:%S.%LZ"); - -d3.time.format.iso = Date.prototype.toISOString ? d3_time_formatIsoNative : d3_time_formatIso; - -function d3_time_formatIsoNative(date) { - return date.toISOString(); -} - -d3_time_formatIsoNative.parse = function(string) { - return new Date(string); -}; - -d3_time_formatIsoNative.toString = d3_time_formatIso.toString; -function d3_time_range(floor, step, number) { - return function(t0, t1, dt) { - var time = floor(t0), times = []; - if (time < t0) step(time); - if (dt > 1) { - while (time < t1) { - var date = new Date(+time); - if (!(number(date) % dt)) times.push(date); - step(time); - } - } else { - while (time < t1) times.push(new Date(+time)), step(time); - } - return times; - }; -} -d3.time.second = function(date) { - return new Date(~~(date / 1e3) * 1e3); -}; - -d3.time.second.utc = d3.time.second; -d3.time.seconds = d3_time_range(d3.time.second, function(date) { - date.setTime(date.getTime() + 1e3); -}, function(date) { - return date.getSeconds(); -}); - -d3.time.seconds.utc = d3.time.seconds; -d3.time.minute = function(date) { - return new Date(~~(date / 6e4) * 6e4); -}; - -d3.time.minute.utc = d3.time.minute;d3.time.minutes = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getMinutes(); -}); - -d3.time.minutes.utc = d3_time_range(d3.time.minute, d3_time_minutesStep, function(date) { - return date.getUTCMinutes(); -}); - -function d3_time_minutesStep(date) { - date.setTime(date.getTime() + 6e4); // assumes no leap seconds -} -d3.time.hour = function(date) { - var offset = date.getTimezoneOffset() / 60; - return new Date((~~(date / 36e5 - offset) + offset) * 36e5); -}; - -d3.time.hour.utc = function(date) { - return new Date(~~(date / 36e5) * 36e5); -}; -d3.time.hours = d3_time_range(d3.time.hour, d3_time_hoursStep, function(date) { - return date.getHours(); -}); - -d3.time.hours.utc = d3_time_range(d3.time.hour.utc, d3_time_hoursStep, function(date) { - return date.getUTCHours(); -}); - -function d3_time_hoursStep(date) { - date.setTime(date.getTime() + 36e5); -} -d3.time.day = function(date) { - return new Date(date.getFullYear(), date.getMonth(), date.getDate()); -}; - -d3.time.day.utc = function(date) { - return new Date(~~(date / 864e5) * 864e5); -}; -d3.time.days = d3_time_range(d3.time.day, function(date) { - date.setDate(date.getDate() + 1); -}, function(date) { - return date.getDate() - 1; -}); - -d3.time.days.utc = d3_time_range(d3.time.day.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 1); -}, function(date) { - return date.getUTCDate() - 1; -}); -d3.time.week = function(date) { - (date = d3.time.day(date)).setDate(date.getDate() - date.getDay()); - return date; -}; - -d3.time.week.utc = function(date) { - (date = d3.time.day.utc(date)).setUTCDate(date.getUTCDate() - date.getUTCDay()); - return date; -}; -d3.time.weeks = d3_time_range(d3.time.week, function(date) { - date.setDate(date.getDate() + 7); -}, function(date) { - return ~~((date - new Date(date.getFullYear(), 0, 1)) / 6048e5); -}); - -d3.time.weeks.utc = d3_time_range(d3.time.week.utc, function(date) { - date.setUTCDate(date.getUTCDate() + 7); -}, function(date) { - return ~~((date - Date.UTC(date.getUTCFullYear(), 0, 1)) / 6048e5); -}); -d3.time.month = function(date) { - return new Date(date.getFullYear(), date.getMonth(), 1); -}; - -d3.time.month.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), 1)); -}; -d3.time.months = d3_time_range(d3.time.month, function(date) { - date.setMonth(date.getMonth() + 1); -}, function(date) { - return date.getMonth(); -}); - -d3.time.months.utc = d3_time_range(d3.time.month.utc, function(date) { - date.setUTCMonth(date.getUTCMonth() + 1); -}, function(date) { - return date.getUTCMonth(); -}); -d3.time.year = function(date) { - return new Date(date.getFullYear(), 0, 1); -}; - -d3.time.year.utc = function(date) { - return new Date(Date.UTC(date.getUTCFullYear(), 0, 1)); -}; -d3.time.years = d3_time_range(d3.time.year, function(date) { - date.setFullYear(date.getFullYear() + 1); -}, function(date) { - return date.getFullYear(); -}); - -d3.time.years.utc = d3_time_range(d3.time.year.utc, function(date) { - date.setUTCFullYear(date.getUTCFullYear() + 1); -}, function(date) { - return date.getUTCFullYear(); -}); -// TODO nice -function d3_time_scale(linear, methods, format) { - - function scale(x) { - return linear(x); - } - - scale.invert = function(x) { - return d3_time_scaleDate(linear.invert(x)); - }; - - scale.domain = function(x) { - if (!arguments.length) return linear.domain().map(d3_time_scaleDate); - linear.domain(x); - return scale; - }; - - scale.ticks = function(m, k) { - var extent = d3_time_scaleExtent(scale.domain()); - if (typeof m !== "function") { - var span = extent[1] - extent[0], - target = span / m, - i = d3.bisect(d3_time_scaleSteps, target, 1, d3_time_scaleSteps.length - 1); - if (Math.log(target / d3_time_scaleSteps[i - 1]) < Math.log(d3_time_scaleSteps[i] / target)) --i; - m = methods[i]; - k = m[1]; - m = m[0]; - } - return m(extent[0], extent[1], k); - }; - - scale.tickFormat = function() { - return format; - }; - - scale.copy = function() { - return d3_time_scale(linear.copy(), methods, format); - }; - - // TOOD expose d3_scale_linear_rebind? - scale.range = d3.rebind(scale, linear.range); - scale.rangeRound = d3.rebind(scale, linear.rangeRound); - scale.interpolate = d3.rebind(scale, linear.interpolate); - scale.clamp = d3.rebind(scale, linear.clamp); - - return scale; -} - -// TODO expose d3_scaleExtent? -function d3_time_scaleExtent(domain) { - var start = domain[0], stop = domain[domain.length - 1]; - return start < stop ? [start, stop] : [stop, start]; -} - -function d3_time_scaleDate(t) { - return new Date(t); -} - -function d3_time_scaleFormat(formats) { - return function(date) { - var i = formats.length - 1, f = formats[i]; - while (!f[1](date)) f = formats[--i]; - return f[0](date); - }; -} - -var d3_time_scaleSteps = [ - 1e3, // 1-second - 5e3, // 5-second - 15e3, // 15-second - 3e4, // 30-second - 6e4, // 1-minute - 3e5, // 5-minute - 9e5, // 15-minute - 18e5, // 30-minute - 36e5, // 1-hour - 108e5, // 3-hour - 216e5, // 6-hour - 432e5, // 12-hour - 864e5, // 1-day - 1728e5, // 2-day - 6048e5, // 1-week - 1728e6, // 1-month - 7776e6, // 3-month - 31536e6 // 1-year -]; - -var d3_time_scaleLocalMethods = [ - [d3.time.seconds, 1], - [d3.time.seconds, 5], - [d3.time.seconds, 15], - [d3.time.seconds, 30], - [d3.time.minutes, 1], - [d3.time.minutes, 5], - [d3.time.minutes, 15], - [d3.time.minutes, 30], - [d3.time.hours, 1], - [d3.time.hours, 3], - [d3.time.hours, 6], - [d3.time.hours, 12], - [d3.time.days, 1], - [d3.time.days, 2], - [d3.time.weeks, 1], - [d3.time.months, 1], - [d3.time.months, 3], - [d3.time.years, 1] -]; - -var d3_time_scaleLocalFormats = [ - [d3.time.format("%Y"), function(d) { return true; }], - [d3.time.format("%B"), function(d) { return d.getMonth(); }], - [d3.time.format("%b %d"), function(d) { return d.getDate() != 1; }], - [d3.time.format("%a %d"), function(d) { return d.getDay() && d.getDate() != 1; }], - [d3.time.format("%I %p"), function(d) { return d.getHours(); }], - [d3.time.format("%I:%M"), function(d) { return d.getMinutes(); }], - [d3.time.format(":%S"), function(d) { return d.getSeconds() || d.getMilliseconds(); }] -]; - -var d3_time_scaleLocalFormat = d3_time_scaleFormat(d3_time_scaleLocalFormats); - -d3.time.scale = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat); -}; -var d3_time_scaleUTCMethods = [ - [d3.time.seconds.utc, 1], - [d3.time.seconds.utc, 5], - [d3.time.seconds.utc, 15], - [d3.time.seconds.utc, 30], - [d3.time.minutes.utc, 1], - [d3.time.minutes.utc, 5], - [d3.time.minutes.utc, 15], - [d3.time.minutes.utc, 30], - [d3.time.hours.utc, 1], - [d3.time.hours.utc, 3], - [d3.time.hours.utc, 6], - [d3.time.hours.utc, 12], - [d3.time.days.utc, 1], - [d3.time.days.utc, 2], - [d3.time.weeks.utc, 1], - [d3.time.months.utc, 1], - [d3.time.months.utc, 3], - [d3.time.years.utc, 1] -]; - -var d3_time_scaleUTCFormats = [ - [d3.time.format.utc("%Y"), function(d) { return true; }], - [d3.time.format.utc("%B"), function(d) { return d.getUTCMonth(); }], - [d3.time.format.utc("%b %d"), function(d) { return d.getUTCDate() != 1; }], - [d3.time.format.utc("%a %d"), function(d) { return d.getUTCDay() && d.getUTCDate() != 1; }], - [d3.time.format.utc("%I %p"), function(d) { return d.getUTCHours(); }], - [d3.time.format.utc("%I:%M"), function(d) { return d.getUTCMinutes(); }], - [d3.time.format.utc(":%S"), function(d) { return d.getUTCSeconds() || d.getUTCMilliseconds(); }] -]; - -var d3_time_scaleUTCFormat = d3_time_scaleFormat(d3_time_scaleUTCFormats); - -d3.time.scale.utc = function() { - return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); -}; -})(); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg deleted file mode 100755 index 70ac6c77f27..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/openBIS_Logo.svg +++ /dev/null @@ -1,68 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> -<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" - width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" - xml:space="preserve"> -<g id="Layer_1"> - <g> - <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> - <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> - <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> - <g> - <g> - <g> - <g> - <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> - </g> - <g> - <g> - <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> - </g> - <g> - <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> - </g> - </g> - </g> - <g> - <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> - </g> - </g> - <g> - <g> - <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> - </g> - <g> - <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> - </g> - </g> - </g> - </g> - <g> - <g> - <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> - </g> - <g> - <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> - </g> - <g> - <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> - </g> - </g> - </g> - </g> -</g> -<g id="Layer_2"> -</g> -</svg> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/images/sprite.png deleted file mode 100644 index b9e19ef18acf68223cf6878c397ffa47ae933478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 748 zcmV<I0u%j-P)<h;3K|Lk000e1NJLTq0015U0027(1^@s6Y*9KV0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!j!8s8RCwC#na@ibK@`Vl6BD5ZHtofu z7QO2^C$YDj(pzsvXmj$QAhd`2qop?wrpKf`M0zSH_$MgX9Bm3YDws=KDWofGL4_p! zzWTPTVSmhKC*(2@-p(-l-h6i6&b-~7HF~|C7=?_<8dj^-X%q!kk_NO~DwQq<0UI(S z2DC^JsOfR~J>aX#!GO-A_!`pB8sOz9;Dm(Dwj!Iz-~|aAlOv-PY)bZ(RSmw9?8{OO zK9sO&VRAKwF}cD<T~t1~I6=?^Yk8cuq06v28cG6jt?7Q_XMlblO6KBJN#S1dF*&C5 zQAZsJ29#3auB)jHedJLm*@Ld)0<2i~7|>cDR50i_^s)~sI3h=}CKsTEfY3gKPWqgi zgKv4DP{WZj&_#rd<t2~99+zGtF2saNJv98laiuT_ctHW!<XaZ$)u$oU$aGL&#;9KQ z5@JN6!5XZ=8mz$@tic+r!5XYy#(cgOU!$0HHJ#xj?43&Ry%%}_*HFCl`3(I7-M|Ix zDg^_&iQ<if&lccsm4E?#j{1iPelGz3sA6)h+`AgX=!E#K#2#^_Qkmi%0FljRZ}a(l zI+MwWdcA(zY&O#Yz8$`BBLc6>KIe3J>a;pgl3XsAHcitG=p-2tN^;HR{{MBHOeSv} zs3WOV%7_uoUmk4_XmwzIydv<Ae{t({#womxg>BoS-ENOd0M5kS9+#uE|3!OUJJ3&D zr(1c+_NVSy{nJ^y6kd!zVOdtX+wJ=OETLO)z)P#umwfUl*3rJ`TBhG=6`;N^?tY-0 zIN+M_-`DbzJvbLtB@hbPjD*iQptC9;5>KFCLhQe>o!VT@Bd07zVWgiM6P%-I_ofy% eTe;=000RI_wd#yk{QvO)0000<MNUMnLSTaTC|&6Q diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html deleted file mode 120000 index 3391e4bfcde..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/index.html +++ /dev/null @@ -1 +0,0 @@ -openbis-dsu-downloader.html \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html deleted file mode 100644 index 941a6fb603d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/openbis-dsu-downloader.html +++ /dev/null @@ -1,836 +0,0 @@ -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<html xmlns="http://www.w3.org/1999/xhtml"> -<head> - <title>Quantitative Genomics Facility</title> - - <meta http-equiv="X-UA-Compatible" content="IE=Edge" /> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> - <meta name="google" value="notranslate"> - - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="tree.css" /> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="d3.time.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('https://openbis-dsu.ethz.ch/openbis/openbis', 'https://openbis-dsu.ethz.ch/datastore_server'); - -//After logout the URL redirected to, just go to current URL in this case -var logouturl = $(location).attr('href'); - -// A helper function for drawing the lines between nodes -var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x] }); - -// The tree visualization -var vis; - -// The node inspectors -var inspectors; - -var inspectorsWidth = 600; - -// The root of the tree -var root = { code : "QGF", label: "QGF", children : [], type: 'ROOT' }; - -// The inspected elements -var inspected = []; - -// A date formatter for grouping samples by registration year / month -var yearmonthformat = d3.time.format("%Y-%m"); - -/// -/// FUNCTIONS FOR PUTTING DATA INTO THE TREE -/// - -function initTree(){ - dsu.retrieveSequencingSamples(function(data){ - addSamplesToTree(data.result); - showSpaces(); - updateDiagram(500); - }); -} - -function addSamplesToTree(samples) -{ - if (samples == null){ - return; - } - - // Create sample nodes - samples = samples.map(function(sample) { - return { - code : sample.permId, - label: sample.properties["EXTERNAL_SAMPLE_NAME"] + " [" + sample.code + "]", - bis: sample, - type: 'SAMPLE' - } - }); - - sortArray(samples, 'code', false); - - // Create sample group nodes (group by registration date) - var sampleGroupsMap = []; - var sampleGroups = []; - - samples.forEach(function(sample) { - var date = yearmonthformat(new Date(sample.bis.registrationDetails.registrationDate)); - var sampleGroup = sampleGroupsMap[date]; - - if (undefined === sampleGroup) { - sampleGroup = { - code: date, - label: date, - samples: [], - type: 'SAMPLE_GROUP' - }; - sampleGroupsMap[date] = sampleGroup; - sampleGroups.push(sampleGroup); - } - sampleGroup.samples.push(sample); - }); - - // Sort sample groups from newest to oldest - sortArray(sampleGroups, 'code', false); - - // Create space nodes - var isFirstSampleGroup = true; - sampleGroups.forEach(function(sampleGroup){ - var spacesMap = []; - var spaces = []; - - sampleGroup.samples.forEach(function(sample){ - var spaceCode = sample.bis.spaceCode; - var space = spacesMap[spaceCode]; - - if(undefined == space){ - space = { - code: sampleGroup.code + "#" + spaceCode, - label: spaceCode, - _children: [], - type: 'SPACE' - } - spacesMap[spaceCode] = space; - spaces.push(space); - } - space._children.push(sample); - }); - - // Sort spacees - spaces.sort(function(space1, space2) { - if (space1.label == space2.label) return 0; - return (space1.label < space2.label) ? -1 : 1; - }); - - if(spaces.length > 1){ - sortArray(spaces, 'label', true); - sampleGroup._children = spaces; - }else{ - sampleGroup._children = sampleGroup.samples; - } - - if(isFirstSampleGroup){ - openAllForNode(sampleGroup); - isFirstSampleGroup = false; - } - }); - - if (samples.length > 0){ - root.children = sampleGroups; - } - -} - -function getAppHeight(){ - return Math.max($(window).height() - 50, getVisibleLeafsCountForNode(root) * 20); -} - -function getAppWidth(){ - return $(window).width(); -} - -function closeAll(){ - root.children.forEach(function(sampleGroup){ - closeAllForNode(sampleGroup); - }); - - if(inspected.length > 0){ - var inspectedCopy = inspected.slice(0); - inspectedCopy.forEach(function(elem){ - if(elem.inspected){ - toggle_inspected(elem); - } - }); - }else{ - updateDiagram(500); - } -} - -function closeAllForNode(node){ - closeChildren(node); - getChildren(node).forEach(function(child){ - closeAllForNode(child); - }); -} - -function openAllForNode(node){ - openChildren(node); - getChildren(node).forEach(function(child){ - openAllForNode(child); - }); -} - -function getVisibleLeafsCountForNode(node){ - if(node.children){ - var count = 0; - node.children.forEach(function(child){ - count += getVisibleLeafsCountForNode(child); - }); - return count; - }else{ - return 1; - } -} - -function getVisibleLabelsMaxLength(node){ - if(node.children){ - var length = 0; - node.children.forEach(function(child){ - var childLength = getVisibleLabelsMaxLength(child); - if(childLength > length){ - length = childLength; - } - }); - return length; - }else{ - return node.label.length * 13; - } -} - -function showSpaces() -{ - // Don't show anything yet, just initialize the visualization - createVis(); -} - - -var didCreateVis = false; - -/** - * Create the DOM elements to store the visualization (tree + inspectors) - */ -function createVis() -{ - if (didCreateVis) return; - - // Create a div to house the tree visualization and the inspectors - visgroup = d3.select("#main").append("div"); - - // An svg element for the tree visualization - vis = visgroup.append("svg:svg") - .attr("id","mainVis") - .append("svg:g") - .attr("transform", "translate(40, 0)"); - - var legend = vis.append("svg:g") - .attr("class","legend") - .attr("transform", "translate(-30, 0)"); - - var legendSeq = legend.append("svg:g").attr("class","sequenced").attr("transform","translate(0, 20)"); - legendSeq.append("svg:circle").attr("r", 5.5); - legendSeq.append("svg:text").text("Sequenced").attr("dx", 10).attr("dy",4); - - var legendNotSeq = legend.append("svg:g").attr("class","notsequenced").attr("transform","translate(0, 40)"); - legendNotSeq.append("svg:circle").attr("r", 5.5); - legendNotSeq.append("svg:text").text("Not Sequenced").attr("dx", 10).attr("dy",4); - - // An element for the inspectors. - inspectors = visgroup.append("span") - .attr("id","inspectorsContainer") - .style("width", + inspectorsWidth + "px") - .style("position", "relative") - .style("overflow", "auto") - .style("float", "right") - .style("top", "20px") - .style("display", "none"); - - didCreateVis = true; -} - - -/** - * Draw / update the tree - */ -function updateDiagram(duration) -{ - log('Updating diagram'); - - var inspectorsSize = inspected.length > 0 ? inspectorsWidth : 0; - var labelsSize = getVisibleLabelsMaxLength(root); - - var treeWidth = Math.max(300, getAppWidth() - inspectorsSize - labelsSize); - var treeHeight = Math.max(100, getAppHeight()); - - var visWidth = treeWidth + labelsSize - 20; - var visHeight = treeHeight; - - var mainWidth = visWidth + inspectorsSize; - var mainHeight = visHeight; - - // Adjust a size of the vis - d3.select("#mainVis") - .attr("width", visWidth) - .attr("height", visHeight); - - d3.select("#main") - .style("width", mainWidth) - .style("height", mainHeight); - - // Adjust a size of the tree - tree = d3.layout.tree().size([treeHeight, treeWidth]) - - // Update the root and compute the new layout - var nodes = tree.nodes(root); - - // Draw / update the links - var link = vis.selectAll("path.link").data(tree.links(nodes), function(d) { return d.code }); - - link.enter().append("svg:path") - .attr("class", "link") - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .transition() - .duration(duration) - .attr("d", diagonal); - - link.transition() - .duration(duration) - .attr("d", diagonal); - - link.exit().transition() - .duration(duration) - .attr("d", function(d) { - var y0 = (null != d.source.y0) ? d.source.y0 : d.source.y; - var x0 = (null != d.source.x0) ? d.source.x0 : d.source.x; - var o = {x: x0, y: y0}; - return diagonal({source: o, target: o}); - }) - .remove(); - - // Draw / update the nodes - var node = vis.selectAll("g.node").data(nodes, function(d) { return d.code }); - - var nodeEnter = - node.enter().append("svg:g") - .attr("class", classForNode) - .attr("transform", translateSrc) - .on("click", toggle_open); - - nodeEnter.append("svg:circle") - .attr("r", 5.5); - - nodeEnter.append("svg:text") - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("dy", 3) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }) - .text(function(d) { return d.label }); - - nodeEnter - .transition() - .duration(duration) - .attr("transform", translateDst); - - - // Transition nodes to their new position. - node.transition() - .duration(duration) - .attr("class", classForNode) - .attr("transform", translateDst); - - // Move the text elements to the appropriate position - node.selectAll("text").transition() - .duration(duration) - .attr("dx", function(d) { return hasChildren(d) ? -8 : 8 }) - .attr("text-anchor", function(d) { return getTextAnchorType(d) }); - - node.exit().transition() - .duration(duration) - .attr("transform", translateSrc) - .remove(); -} - -function classForNode(d) { - // Use whether the node has open children or not to compute the class - var cssClass = "node " + d.type; - if (d.inspected) cssClass = cssClass + " inspected"; - if(d.hasFilesLoaded){ - if (d.hasFiles) { - cssClass = cssClass + " sequenced"; - } else { - cssClass = cssClass + " notsequenced"; - } - } - return cssClass; -} - -function translateSrc(d) -{ - var translate; - if (d.parent != undefined) { - var y0 = (null != d.parent.y0) ? d.parent.y0 : d.parent.y; - var x0 = (null != d.parent.x0) ? d.parent.x0 : d.parent.x; - translate = "translate(" + y0 + "," + x0 + ")"; - } else { - translate = "translate(" + 0 + "," + 0 + ")"; - } - - return translate; -} - -function translateDst(d) -{ - d.x0 = d.x; - d.y0 = d.y; - var translate = "translate(" + d.y + "," + d.x + ")"; - - return translate; -} - -function getChildren(d){ - if(d.children != null){ - return d.children; - }else if(d._children != null){ - return d._children; - }else{ - return []; - } -} - -function hasChildren(d) -{ - return d.children != null || d._children != null; -} - -function hasChildrenOpen(d){ - return d.children != null; -} - -function hasChildrenClosed(d){ - return d._children != null; -} - -function closeChildren(d){ - if(hasChildrenOpen(d)){ - d._children = d.children; - d.children = null; - } -} - -function openChildren(d){ - if(hasChildrenClosed(d)){ - d.children = d._children; - d._children = null; - - var hasSampleChildren = d.children && d.children[0].type == 'SAMPLE'; - - if(hasSampleChildren && !d.hasFilesLoaded && !d.hasFilesLoading){ - d.hasFilesLoading = true; - - // Get datasets for each sequencing sample - var sampleDeferrer = - new actionDeferrer( - function() { - log("Loaded HAS_FILES for all samples"); - d.hasFilesLoaded = true; - d.hasFilesLoading = false; - updateDiagram(500); - }, - d.children.map(function(samp) { return samp.bis.code; })); - - d.children.forEach(function(sample) { - loadHasFilesForSample(sample, function(){ - sampleDeferrer.dependencyCompleted(sample.bis.code); - }); - }); - } - } -} - -function loadHasFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - }else{ - var listFiles = function(dataset){ - dsu.server.listFilesForDataSet(dataset.code, "/", true, function(data) { - var files = data.result; - - log("Got " + (files ? files.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + dataset.code); - - if (!files || files.length == 0) { - if(datasets.length > 0){ - log("Sample: " + sample.bis.code + " no files found yet - will try in the next dataset"); - listFilesFunction(datasets.pop()); - }else{ - log("Sample: " + sample.bis.code + " HAS_NO_FILES"); - sample.hasFiles = false; - sample.hasFilesLoaded = true; - callback(); - } - }else{ - log("Sample: " + sample.bis.code + " HAS_FILES"); - sample.hasFiles = true; - sample.hasFilesLoaded = true; - callback(); - } - }); - }; - listFiles(datasets.pop()); - } - }); -} - -function loadFilesForSample(sample, callback){ - dsu.retrieveDataSetsForSequencingSample(sample, function(data) { - var datasets = data.result; - - log("Got " + (datasets ? datasets.length : 0) + " datasets for sample: " + sample.bis.code); - - if (!datasets || datasets.length == 0){ - sample.files = []; - sample.filesLoaded = true; - callback(); - }else{ - sample.datasets = data.result.map(function(bisds) { return {bis : bisds} }); - sample.files = []; - sample.filesLoaded = false; - - // Get all the files from the sequencing sample's datasets - var datasetDeferrer = - new actionDeferrer( - function() { - log("Loaded ALL datasets' files for sample: " + sample.bis.code); - sortArray(sample.files, 'label', true); - sample.filesLoaded = true; - callback(); - }, - sample.datasets.map(function(ds) { return ds.bis.code; })); - - sample.datasets.forEach(function(ds) { - dsu.server.listFilesForDataSet(ds.bis.code, "/", true, function(data) { - log("Got " + (data.result ? data.result.length : 0) + " files for sample: " + sample.bis.code + " dataset: " + ds.bis.code); - - if (!data.result || data.result.length == 0) { - datasetDeferrer.dependencyCompleted(ds.bis.code); - return; - } - data.result.forEach(function (file) { - file.dataset = ds; - file.label = file.pathInListing.split("/").pop(); - }); - - data.result = data.result.filter(function(file) { - var regex= (/gz$|tsv$/); - return (regex.test(file.pathInListing) & !file.isDirectory); }); - sample.files = sample.files.concat(data.result); - datasetDeferrer.dependencyCompleted(ds.bis.code); - }) - }); - } - }); -} - -function getTextAnchorType(d){ - return d.type == 'SAMPLE' ? 'start' : 'end'; -} - -// Toggle children on click. -function toggle_open(d) { - if (!hasChildren(d)) { - d.svgNode = this; - return toggle_inspected.call(this, d); - } - - if (hasChildrenOpen(d)) { - closeChildren(d); - } else { - openChildren(d); - } - updateDiagram(500); -} - -/** - * Draw / update node inspectors - */ -function updateInspectors(duration) -{ - // Draw / update the inspectors - var inspector = inspectors.selectAll("div.inspector").data(inspected, function (d) { return d.code }); - var box = inspector.enter().append("div") - .attr("class", "inspector") - .text(function(d) { return d.label }); - - box.append("span") - .attr("class", "close") - .on("click", toggle_inspected) - .text("x"); - - var propsTable = box.append("table").attr("class", "properties"); - propsTable.selectAll("tr").data(function(d) { return props_to_pairs(d.bis.properties) }) - .enter() - .append("tr") - .selectAll("td").data(function(d) { return d }).enter() - .append("td") - .attr("class", "property") - .style("opacity", "0") - .text(function(d) { return d }) - .transition() - .style("opacity", "1"); - - var downloadTable = inspector.selectAll("table.downloads").data(function(d) { return [d] }); - - downloadTable - .enter() - .append("table") - .attr("width", "100%") - .attr("class", "downloads"); - - // Add a caption, but make sure there is just one (this does not work with select()) - downloadTable.selectAll("caption") - .data(downloadTableCaption) - .enter() - .append("caption").text(function(d) { return d; }); - - // We just want to see non-directories here - var downloadTableRow = downloadTable.selectAll("tr").data(filesForSequencingSample, function(d) { return d.pathInDataSet }); - downloadTableRow - .enter() - .append("tr") - .append("td") - .style("text-align", "left") - .on("click", downloadTableFile) - .text(function(d) { return d.label; }); - downloadTableRow - .exit() - .transition() - .duration(duration) - .style("opacity", "0") - .remove(); - - inspector.exit().transition() - .duration(duration) - .style("opacity", "0") - .remove(); -} - -// Toggle children on click. -function toggle_inspected(d) { - var count = inspected.length; - - if (d.inspected) { - var index = inspected.indexOf(d) - if (index > -1) inspected.splice(index, 1); - d.inspected = false; - d3.select(d.svgNode).attr("class", classForNode(d)) - } else { - d.inspected = true; - inspected.push(d); - d3.select(d.svgNode).attr("class", classForNode(d)) - if(!d.filesLoaded){ - loadFilesForSample(d, function(){ - updateInspectors(500); - }); - } - } - - if(inspected.length > 0){ - $("#inspectorsContainer").show(); - }else{ - $("#inspectorsContainer").hide(); - } - - if(count == 0 && inspected.length > 0 || count > 0 && inspected.length == 0){ - updateDiagram(500); - setTimeout(function(){ - updateInspectors(500); - }, 500); - }else{ - updateInspectors(500); - } -} - -function sortArray(array, sortingFieldName, ascending){ - array.sort(function(item1, item2){ - var value1 = item1[sortingFieldName]; - var value2 = item2[sortingFieldName]; - - if(value1){ - value1 = new String(value1).toLowerCase(); - } - if(value2){ - value2 = new String(value2).toLowerCase(); - } - - if(ascending){ - return (value1 >= value2) ? 1: -1; - }else{ - return (value1 <= value2) ? 1: -1; - } - }); -} - -/** - * Convert properties to pairs - */ -function props_to_pairs(d) -{ - var pairs = []; - for (var prop in d) { - var pair = [prop, d[prop]]; - pairs.push(pair); - } - pairs.sort(function(a, b) { - if (a[0] == b[0]) return 0; - // Sort in reverse lexicographical - return (a[0] < b[0]) ? -1 : 1; - }); - return pairs; -} - - -function downloadTableCaption(d) -{ - if(d.filesLoaded){ - if(d.files && d.files.length > 0){ - return ["Files"] - }else{ - return ["Not Yet Sequenced"]; - } - } -} - -function downloadTableFile(d) -{ - // If there is no dataset, this is just a marker for loading - if (!d.dataset) return; - - var action = function(data) { - try { - document.location.href = data.result - } catch (err) { - // just ignore errors - } - }; - dsu.server.getDownloadUrlForFileForDataSet(d.dataset.bis.code, d.pathInDataSet, action); -} - -function filesForSequencingSample(d) -{ - return d.filesLoaded ? d.files : [{ label : "Loading..." }]; -} - -function enterApp(data) -{ - if(data.result == null){ - alert("Login or password incorrect"); - $("#loginname").focus(); - $('#login-button').html('Login'); - return; - } - - $("#login-form-div").hide(); - $("#main").show(); - - initTree(); - - $('#openbis-logo').height(30); - $('#openbis-logo').hide(); - -} - - -$(document).ready(function() { - //if ( $.browser.msie ) { - // alert("Currently no Internet Explorer is supported!"); - //} - $('#main').hide() - - $('#logout-button').click(function() { - dsu.server.logout(function(data) {$(location).attr('href',logouturl)}); - }); - - dsu.server.ifRestoredSessionActive(function(data) { enterApp(data) }); - $('#login-form').submit(function() { - $('#login-button').html('Logging in...'); - dsu.server.login( $.trim($('#loginname').val()), $.trim($('#password').val()), function(data) { enterApp(data) }) - }); - -}); - -// set the focus -function onPageLoad(){ - if(loginname.value.length==0) { - $("#loginname").focus(); - } - else { - $("#login-button").focus(); - } -} - -function log(msg){ - - if(console){ - console.log(msg); - } - -} - - - </script> -</head> -<body onload="onPageLoad()"> -<img id="openbis-logo" src="images/openBIS_Logo.svg" alt="openBIS" style="position: absolute; left: 330px; top: 230px; height: 70px;"/> -<link rel="shortcut icon" href="../images/favicon.ico" /> -<link rel="icon" type="image/png" href="../images/favicon.png" /> - -<div id="login-form-div"> - <h1>BSSE - Quantitative Genomics Facility</h1> - <form id="login-form" action="javascript:"> - <div class="box greytext loginname"> - <input value="Login Name" type="text" required="required" maxlength="40" size="40" onfocus="this.value=(this.value=='Login Name') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Login Name' : this.value;" id="loginname"> </input> - </div> - <div class="box greytext password"> - <input value="Password" id="password" type="password" required="required" size="40" onfocus="this.value=(this.value=='Password') ? '' : this.value;" onblur="this.value=(this.value=='') ? 'Password' : this.value;" id="password"> </input> - </div> - <div class="loginbutton"> - <button id="login-button">Login</button> - </div> - <br> - <a href="https://crowd-bsse.ethz.ch/crowd/console/forgottenlogindetails!default.action" id="resetpassword" class="greytext">Reset password</a> - </form> -</div> - -<div id="main"> - <div id="button-group"> - <button id="logout-button">Logout</button> - <button id="close-all-button" onclick="closeAll();">Close All</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css deleted file mode 100644 index e54d6d1d5d3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/html/tree.css +++ /dev/null @@ -1,138 +0,0 @@ -.node circle { - fill: #fff; - stroke: #444444; - stroke-width: 1.5px; -} - -.node { - font: 14px "Verdana", sans-serif; - z-index: 1; - cursor: pointer; - left: -15px; -} - -.node:hover circle{ - fill: #444444; -} - -.node:hover{ - font-weight: bold; -} - -.link { - fill: none; - stroke: #ccc; - stroke-width: 1.5px; - z-index: -1; -} - -.SAMPLE.inspected { - font-weight: bold -} - -.SAMPLE.sequenced circle { - stroke: DarkGreen; -} - -.SAMPLE.sequenced:hover circle { - fill: DarkGreen; -} - -.SAMPLE.notsequenced circle { - stroke: DarkRed; -} - -.SAMPLE.notsequenced:hover circle { - fill: DarkRed; -} - -/* Inspector */ - -div.inspector { - font: 14px "Verdana", sans-serif; - padding: 10px; - border: 1px solid gray; - margin: 10px 2px; - font-weight: bold; -} - -.property { - font-size: 10px; -} - -.properties { - width: 100%; -} - -.properties tr:nth-child(odd) { - background-color:#eee; -} - -.properties tr:nth-child(even) { - background-color:#fff; -} - -.close { - float: right; -} - -.close:hover { - opacity: 0.5; - color: #AAA; - cursor: pointer; -} - -.downloads { - color: black; - background-color: #E3E3E3; -} - -table.downloads { - font-family: "Trebuchet MS", sans-serif; - font-size: 10px; - table-layout: fixed; - border-collapse: collapse; - margin: 0px; - padding: 0px; -} - -/* -.downloads caption { - text-align: left; -} -*/ - -.downloads tr { - padding: 0px; -} - -.downloads td { - border: 2px solid #FFFFFF; - padding: 2px; -} - -.downloads td:hover { - cursor: pointer; - text-decoration: underline -} - -input:focus{ -background-color: white; -} - -/* Legend */ - -.legend .sequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkGreen; -} - -.legend .notsequenced circle { - font: 14px "Verdana", sans-serif; - stroke-width: 1.5px; - fill: white; - stroke: DarkRed; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties deleted file mode 100644 index cb40f34f644..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/downloader/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html deleted file mode 100644 index 435b335ce8c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/html/index.html +++ /dev/null @@ -1,179 +0,0 @@ -<head> - <title>Quantitative Genomics Facility Invoice Generator</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css"> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -var vis; -var didCreateVis = false; - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - //console.log(data.result); - var dataToShow = data.result; - - d3.select("#progress").remove() - d3.select("#button-group").remove() - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div") - .data(dataToShow.rows) - .enter() - .append("div") - .html(function(row) { return row[0].value }) - - var button = d3.select("body") - .append("div") - - var invoices = []; - for (var i=0;i<data.result.rows.length;i++) { - var val = data.result.rows[i][1].value; - if (val) { - invoices.push(val) - } - } - - //console.log(invoices) - - button.selectAll("button") - .data(invoices) - .enter() - .append("div") - .append("button") - .attr("class", "btn btn-default btn-xs") - .attr("id", function(row) { return row; }) - .attr("onclick", function(row) { return "callIngestionSetInvoice('" + row + "');" }) - .text(function(row) { return "Set Invoice sent: " + row;}); - - /*.attr("id", function(row) { return row[1].value.split(' ')[3].split('.')[0] }) - .attr("onclick", function(row) { return "callIngestionSetInvoice('" + row[1].value.split(' ')[3].split('.')[0] + "');" }) - .text(function(row) { return row[1].value.split(' ')[3].split('.')[0];}); */ -} - -function hideButtons(data) -{ - var buttonId = data.result.rows[0][0].value; - d3.select("#setInvoice").remove() - d3.select("#main").append("div").attr("id", "Done").append("p").text("Done " + buttonId); - //console.log(buttonId); - d3.select("button#" + String(buttonId)).remove(); -} - - -/** - * See ch.systemsx.cisd.openbis.plugin.query.shared.api.v1.IQueryApiServer.createReportFromAggregationService(String, String, String, Map<String, Object>) -openbis.prototype.createReportFromAggregationService = function(dataStoreCode, serviceKey, parameters, action) { - ajaxRequest({ - url: this.queryServiceUrl, - data: { "method" : "createReportFromAggregationService", - params : [ this.sessionToken, dataStoreCode, serviceKey, parameters ] }, - success: action - }); -} - -*/ - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 250, // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - - -function callIngestionSetInvoice(piFile) -{ - var context = new openbisWebAppContext(); - var sampleIdentifier = context.getEntityIdentifier() - var principalInvestigator = piFile.split(".")[0] - console.log('principalInvestigator:') - console.log(principalInvestigator) - - dsu.server.useSession(context.getSessionId()); - var parameters = - { - sampleId : sampleIdentifier, - pI : principalInvestigator - }; - - d3.select("#main").append("div").attr("id", "setInvoice").append("p").text("Setting Invoice Sent Property of " + piFile); - var target = document.getElementById('setInvoice'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "setInvoiceSent", parameters, hideButtons); -} - - -function callIngestionService() -{ - var context = new openbisWebAppContext(); - var sampleIdentifier = context.getEntityIdentifier() - var mySendEmail = $('input[name=sendEmail]').is(':checked') - - d3.select("#main").select("#progress").remove() - d3.select("#main").select("#vis").remove() - didCreateVis = false; - dsu.server.useSession(context.getSessionId()); - createVis() - var parameters = - { - sampleId : sampleIdentifier, - sendEmail : mySendEmail - }; - - d3.select("#main").append("div").attr("id", "progress").append("p").text("Creating invoices..."); - var target = document.getElementById('progress'); - spinner(target) - dsu.server.createReportFromAggregationService("DSS1", "triggerInvoice", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="main"> - <div id="checkbox-group"> - <br> - </div> - <div id="button-group"> - <button class="btn btn-default btn-xs" id="createInvoice-button" onclick="callIngestionService();">Create Invoices</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties deleted file mode 100644 index e88648bf0ec..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/invoicing/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Invoices diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html deleted file mode 100644 index bc7cc543b84..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/index.html +++ /dev/null @@ -1,1037 +0,0 @@ - <!DOCTYPE html> -<html> - <head> - <title>Lane Statistics</title> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/d3.layout.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/pie.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/FileSaver.js"></script> - <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> - <link rel="stylesheet" type="text/css" href="style.css" /> - </head> - <body> - <script> - - dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); - var webAppContext = new openbisWebAppContext(); - dsu.server.useSession(webAppContext.getSessionId()); - - globalWidthBar = 80 - - var div = d3.select("body").append("div") - .attr("class", "tooltip") - .style("opacity", 0); - - // used for sorting by of the final array of objects - function compare(a,b) { - if (a.externalSampleName < b.externalSampleName) - return -1; - if (a.externalSampleName > b.externalSampleName) - return 1; - return 0; - } - - if (typeof String.prototype.startsWith != 'function') { - // see below for better implementation! - String.prototype.startsWith = function (str){ - return this.indexOf(str) === 0; - }; -} - - - /* - * Natural Sort algorithm for Javascript - Version 0.6 - Released under MIT license - * Author: Jim Palmer (based on chunking idea from Dave Koelle) - * Contributors: Mike Grier (mgrier.com), Clint Priest, Kyle Adams, guillermo - */ - function naturalSort (a, b) { - var re = /(^-?[0-9]+(\.?[0-9]*)[df]?e?[0-9]?$|^0x[0-9a-f]+$|[0-9]+)/gi, - sre = /(^[ ]*|[ ]*$)/g, - dre = /(^([\w ]+,?[\w ]+)?[\w ]+,?[\w ]+\d+:\d+(:\d+)?[\w ]?|^\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}|^\w+, \w+ \d+, \d{4})/, - hre = /^0x[0-9a-f]+$/i, - ore = /^0/, - // convert all to strings and trim() - x = a.externalSampleName.toString().replace(sre, '') || '', - y = b.externalSampleName.toString().replace(sre, '') || '', - // chunk/tokenize - xN = x.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), - yN = y.replace(re, '\0$1\0').replace(/\0$/,'').replace(/^\0/,'').split('\0'), - // numeric, hex or date detection - xD = parseInt(x.match(hre)) || (xN.length != 1 && x.match(dre) && Date.parse(x)), - yD = parseInt(y.match(hre)) || xD && y.match(dre) && Date.parse(y) || null; - // first try and sort Hex codes or Dates - if (yD) - if ( xD < yD ) return -1; - else if ( xD > yD ) return 1; - // natural sorting through split numeric strings and default strings - for(var cLoc=0, numS=Math.max(xN.length, yN.length); cLoc < numS; cLoc++) { - // find floats not starting with '0', string or 0 if not defined (Clint Priest) - oFxNcL = !(xN[cLoc] || '').match(ore) && parseFloat(xN[cLoc]) || xN[cLoc] || 0; - oFyNcL = !(yN[cLoc] || '').match(ore) && parseFloat(yN[cLoc]) || yN[cLoc] || 0; - // handle numeric vs string comparison - number < string - (Kyle Adams) - if (isNaN(oFxNcL) !== isNaN(oFyNcL)) return (isNaN(oFxNcL)) ? 1 : -1; - // rely on string comparison if different types - i.e. '02' < 2 != '02' < '2' - else if (typeof oFxNcL !== typeof oFyNcL) { - oFxNcL += ''; - oFyNcL += ''; - } - if (oFxNcL < oFyNcL) return -1; - if (oFxNcL > oFyNcL) return 1; - } - return 0; - } - - - loadData() - -function loadData () { - - sampleToParentsMap = {}; - dataSetToParentMap = {}; - dataSetMap = {}; - parentToDataSets = {}; - realValueMap = {}; - bclVersion = ""; - - d3.select("body") - .append("text") - .attr("id", "generating") - .text("Generating graphics...") - - dsu.retrieveSampleParents(webAppContext.getEntityPermId(), function(parentResponse){ - //console.log("Got parents: " + parentResponse.result.length); - var parentPermIds = []; - - parentResponse.result.forEach(function(parent){ - parentPermIds.push(parent.permId); - }); - - dsu.retrieveSampleChildren(parentPermIds, function(childrenResponse){ - // console.log("Got children: " + childrenResponse.result.length); - - var childrenPermIds = []; - - childrenResponse.result.forEach(function(child){ - childrenPermIds.push(child.permId); - sampleToParentsMap[child.identifier] = child.parents; - }); - - dsu.retrieveDataSetsForSampleWithPermIds(childrenPermIds, function(dataSetResponse){ - // console.log("Got datasets: " + dataSetResponse.result.length); - - dataSetResponse.result.forEach(function(dataSet){ - var index1 = dataSet.properties['BARCODE']; - var index2 = dataSet.properties['INDEX2']; - var parents = sampleToParentsMap[dataSet.sampleIdentifierOrNull]; - - dataSetMap[dataSet.code] = dataSet - - // console.log("DATA Set:") - // console.log(index1) - //console.log(index2) - - parents.forEach(function(parent){ - var parentIndex1 = parent.properties['BARCODE']; - var parentIndex2 = parent.properties['INDEX2']; - - // console.log("PARENT SAMPLE:") - // console.log(parentIndex1) - // console.log(parentIndex2) - - if(index1 == parentIndex1 && (!index2 || !parentIndex2 || index2 == parentIndex2 || index2 == "NOINDEX")){ - dataSetToParentMap[dataSet.code] = parent; - if (!(parent.code in parentToDataSets)) { - parentToDataSets[parent.code] = [dataSet] - } - else { - // key already exists - parentToDataSets[parent.code].push(dataSet) - } - } - // non-multiplexed run, so no index set - if (parentIndex1 == undefined && parentIndex2 == undefined) { - dataSetToParentMap[dataSet.code] = parent; - parentToDataSets[parent.code] = [dataSet] - } - if (parentIndex2 == undefined) { - - } - - - }); - }); - // console.log("SampleToParentsMap: "); - // console.log(sampleToParentsMap); - // console.log("DataSetToParentMap: "); - // console.log(dataSetToParentMap); - // console.log("DataSets: "); - // console.log(dataSetMap) - // console.log("parentToDataSets: "); - // console.log(parentToDataSets) - - $.each( parentToDataSets, function( key, value ) { - var cumSumYieldMbases = 0; - var cumSumPfReadsSum = 0; - // console.log( key ); - $.each (value, function (index, dataset) { - - cumSumYieldMbases += parseInt(dataset.properties['YIELD_MBASES']); - cumSumPfReadsSum += parseInt(dataset.properties['PF_READS_SUM']); - }); - realValueMap[key] = [cumSumYieldMbases, cumSumPfReadsSum] - }); - //console.log(realValueMap) - - - statisticsArray = []; - targetedArray = []; - noIndex = false; - - var dataSetProperties; - dsu.retrieveDataSetsForSample(webAppContext.getEntityIdentifier(), getProperties); - - function getProperties(dataSetProperties) { - - dsu.retrieveSampleParents(webAppContext.getEntityPermId(), getParentProperties); - - function getParentProperties (sampleProperties) { - - // d3.select("body").append("text").text("Loading...") - - for (var i = 0; i < sampleProperties.result.length; i++) { - targetedArray.push ({ - 'targeted_yield_in_gigabases_pf' : sampleProperties.result[i].properties.TARGETED_YIELD_IN_GIGABASES_PF, - 'targeted_read_count_in_million_pf' : sampleProperties.result[i].properties.TARGETED_READ_COUNT_IN_MILLION_PF, - 'externalSampleName' : sampleProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'parentSampleCode' : sampleProperties.result[i].code - }); - } - // console.log("targetedArray:"); - // console.log(targetedArray); - // console.log(dataSetProperties) - // console.log("realValueMap:") - // console.log(realValueMap) - - for (var i = 0; i < dataSetProperties.result.length; i++) { - for (var j = 0; j < targetedArray.length; j++) { - if (targetedArray[j]['externalSampleName'] == dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME){ - - //console.log(targetedArray[j]['externalSampleName']) - - //console.log(realValueMap) - //console.log(targetedArray[j]) - statisticsArray.push({ - 'qgfName' : targetedArray[j]['parentSampleCode'], - 'externalSampleName' : dataSetProperties.result[i].properties.EXTERNAL_SAMPLE_NAME, - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING).toFixed(2), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE).toFixed(2), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE).toFixed(2), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE).toFixed(2), - 'real_yield_in_gigabases_pf' : realValueMap[targetedArray[j]['parentSampleCode']][0], - 'real_read_count_in_million_pf' : realValueMap[targetedArray[j]['parentSampleCode']][1], - 'targeted_yield_in_gigabases_pf' : parseFloat(targetedArray[j]['targeted_yield_in_gigabases_pf']), - 'targeted_read_count_in_million_pf' : targetedArray[j]['targeted_read_count_in_million_pf'] - }); - } - else if (dataSetProperties.result[i].properties.BARCODE == 'NOINDEX' && noIndex == false) { - noIndex = true; - statisticsArray.push({ - 'qgfName' : 'NA', - 'externalSampleName' : "NOINDEX", - 'index1': dataSetProperties.result[i].properties.BARCODE, - 'index2': dataSetProperties.result[i].properties.INDEX2, - 'percFilteringPass' : parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_PASSED_FILTERING).toFixed(2), - 'rawReadsSum' : dataSetProperties.result[i].properties.RAW_READS_SUM, - 'pfReadsSum' : dataSetProperties.result[i].properties.PF_READS_SUM, - 'rawYieldMbases' : dataSetProperties.result[i].properties.RAW_YIELD_MBASES, - 'yieldMbases' : dataSetProperties.result[i].properties.YIELD_MBASES, - 'percRawClustersPerLane': parseFloat(dataSetProperties.result[i].properties.PERCENTAGE_RAW_CLUSTERS_PER_LANE).toFixed(2), - 'pfMeanQualityScore' : parseFloat(dataSetProperties.result[i].properties.PFMEANQUALITYSCORE).toFixed(2), - 'pfYieldq30Percentage' : parseFloat(dataSetProperties.result[i].properties.PFYIELDQ30PERCENTAGE).toFixed(2), - 'real_yield_in_gigabases_pf' : 0, - 'real_read_count_in_million_pf' : 0, - 'targeted_yield_in_gigabases_pf' : parseFloat(0.0), - 'targeted_read_count_in_million_pf' : 0 - }); - } // else if - } // for - } // for - - // console.log("statisticsArray") - // console.log(statisticsArray) - - statisticsArray.sort(naturalSort); - var sums = calculateSum(statisticsArray, true) - var sumsWithNOINDEX = calculateSum(statisticsArray, false) - d3.select("#generating").remove(); - - dsu.retrieveSampleWithProperties(webAppContext.getEntityPermId(), function(laneResponse){ - bclVersion = laneResponse.result[0].properties.BCL_VERSION - if (bclVersion !== undefined) { - if (bclVersion.startsWith("bcl2fastq v2")) { - clusters = "Clusters"; - } - else { - clusters = "Reads"; - } - } - else {clusters = "Reads"}; - if (! isNaN(statisticsArray[0].percFilteringPass)) { - plotLaneTable(sumsWithNOINDEX, false) - // TODO: removed for now, as there is a bug - // placeholder(); - // plotLaneTable(sums, true) - placeholder(); - plotTable (statisticsArray, clusters); - downloadButton ("tableStats"); - placeholder(); - plotPercFilteringPass (statisticsArray); - downloadButton ("filteredChart"); - plotReadsSum (statisticsArray, sums, clusters); - downloadButton ("unfilteredReads"); - plotPFReads (statisticsArray, sums, clusters); - downloadButton ("PFReads"); - plotPercRawClustersPerLane (statisticsArray); - downloadButton ("percRawClusters"); - - $("#save_as" + "tableStats").click(function() { submit_download_form("html", "tableStats"); }); - $("#save_as" + "filteredChart").click(function() { submit_download_form("svg", "filteredChart"); }); - $("#save_as" + "unfilteredReads").click(function() { submit_download_form("svg", "unfilteredReads"); }); - $("#save_as" + "PFReads").click(function() { submit_download_form("svg", "PFReads"); }); - $("#save_as" + "percRawClusters").click(function() { submit_download_form("svg", "percRawClusters"); }); - } - - else { - d3.select("body").append("text").text("No data available!") - } - }); //retrieveSampleWithProperties - } // function getParentProperties (sampleProperties) - } // function getProperties(dataSetProperties) - }); - }); - }); - -} - -colors = ["#FED976", "#FEB24C", "#FD8D3C", "#FC4E2A", "#E31A1C", "#800026", "#610B5E", "#4C0B5F", - "#0B0B61", "#0B4C5F", "#0B5F48","#0B5F1E", "#4C5F0B", "#5F480B", "#5F1E0B", "#5F0B22", - ] -var formatThousands = d3.format(","); - -function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -} - -function plotLaneTable (sums, withNOINDEX) { - - //d3.select("body").append("text") - // .text("Lane Based Summary Table") - // .attr("class", "h5"); - - d3.select("body").append("text") - .text(function (){if (withNOINDEX) {return "Lane without reads which failed demultiplexing (NOINDEX)";} return " Total Lane";}) - .attr("class", "h6"); - - - var laneTableStats = d3.select("body") - .append("table") - .attr("id", "tableLaneStats") - .attr("class", "tableStats") - ; - - headerplotLaneTable = {}; - headerplotLaneTable ["Average Passed Filtering (PF)"] = 1 - headerplotLaneTable ["Sum Raw " + clusters] = 1 - headerplotLaneTable ["Sum PF " + clusters] = 1 - headerplotLaneTable ["Sum Raw Bases"] = 1 - headerplotLaneTable ["Sum PF Bases"] = 1 - headerplotLaneTable ["Average Raw " + clusters + " in % per Index"] = 1 - headerplotLaneTable ["Average PF Phred Score"] = 1 - headerplotLaneTable ["Average > 30 Phred Score"] = 1 - - // create the table header - var thead = laneTableStats.selectAll("th") - .data(d3.keys(headerplotLaneTable)) - .enter().append("th") - .text(function(d){return d}) - ; - - // fill the table - // create rows - var tr = laneTableStats.selectAll("tr") - .data(sums).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - ; -} - -function plotTable (statisticsArray, clusters) { - - /* - d3.select("body").append("text") - .text("Index Based Summary Table") - .attr("class", "h4"); - */ - - var tableStats = d3.select("body") - .append("table") - .attr("id", "tableStats") - .attr("class", "tableStats") - ; - - header = {}; - - header["Sample ID"] = "Unique Genomics Facility Identifier of sample" - header["Sample Name"] = "Sample name given by customer" - header["Index1"] = "First Index" - header["Index2"] = "Second Index" - header["% PF " + clusters] = "High quality reads passing Illumina filtering criteria" - header["Raw " + clusters] = "Number of all " + clusters - header["PF " + clusters] = "Number of " + clusters + " which passed the Illumina Filter" - header["Raw Bases"] = "Number of all Bases" - header["PF Bases"] = "Number of all Bases which passed the Illumina Filter" - header["% in Lane"] = "Percentage of this Index within the Lane" - header["Mean Phred Score"] = "Mean Phred Score (0-40)" - header["% of >= Q30 Bases (PF)"] = "" - header["Total Yield"] = "Total yield (bases) over all lanes the sample was sequenced" - header["Total " + clusters + " #"] = "Total " + clusters + " count over all lanes the sample was sequenced" - header["Targeted Yield"] = "Targeted yield inheader" - header["Targeted " + clusters + " #"] = "Targeted " + clusters + " Count in million (PF)" - - // create the table header - var thead = tableStats.selectAll("th") - //.data(d3.keys(statisticsArray[0])) // got replaced with more readable names - .data(d3.keys(header)) - .enter().append("th") - .text(function(d){return d}) - .data(d3.values(header)) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", "140px") - div.html(d) - .style("left", (d3.event.pageX - 70) +"px") - .style("top", (d3.event.pageY + 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }) - ; - - // fill the table - // create rows - var tr = tableStats.selectAll("tr") - .data(statisticsArray).enter().append("tr") - - // cells - var td = tr.selectAll("td") - .data(function(d){return d3.values(d)}) - .enter().append("td") - .text(function(d) {if (isNumber(d)) {return formatThousands(d)}; return d;}) - //.on("mouseover", function(){d3.select(this).style("background-color", "aliceblue")}) - //.on("mouseout", function(){d3.select(this).style("background-color", "white")}) - .style("text-align", function(d){if (isNumber(d)) {return "right"} return "left"}) - .attr('class', function(d,i){ return "col_" + i; }) - /*.style("background", function(d,i){ if (d3.values(statisticsArray)[i] != undefined) { - console.log(d3.values(statisticsArray)[i]); - // if (parseInt(d3.values(statisticsArray)[i].pfReadsSum) >= 1000000 ) - if (parseInt(d3.values(statisticsArray)[i].pfReadsSum) >= 1000000 * parseInt(d3.values(statisticsArray)[i].targeted_read_count_in_million_pf)) - {return "lightgreen";} return "red" - ;} - }); - */ - - realValue = 0; - realValueBases = 0; - var td = d3.selectAll("#tableStats tr").selectAll("td") - td.style("color", function(d, i) { - if (i==13) {realValue = d;} - if (i==12) {realValueBases = d;} - if (d != undefined) { - if (i==15) { - // console.log(parseInt(d) * 1000000 + ">= " + realValue); - if ( parseInt(d) * 1000000 >= realValue) {return "red"; } - else { return "green";} - } - if (i==14) { - // console.log(realValueBases + " >= " + parseFloat(d) * 1000000000); - if ( realValueBases >= parseFloat(d) * 1000000000 ) {return "green"; } - else { return "red";} - } - } - }); - - //console.log(statisticsArray) -} - - -function placeholder() { - -var space = d3.select("body") - .append("svg") - .attr("id", "placeholder") - .attr("width", 1000) - .attr("height", 30) - ; -} - -function plotPercFilteringPass (statisticsArray) { - - if (statisticsArray.length > 60) {var svgWidth = 7000;} - else if (statisticsArray.length > 10) {var svgWidth = 5000;} - else {var svgWidth = 3000;} - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 400;} - - - var barPadding = 1; - var valuePadding = 0.02; - var agenda = [100,90,80,70,60,50,40,30,20,10,0] - var agendaWidth = 100 - var AgendaWidthOffset = 30 - - var margin = {top: 20, right: 20, bottom: 40, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - // var svgFilteredChartAgenda = d3.select("body") - // .append("svg") - // .attr("id", "chartAgenda") - // .attr("width", agendaWidth ) - // .attr("height", svgHeight + margin.top + margin.bottom) - // ; - - // var filteredChartAgenda = svgFilteredChartAgenda.selectAll("percFilteringPassChartAgenda") - // .data(agenda) - // .enter() - // .append("rect") - // .attr("rx", 3) - // .attr("y", function(d, i) { return i * (svgHeight / agenda.length) ;}) - // .attr("x", function(d) { return 0; }) - // .attr("width", function (d) { return agendaWidth - AgendaWidthOffset }) - // .attr("height", function (d) { return svgHeight / agenda.length - barPadding;}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d)*1.2 +", 40%, 30%, 1)"}); - - // svgFilteredChartAgenda.selectAll("agendaText") - // .data(agenda) - // .enter() - // .append("text") - // .text(function(d) { return d + " %"; }) - // .attr("fill", function(d) { return "white";}) - // .attr("x", function(d) { return (agendaWidth - AgendaWidthOffset)/2 ; }) - // .attr("y", function(d, i) { return i * (svgHeight / agenda.length) + (svgHeight / agenda.length - barPadding) / 2 + 3;}) - // .attr("font-family", "sans-serif") - // .attr("font-size", "10px") - // .attr("text-anchor", "middle") - // ; - - var svgFilteredChart = d3.select("body") - .append("svg") - .attr("id", "filteredChart") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - svgFilteredChart.append('text') - .text("% passes Illumina Filtering (PF)") - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - //.rangeRoundBands([0, svgWidth], .001); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom") - //.tickPadding(25); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - //.tickFormat(formatPercent); - - //x.domain(statisticsArray.map(function(d) { return d.externalSampleName+": "+d.index1;} )); - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - //y.domain([0, d3.max(statisticsArray, function(d) { return d.percFilteringPass; })]); - y.domain([0, 100]); - - svgFilteredChart.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - var filteredChart = svgFilteredChart.selectAll("percFilteringPassChart") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.percFilteringPass);}) - .attr("height", function (d,i) {return svgHeight - y(d.percFilteringPass);}) - .attr("fill", function (d) { return "hsla("+ Math.round(d.percFilteringPass)*1.2 +", 40%, 30%, 1)"}); - - svgFilteredChart.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even then put the text up, else further down - - svgFilteredChart.append("g") - .attr("class", "y axis") - .call(yAxis) - .append("text") - .attr("transform", "rotate(0)") - .attr("x", 16) - .attr("dy", ".71em") - .style("text-anchor", "end") - .text("%"); - - - svgFilteredChart.selectAll("svgFilteredChartText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return d.percFilteringPass + " %"; }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -15; }) - //.attr("x", function(d, i) { return i * 1/(1+0.007)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) ; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 15;}) - .attr("y", function(d) { - if (d.percFilteringPass < 40) { return svgHeight - d.percFilteringPass - margin.top - margin.bottom; } - return (svgHeight - d.percFilteringPass - margin.bottom) ; - }) - .attr("font-family", "sans-serif") - .attr("font-size", "12px") - .attr("fill", function(d) { if (d.percFilteringPass < 60) { return "black";} - return "white";}) -} - - -function plotReadsSum (statisticsArray, sums, clusters){ - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 50, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgReadsSum = d3.select("body") - .append("svg") - .attr("id", "unfilteredReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var rawReadsSum = 0; - rawReadsSum = sums[0].rawReadsSum - - svgReadsSum.append('text') - .text("Number of raw " + clusters + ": " + formatThousands(rawReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.rawReadsSum - 20; })]); - - svgReadsSum.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgReadsSum.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgReadsSum.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.rawReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.rawReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.rawReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.rawReadsSum); }) - ; - - svgReadsSum.selectAll("svgReadsSumText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.rawReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 10;}) - // .attr("y", function(d) { - // return (svgHeight - margin.top - margin.bottom + 20) ; - // }) - .attr("y", function(d) {return y(d.rawReadsSum) - 8;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.rawReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - - - -function plotPFReads (statisticsArray, sums, clusters){ - - svgWidth = statisticsArray.length * globalWidthBar - if (svgWidth < 200) {svgWidth = 300;} - - var formatThousands = d3.format(","); - var colorRange = d3.scale.ordinal() - .range(colors); - - - - var margin = {top: 50, right: 20, bottom: 30, left: 40}, - svgWidth = svgWidth - margin.left - margin.right, - svgHeight = 250 - margin.top - margin.bottom; - - var barPadding = 1; - var valuePadding = 0.01; - - var svgPFReads = d3.select("body") - .append("svg") - .attr("id", "PFReads") - .attr("width", svgWidth + margin.left + margin.right) - .attr("height", svgHeight + margin.top + margin.bottom) - .append("g") - .attr("transform", "translate(" + margin.left + "," + margin.top + ")") - ; - - var pfReadsSum = 0; - pfReadsSum = sums[0].pfReadsSum - - svgPFReads.append('text') - .text("Number of PF " + clusters + ": " + formatThousands(pfReadsSum)) - .attr("transform", "translate(" + (svgWidth/2) + "," + (svgHeight - 200) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - - - var x = d3.scale.ordinal() - .rangeRoundBands([0, svgWidth], valuePadding); - - var y = d3.scale.linear() - .range([svgHeight, 0]); - - var xAxis = d3.svg.axis() - .scale(x) - .orient("bottom"); - - var yAxis = d3.svg.axis() - .scale(y) - .orient("left"); - - x.domain(statisticsArray.map(function(d) { if (d.externalSampleName == undefined ) {return d.index1}; return d.externalSampleName; })); - y.domain([0, d3.max(statisticsArray, function(d) { return d.pfReadsSum - 20; })]); - - svgPFReads.append("g") - .attr("class", "axis") - .attr("transform", "translate(0," + svgHeight + ")") - .call(xAxis); - - // alternate between minimal padding and high padding of the tick names - svgPFReads.selectAll(".axis text") // select all the text elements for the xaxis - .data(statisticsArray) - .attr ("y", function(d, i) {if (i%2 == 0) {return 8} return 22}); // if index is even the put the text up, else further down - - - var ReadsSum = svgPFReads.selectAll("ReadsSum") - .data(statisticsArray) - .enter() - .append("rect") - .attr("rx", 3) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1);}) - .attr ("width", x.rangeBand()) - .attr ("y", function (d,i) {return y(d.pfReadsSum) ;}) - .attr("height", function (d,i) {return svgHeight - y(d.pfReadsSum);}) - // .attr("fill", function (d) { return "hsla("+ Math.round(d.pfReadsSum)*1.2 +", 40%, 30%, 1)"}); - .attr("fill", function(d) { return colorRange(d.pfReadsSum); }) - ; - - svgPFReads.selectAll("svgPFReadsText") - .data(statisticsArray) - .enter() - .append("text") - .text(function(d) { return formatThousands(d.pfReadsSum); }) - //.attr("x", function(d, i) { return i * 1/(1+valuePadding)*(svgWidth / statisticsArray.length) + ((svgWidth /statisticsArray.length ) /2) -10; }) - .attr ("x", function (d) {return x(d.externalSampleName+d.index1) + 10;}) - // .attr("y", function(d) { - // return (svgHeight - margin.top - margin.bottom + 20) ; - // }) - .attr("y", function(d) {return y(d.pfReadsSum) - 8;}) - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("fill", function(d) { if (d.pfReadsSum < 30000000) { return "black";} - return "black";}) - - ; - -} - - -function roundFloat(myFloat) { - return Number(myFloat).toFixed(2); -} - - -function calculateSum(statisticsArray, withNOINDEX) { - - var sums = [] - var averagePercFilteringPass = 0; - var sumRawReads = 0; - var sumPfReads = 0; - var sumRawYieldMbases = 0; - var sumYieldMbases = 0; - var averagePercRawClustersPerLane = 0; - var averagePfMeanQualityScore = 0; - var averagePfYieldq30Percentage = 0; - - for (var i = 0; i < statisticsArray.length; i++) { - // do not calculate with the NOINDEX reads - if ((typeof (statisticsArray[i].externalSampleName) == 'undefined') && withNOINDEX) { - continue; - } else { - - averagePercFilteringPass = averagePercFilteringPass + parseFloat(statisticsArray[i].percFilteringPass); - sumRawReads = sumRawReads + parseInt(statisticsArray[i].rawReadsSum); - sumPfReads = sumPfReads + parseInt(statisticsArray[i].pfReadsSum); - sumRawYieldMbases = sumRawYieldMbases + parseInt(statisticsArray[i].rawYieldMbases); - sumYieldMbases = sumYieldMbases + parseInt(statisticsArray[i].yieldMbases); - averagePercRawClustersPerLane = averagePercRawClustersPerLane + parseInt(statisticsArray[i].percRawClustersPerLane); - averagePfMeanQualityScore = averagePfMeanQualityScore + parseInt(statisticsArray[i].pfMeanQualityScore); - averagePfYieldq30Percentage = averagePfYieldq30Percentage + parseInt(statisticsArray[i].pfYieldq30Percentage); - } - } - if (withNOINDEX) {penalty = -1} else {penalty = 0} - - // added the Math.max function to make sure that there is no division by zero, - // can happen when a single sample is on a lane (no multiplexing) - averagePercFilteringPass = roundFloat(averagePercFilteringPass / Math.max((statisticsArray.length + penalty),1)); - averagePercRawClustersPerLane = roundFloat(averagePercRawClustersPerLane /Math.max((statisticsArray.length + penalty),1)); - averagePfMeanQualityScore = roundFloat(averagePfMeanQualityScore / Math.max((statisticsArray.length + penalty),1)); - averagePfYieldq30Percentage = roundFloat(averagePfYieldq30Percentage / Math.max((statisticsArray.length + penalty),1)); - - sums.push({ - 'averagePercFilteringPass' : averagePercFilteringPass, - 'rawReadsSum' : sumRawReads, - 'pfReadsSum' : sumPfReads, - 'rawYieldMbases' : sumRawYieldMbases, - 'yieldMbases' : sumYieldMbases, - 'percRawClustersPerLane': averagePercRawClustersPerLane, - 'pfMeanQualityScore' : averagePfMeanQualityScore, - 'pfYieldq30Percentage' : averagePfYieldq30Percentage - }); - - //console.log(sums); - return sums; - -} - - -function plotPercRawClustersPerLane (percRawClustersPerLaneArray) { - - var colorRange = d3.scale.ordinal() - .range(colors) - - var margin = {top: 60, right: 20, bottom: 40, left: 40}, - width = 500 - margin.left - margin.right, - height = 500 - margin.top - margin.bottom; - - var radius = Math.min(width, height) / 2; - - var arc = d3.svg.arc() - .outerRadius(radius - 50) - .innerRadius(radius - 90); - - var pie = d3.layout.pie() - .sort(null) - .value(function(d) { return d.percRawClustersPerLane; }); - - var svgPercRawClustersPerLaneChart = d3.select("body").append("svg") - .attr("id", "percRawClusters") - .attr("width", width) - .attr("height", height) - .append("g") - .attr("transform", "translate(" + width / 2 + "," + height / 2+ ")"); - - percRawClustersPerLaneArray.forEach(function(d) { - d.percRawClustersPerLane = +d.percRawClustersPerLane; - }); - - var g = svgPercRawClustersPerLaneChart.selectAll(".arc") - .data(pie(percRawClustersPerLaneArray)) - .enter().append("g") - .attr("class", "arc"); - - g.append("path") - .attr("d", arc) - .style("fill", function(d) { return colorRange(d.data.index1); }); - - g.append("text") - .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; }) - .attr("dy", ".35em") - .style("text-anchor", "middle") - .attr("font-family", "sans-serif") - .attr("font-size", "10px") - .attr("text-anchor", "middle") - .text(function (d) { - var perc = d.data.percRawClustersPerLane + " %"; - if (d.data.externalSampleName == undefined || d.data.externalSampleName.length > 10) {return d.data.index1 + " " + perc} - return d.data.externalSampleName + " " + perc }) - .on("mouseover", function(d) { - div.transition() - .duration(200) - .style("opacity", .9); - div.style("width", Math.max(d.data.externalSampleName.length, d.data.index1.length) * 8 + "px") - div.html(d.data.externalSampleName + "<br/>" + d.data.index1 + "<br/>" + d.data.percRawClustersPerLane + " %") - .style("left", (d3.event.pageX) + "px") - .style("top", (d3.event.pageY - 42) + "px"); - }) - .on("mouseout", function(d) { - div.transition() - .duration(500) - .style("opacity", 0); - }); - - - svgPercRawClustersPerLaneChart.append('text') - .text("% in Lane") - .attr("fill", "black") - .attr("transform", "translate(" + "0" + "," + (height -220) + ")") - .attr("font-family", "sans-serif") - .attr("font-size", "14px") - .attr("text-anchor", "middle") - ; - -} - - -function downloadButton (buttonName) { - - - var div = d3.select("body").append("button") - .attr("class", "btn-xs") - .attr("type", "submit") - .attr("id", "save_as" + buttonName) - .attr("value", "") - .text("Save") - ; -} - - function submit_download_form(output_format, svgName) - { - var rawSampleName = webAppContext.getEntityIdentifier() - var split = rawSampleName.split(":") - var fc = split[0].split("/")[2] - var lane = split[1] - - // Get the d3js SVG element - var tmp = document.getElementById(svgName); - - if (output_format == "svg") { - - // Extract the data as SVG text string - var svg_xml = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"> <style>" + - ".axis path,"+ - ".axis line {"+ - " fill: none;"+ - " stroke: #000;"+ - " shape-rendering: crispEdges;"+ - "}"+ - - ".axis text {"+ - " font-family: sans-serif;"+ - " font-size: 10px;"+ - "}"+ - "</style>" + (new XMLSerializer).serializeToString(tmp) + "</svg>"; - - var blob = new Blob([svg_xml], {type: "image/svg+xml;charset=utf-8"}); - } - if (output_format == "html") { - var html = "<html> <head> <title></title> <style type=\"text/css\">" + - "table.tableStats { font-family: sans-serif; font-size: 14px; border-collapse:collapse; }" + - ".tableStats th { padding:6px 10px; color:#444; font-weight:bold; text-shadow:1px 1px 1px #fff; border-bottom:2px solid #444; }" + - ".tableStats tr:nth-child(even) { background: WhiteSmoke; }" + - ".tableStats td { padding:0px 10px 10px 10px; }" + - "</style> </head> <body>" + - (new XMLSerializer).serializeToString(tmp) + - "</body> </html>" - var blob = new Blob([html], {type: "image/html;charset=utf-8"}); - } - if (output_format == "png") { - console.log("png") - } - - saveAs(blob, fc + "_Lane_" + lane + "_" + svgName + "." + output_format); - - } - - </script> - </body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css deleted file mode 100644 index a2f1db8832b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/html/style.css +++ /dev/null @@ -1,52 +0,0 @@ - .axis path, - .axis line { - fill: none; - stroke: #000; - shape-rendering: crispEdges; - } - - .axis text { - font-family: sans-serif; - font-size: 10px; - } - - table.tableStats { - width:100%; - font-family: sans-serif; - font-size: 12px; - border-collapse:collapse; - } - - .tableStats th { - padding: 0.5rem; - text-align: right; - color:#444; - font-weight:bold; - /*text-shadow:1px 1px 1px #fff;*/ - border-bottom:1px solid #444; - background: #D9D9D9; - } - - .tableStats tr:nth-child(even) { - background: WhiteSmoke; - } - .tableStats td { - /*border: 1px solid #999;*/ - padding-left: 0.5rem; - padding-right: 0.5rem; - /*padding:0px 10px 10px 10px;*/ - - } - - div.tooltip { - position: absolute; - text-align: center; - width: 100px; - height: 42px; - padding: 2px; - font: 12px sans-serif; - background: LightSalmon; - border: 0px; - border-radius: 8px; - pointer-events: none; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties deleted file mode 100644 index 0508c9d2785..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/laneStatistics/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_LANE -label = Lane Statistics diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js deleted file mode 100644 index a1cc807e5a8..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/openbis-dsu.js +++ /dev/null @@ -1,358 +0,0 @@ -/** - * openbis-dsu.js - * OpenBIS-DSU API - * - * A DSU-specific API for accessing openBIS. Depends on openbis.js. - * @author Chandrasekhar Ramakrishnan - */ - -/** - * The openbis_dsu object provides a dsu-specific interface to openbis. - * - * It creates objects for projects, experiments, samples, and datasets. These objects - * are designed to be passed on to GUI libraries (like d3). The openbis version of each - * object is stored in the bis variable. - * @constructor - */ -function openbis_dsu(url, dssUrl) { - this.server = new openbis(url, dssUrl); -} - -/** - * Request the sequencing samples for a project - */ -openbis_dsu.prototype.retrieveSequencingSamples = function(action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "ILLUMINA_SEQUENCING" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - - -/** - * Request a Sample using the code - */ -openbis_dsu.prototype.retrieveSample = function(sampleIdentifier, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : sampleIdentifier - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForSamples(sampleCriteria, action); -} - - -/** - * Request a Sample with Properties using the code - */ -openbis_dsu.prototype.retrieveSampleWithPropertiesCode = function(sampleIdentifier, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "CODE", - fieldType : "ATTRIBUTE", - desiredValue : sampleIdentifier - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(sampleCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - -/** - * Request a Sample with Properties using the permID - */ -openbis_dsu.prototype.retrieveSampleWithProperties = function(samplePermId, action) -{ - var sampleCriteria = - { - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "PERM_ID", - fieldType : "ATTRIBUTE", - desiredValue : samplePermId - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(sampleCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - - -/** - * Request Parent Samples including properties - */ - -openbis_dsu.prototype.retrieveSampleParents = function(samplePermId, action) -{ - var sampleCriteria = - { - targetEntityKind : "SAMPLE_CHILD", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - }] - } - }; - - var parentCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ - ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(parentCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - - -/** - * Request Child Samples including properties - */ - -openbis_dsu.prototype.retrieveSampleChildren = function(samplePermIds, action) -{ - var permIdClauses = []; - - samplePermIds.forEach(function(samplePermId){ - var clause = {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - } - permIdClauses.push(clause) - }); - - var sampleCriteria = - { - targetEntityKind : "SAMPLE_PARENT", - criteria : { - matchClauses : permIdClauses, - operator : "MATCH_ANY_CLAUSES" - } - }; - - var childCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ - ], - operator : "MATCH_ALL_CLAUSES" - }; - - var fetchOptions = ["PROPERTIES", "PARENTS"]; - - var thisDsu = this; - this.server.searchForSamplesWithFetchOptions(childCriteria, fetchOptions, function(response){ - response.result = thisDsu.getInitializedSamples(response.result); - action(response); - }); -} - -/** - * Get the data sets for a sample specified by sample permId - */ -openbis_dsu.prototype.retrieveDataSetsForSampleWithPermIds = function(samplePermIds, action) -{ - var clauses = []; - - samplePermIds.forEach(function(samplePermId){ - var clause = {"@type":"AttributeMatchClause", - "attribute":"PERM_ID", - "fieldType":"ATTRIBUTE", - "desiredValue": samplePermId - } - clauses.push(clause) - }); - - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : clauses, - operator: "MATCH_ANY_CLAUSES" - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - - - -/** - * Get the data sets for a sample specified by sample identifier - */ -openbis_dsu.prototype.retrieveDataSetsForSample = function(sampleIdentifier, action) -{ - var sampleIdentifierTokens = sampleIdentifier.split("/"); - var sampleCriteria = - { - targetEntityKind : "SAMPLE", - criteria : { - matchClauses : - [ {"@type":"AttributeMatchClause", - "attribute":"CODE", - "fieldType":"ATTRIBUTE", - "desiredValue": sampleIdentifierTokens[2] - }] - } - }; - - var dataSetCriteria = - { - subCriterias : [ sampleCriteria ], - matchClauses : - [ {"@type":"AttributeMatchClause", - attribute : "TYPE", - fieldType : "ATTRIBUTE", - desiredValue : "FASTQ_GZ" - } ], - operator : "MATCH_ALL_CLAUSES" - }; - - this.server.searchForDataSets(dataSetCriteria, action) -} - -/** - * Get all data sets connected to a sequencing sample - */ -openbis_dsu.prototype.retrieveDataSetsForSequencingSample = function(sequencing, action) -{ - this.server.listDataSetsForSample(sequencing.bis, false, action); -} - -openbis_dsu.prototype.getInitializedSamples = function(result) { - // - // Fill Map that uses as key the sample @id and value the sample object - // - var samplesById = {}; - - function storeSamplesById(originalSample) - { - var stack = [originalSample]; - - var referredSample = null; - while (referredSample = stack.pop()) { - if (isNaN(referredSample)) { - samplesById[referredSample["@id"]] = referredSample; - if (referredSample.parents) { - for(var i = 0, len = referredSample.parents.length; i < len; ++i) { - stack.push(referredSample.parents[i]); - } - } - if (referredSample.children) { - for(var i = 0, len = referredSample.children.length; i < len; ++i) { - stack.push(referredSample.children[i]); - } - } - } - } - } - - for(var i = 0; i < result.length; i++) { - var sampleOrId = result[i]; - storeSamplesById(sampleOrId); - } - - // - // Fix Result List - // - function fixSamples(result) - { - for(var i = 0; i < result.length; i++) - { - var sampleOrId = result[i]; - if (isNaN(sampleOrId)) - { - sampleOrId = samplesById[sampleOrId["@id"]]; - } else - { - sampleOrId = samplesById[sampleOrId]; - } - result[i] = sampleOrId; - - - //Fill Parents - if(sampleOrId.parents) { - for(var j = 0; j < sampleOrId.parents.length; j++) { - var parentOrId = sampleOrId.parents[j]; - if(!isNaN(parentOrId)) { //If is an Id get the reference - sampleOrId.parents[j] = samplesById[parentOrId]; - } - } - fixSamples(sampleOrId.parents); - } - - //Fill Children - if(sampleOrId.children) { - for(var j = 0; j < sampleOrId.children.length; j++) { - var childOrId = sampleOrId.children[j]; - if(!isNaN(childOrId)) { //If is an Id get the reference - sampleOrId.children[j] = samplesById[childOrId]; - } - } - fixSamples(sampleOrId.children); - } - } - } - - fixSamples(result); - - return result; - } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css deleted file mode 100644 index 629f097de8b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/body-style.css +++ /dev/null @@ -1,4 +0,0 @@ -body { font: 14px "Trebuchet MS", sans-serif; } - -h1 { font: 16px; } -h3 { font: 12px; } diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css deleted file mode 100644 index 6b1dccf1a62..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/button.css +++ /dev/null @@ -1,54 +0,0 @@ -button { - font: 14px "Trebuchet MS"; - background-color: #222; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); - color: #fff; - text-rendering: optimizeLegibility; - text-shadow: 0 -1px 1px #222; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - border-bottom: 1px solid #222; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - -button.first { - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} - -button.last { - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} - -button.active { - background-color: rgb(65,102,133); -} - -button:hover { - background-color: grey; - cursor: pointer; -} - -input { - font: 14px "Trebuchet MS"; - background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); - background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); - background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); - color: #000; - text-rendering: optimizeLegibility; - padding: 3px 5px 3px 5px; - border: 0; - border-radius: 0; - margin: 0; - -moz-box-shadow: 0 1px 3px #999; - -webkit-box-shadow: 0 1px 3px #999; - box-shadow: 0 1px 3px #999; -} - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html deleted file mode 100644 index 06d4e850cd4..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/html/index.html +++ /dev/null @@ -1,155 +0,0 @@ -<head> - <title>Quantitative Genomics Facility Sample Sheet Generator</title> - <link type="text/css" rel="stylesheet" href="button.css" /> - <link type="text/css" rel="stylesheet" href="body-style.css" /> - <script type="text/javascript" src="/openbis/resources/js/d3.v3.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/jquery.js"></script> - <script type="text/javascript" src="/openbis/resources/js/spin.min.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-dsu.js"></script> - <script type="text/javascript" src="/openbis/resources/js/openbis-action-deferrer.js"></script> - <!-- To speed development, cache the requests --> - <!-- <script type="text/javascript" src="openbis-request-cache.js"></script> --> - <script> - -dsu = new openbis_dsu('/openbis/openbis', '/datastore_server'); -console.log(openbis_dsu) -var context = new openbisWebAppContext(); -dsu.server.useSession(context.getSessionId()); -var vis; -var didCreateVis = false; - -$(document).ready(function() { -}); - -function createVis() -{ - if (didCreateVis) return; - vis = d3.select("#main").append("div").attr("id", "vis"); - didCreateVis = true; -} - -function displayReturnedTable(data) -{ - if (data.error) { - console.log(data.error); - vis.append("p").text("Could not retrieve data."); - return; - } - - // This will show the object in the log -- helpful for debugging - // console.log(data.result); - var dataToShow = data.result; - - vis.append("p").text(""); - // Pick all div elements of the visualization - vis.selectAll("div").data(dataToShow.rows) - // Code under enter is run if there is no HTML element for a data element - .enter() - .append("div") - .text(function(row) { return row[0].value }) - d3.select("#progress").remove() - d3.select("#runType").remove() - //console.log(data); -} - - -function spinner (target) { - var opts = { - lines: 13, // The number of lines to draw - length: 7, // The length of each line - width: 4, // The line thickness - radius: 10, // The radius of the inner circle - corners: 1, // Corner roundness (0..1) - rotate: 0, // The rotation offset - color: '#000', // #rgb or #rrggbb - speed: 1, // Rounds per second - trail: 60, // Afterglow percentage - shadow: false, // Whether to render a shadow - hwaccel: false, // Whether to use hardware acceleration - className: 'spinner', // The CSS class to assign to the spinner - zIndex: 2e9, // The z-index (defaults to 2000000000) - top: 'auto', // Top position relative to parent in px - left: 'auto' // Left position relative to parent in px - }; - var spinner = new Spinner(opts).spin(target); -} - -function loadProperties () { - - var sampleCodes = []; - var miSeqRun = false; - - sampleCodes.push(context.getEntityIdentifier()); - - var deferrer = new openbisActionDeferrer(function(){ - d3.select("#main").select("#progress").remove(); - d3.select("#main").select("#vis").remove(); - if (miSeqRun == true) { - d3.select("#main").append("div").attr("id", "runType").append("p").text("Detected MiSeq Run."); - } - else { - d3.select("#main").append("div").attr("id", "runType").append("p").text("Detected HiSeq Run."); - } - d3.select("#main").append("div").attr("id", "progress").append("p").text("Creating sample sheet..."); - var target = document.getElementById('progress'); - spinner(target); - }, sampleCodes); - - sampleCodes.forEach(function(sampleCode){ - dsu.retrieveSample(sampleCode, function(response) { - getProperties(response); - //console.log("got response " + sampleCode); - deferrer.dependencyCompleted(sampleCode); - callAggregationService(miSeqRun) - }); - }); - - function getProperties(response) { - flowcellProperties = response.result[0].properties; - numberOfLanes = (flowcellProperties.LANECOUNT); - sequencer = (flowcellProperties.SEQUENCER); - if (sequencer == "M01761") { - miSeqRun = true; - } - else { - miSeqRun = false; - } - } -} - - -function callAggregationService(miSeqRun) -{ - var sampleCode = context.getEntityIdentifier(); - var mySendEmail = $('input[name=sendEmail]').is(':checked'); - - didCreateVis = false; - createVis() - - var parameters = - { - sampleId : sampleCode, - sendEmail : mySendEmail, - miSeqRun : miSeqRun - }; - console.log(parameters) - - dsu.server.createReportFromAggregationService("DSS1", "triggerCreateSampleSheet", parameters, displayReturnedTable); -} - - </script> -</head> -<body> -<div id="main"> - <div id="checkbox-group"> - <input type="checkbox" name="sendEmail" value="mail"> Send Sample Sheet By Mail? <br> - <!--<input type="checkbox" name="singlelane" value="singlelane"> Single Lane Mode? <br> --> - <br> - </div> - <div id="button-group"> - <button id="createSampleSheet-button" onclick="loadProperties();">Create Sample Sheet</button> - </div> -</div> -</body> -</html> diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties deleted file mode 100644 index a8230cd14ee..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/as/webapps/sampleSheet/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -# The properties file for an example webapps plugin -# This file has no properties defined because none need to be defined. -webapp-folder = html -openbisui-contexts = sample-details-view -sample-entity-types = ILLUMINA_FLOW_CELL -label = Sample Sheet Creator diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py deleted file mode 100644 index 8fd666f38f2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/create-flowcell-hiseq.py +++ /dev/null @@ -1,221 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'runParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -IS_HISEQ_RUN=False -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='BSSE_FLOWCELLS' -FLOWCELL_PROJECT='FLOWCELLS' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -FLOWCELL_PROJECT_ID = "/%(FLOWCELL_SPACE)s/%(FLOWCELL_PROJECT)s/" % vars() - -# Mapping between XML file naming and used in here -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode'} -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(transaction, a_lane, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setContainer(newFlowCell) - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ----------------------------------------------------------------------------- - -def setFcProperty(searchId, dict, newFlowCell, runInfo): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - -# ----------------------------------------------------------------------------- - -def process(transaction): - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - space = None - - # Get the incoming name - name = incoming.getName() - split=name.split("_") - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - print('Already found a Flow Cell with the following name: '+ name + ". Will re-set the properties...") - newFlowCell = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - else: - # Create a new Flow Cell and set the experiment - print ("Creating new Flow Cell " + name) - - newFlowCell = transaction.createNewSample('/' + FLOWCELL_SPACE + '/' + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_PROJECT_ID + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_PROJECT_ID + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - [registerFlowLane(transaction, lane, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + ' property file: ' + run['Id']) - - # The HiSeq is providing more infos, which we will parse here: - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - addVocabularyTerm(transaction, "PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['RTAVERSION'])) - newFlowCell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - newFlowCell.setPropertyValue("CONTROL_LANE", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROLLANE'])) - newFlowCell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - - runMode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", runMode) - - newFlowCell.setPropertyValue("RUN_MODE", runMode) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - - numberOfCycles = runParameters.getAllchildren('Read1')[0].text - cyclesVocabularyName = "CYCLES" - addVocabularyTerm(transaction, cyclesVocabularyName, numberOfCycles) - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - read2 = runParameters.getAllchildren('Read2') - if (str(read2[0].text) == '0'): - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - else: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - newFlowCell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - - indexRead1 = runParameters.getAllchildren('IndexRead1') - newFlowCell.setPropertyValue("INDEXREAD", indexRead1[0].text) - - indexRead2 = runParameters.getAllchildren('IndexRead2') - newFlowCell.setPropertyValue("INDEXREAD2", indexRead2[0].text) - - setFcProperty('FlowcellLayout', RUNINFO_XML, newFlowCell, runInfo) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties deleted file mode 100644 index 5c56666b206..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell based on runParameters.xml and RunInfo.xml created by an -# Illumina HiSeq -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py deleted file mode 100755 index cfde834eb21..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/create-flow-cell-miseq.py +++ /dev/null @@ -1,251 +0,0 @@ -''' -@copyright: -2012, 2013 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -import os -import shutil -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -#RUNPARAMETERS = 'RunParameters.xml' -RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - - # ----------------------------------------------------------------------------- - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - if foundSamples.size() > 0: - raise NameError('Already found a Flow Cell with the following name: '+ name) - - # Parse the RunInfo.xml file - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - - # Create a new Flow Cell and set the experiment - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + name, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - run = runInfo.getAllchildren('Run')[0].attrib - if (run['Id'] != name): - raise NameError('Flowcell names do not match between directory name '+ name + - ' and ' + RUNINFO + 'property file: ' + run['Id']) - - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - print RTAversion - addVocabularyTerm(transaction, "PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - - def setFcProperty(searchId, dict): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - numberOfCycles = readMap['1'][0] - cyclesVocabularyName = "CYCLES" - - addVocabularyTerm(transaction, cyclesVocabularyName, numberOfCycles) - - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - indexCount = 0 - readCount = 0 - - for e in readMap: - if readMap[e][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - [registerFlowLane(lane, transaction, name, newFlowCell) for lane in range(1,int(maxLanes)+1)] - - replyTo = EMailAddress("manuel.kohler@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@bsse.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - - transaction.getGlobalState().getMailClient().sendEmailMessage("Automatically created new flow cell " + name + " in openBIS", \ - "A new sequencing run got started using flow cell " + name, replyTo, fromAddress, ina, katja, christian, manuel); - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties deleted file mode 100644 index 27b2927d980..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py deleted file mode 100755 index 981db5dd2ab..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/create-flow-cell-nextseq.py +++ /dev/null @@ -1,290 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' and 'RunInfo.xml' -and creates one Sample of type 'ILLUMINA_FLOW_CELL' and sets Sample properties -from those two XML files. Additionally the number of lanes are read out and -are created as contained samples of type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for NextSeq runs: 140729_NS500318_0002_AH0T25AGXX - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -RUNPARAMETERS = 'RunParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} - -PERSISTANT_KEY_MAP = "persistant_key_map" - -#------------------------------------------------------------------------------ - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('//' + elementName) - return childList - -# ----------------------------------------------------------------------------- - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - -# ----------------------------------------------------------------------------- - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - -# ----------------------------------------------------------------------------- - -def sendEmail(mailClient, fcId): - - replyTo = EMailAddress("manuel.kohler@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@bsse.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - - mailClient.sendEmailMessage("Automatically created new NextSeq flow cell " + fcId + " in openBIS", \ - "A new NextSeq run got started with flow cell: " + fcId , replyTo, fromAddress, ina, katja, christian, philippe, manuel, elodie); - -# ----------------------------------------------------------------------------- - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - results = context.getPersistentMap().get(PERSISTANT_KEY_MAP) - sendEmail(mailClient, results[0]) - -# ----------------------------------------------------------------------------- - -def searchSample(transaction, sampleName): - - # Search for the sample and check if there is already sample with this fcId - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - -# ----------------------------------------------------------------------------- - -def setFcProperty(searchId, dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (dict): - if (element <> '') and (dict[element] <> ''): - newFlowCell.setPropertyValue(element, children[0].attrib[dict[element]]) - -# ----------------------------------------------------------------------------- - -def setIndexLengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - print(readMap) - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - -# ----------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ----------------------------------------------------------------------------- - -def get_version(my_path): - return my_path[-4:-2] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - name = incoming.getName() - # ['120726', 'M00721', '0011', 'A000000000-A1FVF'] - # NextSeq: 140729_NS500318_0002_AH0T25AGXX - - runDate, MiseqID, runningNumber, trayAndFcId = name.split("_") - tray = trayAndFcId[0] - fcId = trayAndFcId[1:] - transaction.getRegistrationContext().getPersistentMap().put(PERSISTANT_KEY_MAP, [fcId]) - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(incomingPath + '/' + RUNINFO) - runParameters = parseXmlFile(incomingPath + '/' + RUNPARAMETERS) - - # get the number of lanes - maxLanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - - foundSamples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if foundSamples.size() > 0: - print('Already found a Flow Cell with the following name: '+ name + ". Will re-set the properties...") - newFlowCell = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - else: - # Create a new Flow Cell - newFlowCell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp == None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m"), - EXPERIMENT_TYPE_CODE) - newFlowCell.setExperiment(exp) - - foundLanes = searchSample(transaction, fcId + ":1") - if not foundLanes: - # Create flow lanes, but we ignore the maxLanes, as we have 4 physical lanes but only one logical lane - [registerFlowLane(lane, transaction, fcId, newFlowCell) for lane in range(1,int(1)+1)] - - run = runInfo.getAllchildren('Run')[0].attrib - RTAversion = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", RTAversion) - newFlowCell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", RTAversion) - - runMode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", runMode) - newFlowCell.setPropertyValue("RUN_MODE", runMode) - - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, newFlowCell) - - sequencer = runInfo.getAllchildren('Instrument') - newFlowCell.setPropertyValue("SEQUENCER", sequencer[0].text) - newFlowCell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", createOpenbisTimeStamp(incomingPath + '/' + RUNPARAMETERS)) - newFlowCell.setPropertyValue("RUN_NAME_FOLDER", name) - newFlowCell.setPropertyValue("SBS_KIT", major_version) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - isIndexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, isIndexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - numberOfCycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, numberOfCycles) - newFlowCell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", numberOfCycles) - - setIndexLengths (readMap, newFlowCell) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties deleted file mode 100644 index 8131d29f94d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for creating a flow cell -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/create-flowcell-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flow-cell-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py deleted file mode 100644 index 9ab05190fe8..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/create-flowcell.py +++ /dev/null @@ -1,309 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' / 'runParameters.xml -'and 'RunInfo.xml' and creates one Sample of type 'ILLUMINA_FLOW_CELL' -and sets Sample properties from those two XML files. Additionally the -number of lanes are read out and are created as contained samples of -type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -RUNPARAMETERS = 'RunParameters.xml' -ALTERNATIVE_RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode', - 'CONTROL_SOFTWARE_VERSION': 'ApplicationVersion'} - -PERSISTENT_KEY_MAP = "persistent_key_map" - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('.//' + elementName) - return childList - - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - - -def send_email(mailClient, persistent_map): - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@id.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - - subject = "Automatically created new " + persistent_map[1] + " flow cell " + persistent_map[0] + " in openBIS" - body = "A new run got started with flow cell: " + persistent_map [0] + "\nHave a good day!" - mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, ina, katja, christian, - philippe, manuel, elodie); - - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - persistent_map = context.getPersistentMap().get(PERSISTENT_KEY_MAP) - send_email(mailClient, persistent_map) - - -def searchSample(transaction, sampleName): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def setFcProperty(searchId, my_dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (my_dict): - if (element != '') and (my_dict[element] != ''): - newFlowCell.setPropertyValue(element, children[0].attrib[my_dict[element]]) - - -def set_index_lengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_version(my_path): - return my_path[-4:-2] - - -def create_or_update_flowcell(transaction, fcId): - - found_samples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if found_samples.size() > 0: - print('Already found a Flow Cell with the following name: ' + fcId + ". Will re-set the properties...") - new_flowcell = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - else: - new_flowcell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp is None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + - datetime.now().strftime("%Y.%m"), EXPERIMENT_TYPE_CODE) - new_flowcell.setExperiment(exp) - return new_flowcell - - -def set_run_mode(transaction, new_flowcell, run_mode): - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", run_mode) - new_flowcell.setPropertyValue("RUN_MODE", run_mode) - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - run_id = incoming.getName() - model = get_model(run_id) - print("Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - transaction.getRegistrationContext().getPersistentMap().put(PERSISTENT_KEY_MAP, [fc_id, model]) - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(os.path.join(incomingPath, RUNINFO)) - try: - runParameters = parseXmlFile(os.path.join(incomingPath, RUNPARAMETERS)) - except: - runParameters = parseXmlFile(os.path.join(incomingPath, ALTERNATIVE_RUNPARAMETERS)) - - # get the number of lanes - max_lanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - new_flowcell = create_or_update_flowcell(transaction, fc_id) - - flow_lanes = new_flowcell.getContainedSamples() - if len(flow_lanes) is 0: - if model in [Sequencers.NEXTSEQ_500]: - max_lanes = 1 - [registerFlowLane(lane, transaction, fc_id, new_flowcell) for lane in range(1,int(max_lanes)+1)] - - # NextSeq specific - if model in [Sequencers.NEXTSEQ_500]: - run_mode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - set_run_mode(transaction, new_flowcell, run_mode) - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - new_flowcell.setPropertyValue("SBS_KIT", major_version) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # MiSeq specific - if model in [Sequencers.MISEQ]: - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - new_flowcell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # HiSeq specific - if model in HISEQ_LIST: - run_mode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - new_flowcell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - new_flowcell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROL_SOFTWARE_VERSION'])) - if (new_flowcell.getPropertyValue("END_TYPE")) == "PAIRED_END": - new_flowcell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - set_run_mode(transaction, new_flowcell, run_mode) - - rta_version = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", rta_version) - new_flowcell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", rta_version) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, new_flowcell) - - sequencer = runInfo.getAllchildren('Instrument') - addVocabularyTerm(transaction, "SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp(os.path.join(incomingPath, RUNINFO))) - new_flowcell.setPropertyValue("RUN_NAME_FOLDER", run_id) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - is_indexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, is_indexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - number_of_cycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, number_of_cycles) - new_flowcell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", number_of_cycles) - - set_index_lengths(readMap, new_flowcell) \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties deleted file mode 100644 index dd75e75ff45..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/create-flowcell/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -# -# Drop box for creating a flow cell -# -incoming-dir = ${incoming-root-dir}/create-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py deleted file mode 100644 index f5253bc0874..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/export-meta-data.py +++ /dev/null @@ -1,464 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -BSSE_QGF_22266_H0W8YBGXX_1 -or -Undetermined_H0W8YBGXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.dss.generic.shared import DataSourceQueryService - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/', - 'BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', - 'NEUROSTEMX': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', - 'SWISS_TPH' : '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -def CRC32_from_file(filename, transaction): - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, affiliation_name, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getExperimentIdentifier() - try: - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - #extraCopy (affiliation_name, meta_data_file_name) - #extraCopySciCore (affiliation_name, meta_data_file_name, destinationFolder) - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - - def sortedDictValues(adict): - ''' - Given a dictionary it returns the values of this dict sorted - by the keys - d = {2:1, 4:1, 1:1, 100:3, 3:5} - sortedDictValues(d) - [1, 1, 5, 1, 3] - ''' - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - -# ------------------------------------------------------------------------------- - -def extraCopy (affiliation_name, path): - ''' - @deprecated: replaced with extraCopySciCore - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' ): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (affiliation_name, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - #dropBoxFolder = '/tmp/scicore' - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - basename = os.path.basename(filePath) - - print("extraCopySciCore") - print basename - print affiliation_name - - if (affiliation_name in ['BIOCENTER_BASEL', 'NEUROSTEMX', 'SWISS_TPH']): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - -# ------------------------------------------------------------------------------- - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, affiliation_name, undetermined): - - for file in fastq_files: - extraCopySciCore (affiliation_name, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - if (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = "1" - undetermined = True - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def process(transaction): - - undetermined = False - - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - # Get the search service - search_service = transaction.getSearchService() - - def searchSampleInSpace (type, search_service): - - spaceCode = "UNI_BASEL_GAGNEUX" - sc = SearchCriteria() -# print('Searching sample: '+ str(code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.SPACE, spaceCode)); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, type)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - samples = searchSampleInSpace("ILLUMINA_SEQUENCING", search_service) - print(samples.size()) - - - - - for sample in samples[0:5]: - - sequencing_sample_properties_dict = get_sample_properties (transaction, sample) - meta_data_file_name = sequencing_sample_properties_dict["SAMPLE_CODE"] + METADATA_FILE_SUFFIX - - sampleName = sequencing_sample_properties_dict["SAMPLE_CODE"] - - print(meta_data_file_name) - print(sequencing_sample_properties_dict) - - flowCellId = "150109_D00535_0042_AHB2K0ADXX" - - flowcell_sample_immutable = searchSample (flowCellId, search_service) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - - experiment = sample.getExperiment() - affiliation_name = "dummy" - flowLane = "1" - newFastqFiles = ["/tmp/hello.txt", "/tmp/bio.txt"] - - meta_data_file_path = '/tmp/metadata_'+ sampleName - - DATA_SOURCE = "pathinfo_dev" - QUERY = """ - SELECT ds.code as "data_set_code", dsf.* - FROM data_sets ds, data_set_files dsf - WHERE ds.code = ?{1} AND dsf.dase_id = ds.id - """ - - dsqs = DataSourceQueryService() - - dsqs.select(DATA_SOURCE, QUERY) - #results = queryService.select(DATA_SOURCE, QUERY, ['20150108225105804-60446532']) - print(results) - - - writeMetadataFile(transaction, sampleName, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) - -# sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) -# -# # get all fastqs -# fastq_files=getFileNames(incomingPath) -# -# # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz -# # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz -# first_fastq_file = os.path.basename(fastq_files[0]) -# -# flowcell_sample_immutable = searchSample (flowCellId, search_service) -# fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) -# foundLane = searchSample (incoming_sample, search_service) -# -# # there should be only one sample because it is unique within one Flow Cell -# if (len(foundLane) > 1): -# raise Exception("More than one sample found! No unique code: " + incoming_sample) -# elif (len(foundLane) == 0): -# raise Exception("No matching sample found for: " + incoming_sample) -# else : -# sample = foundLane[0].getSample() -# parents = sample.getParents() -# -# # Create a data set and set type -# dataSet = transaction.createNewDataSet("FASTQ_GZ") -# dataSet.setMeasuredData(False) -# dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) -# dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) -# dirName = transaction.createNewDirectory(dataSet,name) -# -# if not undetermined: -# newFastqFiles = fastq_files -# foundSample = searchSample (sample_code, search_service) -# sequencing_sample = foundSample[0].getSample() -# experiment = sequencing_sample.getExperiment() -# sequencing_sample_code = sequencing_sample.getCode() -# print("sequencing_sample_code: "+ sequencing_sample_code) -# -# sequencing_sample_properties_dict = get_sample_properties (transaction, foundSample[0]) -# -# if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): -# #print(sequencing_sample_properties_dict[INDEX1]) -# dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) -# if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): -# dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) -# dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) -# -# if (AFFILIATION_PROPERTY_NAME in sequencing_sample_properties_dict): -# affiliation_name = sequencing_sample_properties_dict[AFFILIATION_PROPERTY_NAME] -# -# filepart, suffix = first_fastq_file.split('.',1) -# meta_data_file_name = filepart.rsplit('_',2)[0] + METADATA_FILE_SUFFIX -# # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set -# meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, fastq_files, flowLane) -# -# # Undetermined Files -# else: -# affiliation_name = "" -# affiliation_for_Undetermined = "" -# newFastqFiles = [] -# lane_parents = searchParents (search_service, parents) -# newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) -# for parent in lane_parents: -# sequencing_sample_properties_dict = get_sample_properties (transaction, parent) -# parent_sample = parent.getSample() -# sample_code = parent_sample.getCode() -# experiment = parent_sample.getExperiment() -# if (AFFILIATION_PROPERTY_NAME in sequencing_sample_properties_dict): -# affiliation_name = sequencing_sample_properties_dict[AFFILIATION_PROPERTY_NAME] -# -# # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. -# # as those samples do not have a NCBI ORGANISM TAXONOMY -# if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: -# print(sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL") -# meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) -# affiliation_for_Undetermined = affiliation_name -# -# elif (INDEX1 not in sequencing_sample_properties_dict) and (INDEX2 not in sequencing_sample_properties_dict) and \ -# (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): -# print('NONINDEXED sample and Taxonomy id is NOT' + PHIX_TAXONOMY_ID +', probably a pool: ' + sample_code) -# meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, newFastqFiles, flowLane) -# affiliation_for_Undetermined = affiliation_name -# # PARENTS: -# else: -# # Create Parent Meta data -# print(sample_code + ": Create parent meta data file") -# meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) -# writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, -# fcMetaDataDict, experiment, affiliation_name, [], flowLane) -# continue -# -# put_files_to_dataset (transaction, dataSet, newFastqFiles, name, flowCellId, affiliation_for_Undetermined, undetermined) -# -# if foundLane.size() > 0: -# sa = transaction.getSampleForUpdate(foundLane[0].getSampleIdentifier()) -# sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) -# dataSet.setSample(foundLane[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/lib/crc32 deleted file mode 100755 index ffaf277227c6dfb0dae3fbe751d9db158bd5ae29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13196 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties deleted file mode 100644 index 6e3d93e5e91..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/export-meta-data/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/export-meta-data -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = export-meta-data.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties deleted file mode 100644 index 2fcbb9bec08..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/read-demultiplex-stats-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py deleted file mode 100755 index 51e976dcc2e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-miseq/read-demultiplex-stats-miseq.py +++ /dev/null @@ -1,594 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0, - pfReadsSumWithoutUndetermined = 0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - self.pfReadsSumWithoutUndetermined = pfReadsSumWithoutUndetermined - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - -class lane_statistics: - def __init__(self): - self.complete_lane_statistic = Statistics() - - def calculate_complete_lane_statistic(self, list_of_statistics): - - sample_number = len(list_of_statistics) - - for stat in list_of_statistics: - self.complete_lane_statistic.lane = stat.lane - self.complete_lane_statistic.pfYieldSum += stat.pfYieldSum - self.complete_lane_statistic.rawYieldSum += stat.rawYieldSum - self.complete_lane_statistic.pfReadsSum += stat.pfReadsSum - self.complete_lane_statistic.rawReadsSum += stat.rawReadsSum - self.complete_lane_statistic.pfPercentage += stat.pfPercentage - self.complete_lane_statistic.pfYieldQ30Percentage += stat.pfYieldQ30Percentage - self.complete_lane_statistic.pfmeanQualityScore += stat.pfmeanQualityScore - - if stat.index1 != "Undetermined": - self.complete_lane_statistic.pfReadsSumWithoutUndetermined += stat.pfReadsSum - - self.complete_lane_statistic.pfPercentage = self.complete_lane_statistic.pfPercentage / sample_number - self.complete_lane_statistic.pfYieldQ30Percentage = self.complete_lane_statistic.pfYieldQ30Percentage / sample_number - self.complete_lane_statistic.pfmeanQualityScore = self.complete_lane_statistic.pfmeanQualityScore/ sample_number - - return self.complete_lane_statistic - - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ----------------------------------------------------------------------------- - -def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -#-------------------------------------------------------------------------------------------------------------------------------------- - -def searchDataSetsofSample(transaction, sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -#-------------------------------------------------------------------------------------------------------------------------------------- - -def getIndexesofDataSetsofSample(transaction, sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - laneNumber = 1 - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - else: - sampleDict[sampleName].append(sa) - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, name) - - full_lane_statistics = lane_statistics() - complete_lane_statistic = full_lane_statistics.calculate_complete_lane_statistic(stat) - - for lane in lanes: - if str(laneNumber) == lane.getSampleIdentifier().split(":")[-1]: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - break - - mutable_lane.setPropertyValue("YIELD_MBASES", str(complete_lane_statistic.pfYieldSum)) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(complete_lane_statistic.rawYieldSum)) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(complete_lane_statistic.pfPercentage)) - mutable_lane.setPropertyValue('PF_READS_SUM',str(complete_lane_statistic.pfReadsSum)) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(complete_lane_statistic.rawReadsSum)) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(complete_lane_statistic.pfYieldQ30Percentage)) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(complete_lane_statistic.pfmeanQualityScore)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(complete_lane_statistic.pfReadsSumWithoutUndetermined)) - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(transaction, laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1List = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1List = [ index1 for index1 in index1List if searchIndex1 in index1[:-2]] - try: - if len(searchIndex1List) > 1: - if searchIndex1List[0].startswith(searchIndex1): - searchIndex1 = searchIndex1List[0] - else: - searchIndex1 = searchIndex1List[1] - else: - searchIndex1 = searchIndex1List[0] - print searchIndex1 - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-2]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(transaction, laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties deleted file mode 100644 index 102a5fe3f83..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py deleted file mode 100755 index 787e008d89c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py +++ /dev/null @@ -1,364 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.get(lane_in_int).Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.get(lane_in_int).Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_READS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.get(lane_in_int).Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.get(lane_in_int).Clusters_PfWithoutNoindex))) - - ########################################################## - - def update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell): - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - print(codeSampleFlowLane) - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) - print(index1list) - - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - nprocessedDataSets = 0 - for s in samplestatisticslist: - print "\nContent in XML file:\n", s - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - if index2length > 7: # second and larger index must be reversed and complemented in contrast to first or smaller index - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - else: # second and smaller index is unknown how to handle - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - return nprocessedDataSets - - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXmlAndCalculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - print(samplestatisticslist[0].Flowcell) - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - - for lane in lanes: - lane_in_int = int(lane.getCode().split(":")[-1]) - if (lane_in_int in totalLaneStatistics.keySet()): - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - codeSampleFlowLane = ":".join([codeSampleFlowCell, str(lane_in_int)]) - nprocessedDataSets = update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell) - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java deleted file mode 100644 index 385601962cd..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java +++ /dev/null @@ -1,736 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -//########################################################## - -public final class read_demultiplex_stats -{ - - public static ArrayList<Statistics> importXmlAndCalculateStatistics(String XMLFile) throws Exception { - - ArrayList<Statistics> stats = executeImportXmlAndCalculateStatistics(XMLFile); - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(stats); - - for (Statistics s : stats) - s.adaptStatisticsWithRespectToAllSamples(stats, groupedList); - return stats; - } - - /** - * - * Streams through a given XML file, parses the data and writes it into a Statistics object - * - * @param XMLfile: ConversionStats.xml - * @return a ArrayList of <Statistics> - */ - private static ArrayList<Statistics> executeImportXmlAndCalculateStatistics(String XMLfile) throws Exception { - ArrayList<Statistics> sampleStatisticsList = new ArrayList<>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: sampleStatisticsList (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - - </Project> - <Lane number="2"> - <TopUnknownBarcodes> - <Barcode count="150988002" sequence="NNNNNNN"/> - <Barcode count="167095" sequence="CCCCCCC"/> - <Barcode count="57859" sequence="CCCGTCC"/> - <Barcode count="49993" sequence="CCGATGT"/> - <Barcode count="42981" sequence="GTCCCGC"/> - <Barcode count="40446" sequence="TAAAATT"/> - <Barcode count="39962" sequence="CCAGATC"/> - <Barcode count="34688" sequence="GATGTAT"/> - <Barcode count="32013" sequence="AAAAAGT"/> - <Barcode count="30501" sequence="AGATCAT"/> - </TopUnknownBarcodes> - </Lane> - [...] - */ - -// Map<Integer, Map<String, Integer>> barcodesPerLane = null; - - try { - String errorMessage; - int event; - int skip; - String flowcellName = ""; - String projectName = ""; - String sampleName = ""; - String barcodeName = ""; - int laneNumber = 0; - int tileNumber; - Sample currentSample = null; - Statistics statistics; - SampleItem rawItem; - SampleItem pfItem; - Map<String, Integer> barcodesMap = new HashMap<>(); - Map<Integer, Map<String, Integer>> barcodesPerLane = new HashMap<>(); - - InputStream xmlFile = new FileInputStream(XMLfile); - XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlParser = xmlFactory.createXMLStreamReader(xmlFile); - - // Start-Tag "Stats": - event = xmlParser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlParser.getLocalName().equals("Stats")) { - errorMessage = - "STRANGE ERROR IN METHOD importXmlAndCalculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errorMessage); - } - - // Loop over potential Tags "Flowcell": - event = xmlParser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = xmlParser.getAttributeValue(0); - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = ""; - event = xmlParser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Project")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - //skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - projectName = xmlParser.getAttributeValue(0); - - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Project")) { - projectName = ""; - event = xmlParser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - sampleName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - sampleName = ""; - event = xmlParser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - barcodeName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - barcodeName = ""; - event = xmlParser.nextTag(); - - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Lane")) { -// System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - laneNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - - // Now we have everything we need, we put it into a Sample - currentSample = new Sample(); - - if (sampleName.startsWith("Undetermined")) { - currentSample.Sample = sampleName + "_" + flowcellName + "_" + laneNumber; - } else { - currentSample.Sample = sampleName; - } - - currentSample.Flowcell = flowcellName; - currentSample.Lane = laneNumber; - currentSample.Project = projectName; - currentSample.Barcode = barcodeName; - event = xmlParser.nextTag(); -// System.out.println(currentSample.Sample); - - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Lane")) { - // Statistics 1st step: calculate individual statistics per sample: - statistics = new Statistics(currentSample); - if (!currentSample.Project.equals("")) { - sampleStatisticsList.add(statistics); - } - currentSample = null; - statistics = null; - -// laneNumber = Double.NaN; - event = xmlParser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - // concerning Raw with Assumption: Raw-element is singlechild: - xmlParser.nextTag(); - rawItem = new SampleItem(); - rawItem.Type = "Raw"; - rawItem.Lane = laneNumber; - rawItem.Tile = tileNumber; - xmlParser.nextTag(); - rawItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + rawItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - rawItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + rawItem.YieldList.get(rawItem.YieldList.size()-1) + ", YieldQ30=" + rawItem.YieldQ30List.get(rawItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + rawItem.QualityScoreSumList.get(rawItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + rawItem); - currentSample.RawList.add(rawItem); - - - rawItem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlParser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - pfItem = new SampleItem(); - pfItem.Type = "Pf"; - pfItem.Lane = laneNumber; - pfItem.Tile = tileNumber; - xmlParser.nextTag(); - pfItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + pfItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - pfItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + pfItem.YieldList.get(pfItem.YieldList.size()-1) + ", YieldQ30=" + pfItem.YieldQ30List.get(pfItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + pfItem.QualityScoreSumList.get(pfItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + pfItem); - currentSample.PfList.add(pfItem); - pfItem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = 0; - event = xmlParser.nextTag(); - - - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - event = xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - Integer numberOfBarcodes = Integer.valueOf((xmlParser.getAttributeValue(0))); - String barcode = xmlParser.getAttributeValue(1); - barcodesMap.put(barcode, numberOfBarcodes); - xmlParser.nextTag(); - event = xmlParser.nextTag(); - } - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - barcodesPerLane.put(laneNumber, barcodesMap); - event = xmlParser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Stats")) { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlParser.close(); - - } catch (FileNotFoundException | XMLStreamException | IllegalArgumentException e) { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } - return sampleStatisticsList; - } - - public static HashMap<Integer, LaneStatistics> calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - HashMap<Integer, LaneStatistics> listOfLaneStatistics= new HashMap<Integer, LaneStatistics>(); - - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(samplestatisticslist); - - for (Integer key : groupedList.keySet()) { - - LaneStatistics laneStats = new LaneStatistics(groupedList.get(key)); - laneStats.calculateOverallStats(key); - listOfLaneStatistics.put(key, laneStats); - } - return listOfLaneStatistics; - } - - - private static HashMap<Integer, ArrayList<Statistics>> groupByLane(ArrayList<Statistics> samplestatisticslist) { - // Group ArrayList by Lane - HashMap<Integer, ArrayList<Statistics>> groupedList = new HashMap <Integer, ArrayList<Statistics>>(); - for (Statistics s : samplestatisticslist) { - - if (groupedList.containsKey(s.Lane)) { - groupedList.get(s.Lane).add(s); - } - else { - ArrayList <Statistics> newEntry = new ArrayList<Statistics>(); - newEntry.add(s); - groupedList.put(s.Lane, newEntry); - } - } - return groupedList; - } - - - // ########################################################## - - private static class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - public Integer Lane = 0; - - public Integer Tile = 0; - - public Integer ClusterCount = 0; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<>(); - - public List<Double> YieldQ30List = new ArrayList<>(); - - public List<Double> QualityScoreSumList = new ArrayList<>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public static class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public Integer Lane = 0; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<>(); - - public List<SampleItem> PfList = new ArrayList<>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: " + this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public static class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public Integer Sum_RawClusterCount = 0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = Double.NaN; - - public double Fraction_PfQualityScoreSum_PfYield = Double.NaN; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Lane = sample.Lane; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: "+ this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount + "\n"; - } - - public void adaptStatisticsWithRespectToAllSamples(ArrayList<Statistics> statisticslist, HashMap<Integer, ArrayList<Statistics>> groupedList) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT" + - " IN METHOD adaptStatisticsWithRespectToAllSamples!"; - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - for (Integer key : groupedList.keySet()) { - double sumAllRawClusterCounts = 0; - ArrayList<Statistics> groupList = groupedList.get(key); - for (Statistics element : groupList) { - sumAllRawClusterCounts += element.Sum_RawClusterCount; - } - for (Statistics element : groupList) { - element.Percentage_RawClusterCount_AllRawClusterCounts = - calculate_Percentage(element.Sum_RawClusterCount, sumAllRawClusterCounts); - } - } - } - } - - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - } - return z; - } - } - - public static class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public Integer Lane = 0; - - public double Sum_RawClusterCount = 0.0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats(Integer key) - { - int sampleNumber = statisticsList.size(); - for (Statistics s : statisticsList) { - if (!s.Barcode.equals("") || s.Barcode.equals("unknown")) { - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - if (!Double.isNaN(s.Percentage_PfYieldQ30_PfYield)) { - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - } - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - - this.Lane = key; - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Lane " + this.Lane + " Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount " + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield + - " Percentage_PfClusterCount_RawClusterCount " + this.Percentage_PfClusterCount_RawClusterCount; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java deleted file mode 100644 index bc409770abf..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -import static org.testng.AssertJUnit.assertEquals; - -public class read_demultiplex_statsTest { - - private String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - - - @org.testng.annotations.BeforeMethod - public void setUp() throws Exception { - } - - @org.testng.annotations.AfterMethod - public void tearDown() throws Exception { - - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - assertEquals(stat.size(), 39); - read_demultiplex_stats.Statistics eigth_element = stat.get(8); - assertEquals(eigth_element.Flowcell, "H2VYMBBXX"); - assertEquals(eigth_element.Barcode, "GCCAATA"); - assertEquals(eigth_element.Sum_RawClusterCount.intValue(), 27850973); - assertEquals(eigth_element.Sum_RawYield, 8.410993846E9); - assertEquals(eigth_element.Percentage_PfYieldQ30_PfYield, 87.6792784423112); - assertEquals(eigth_element.Fraction_PfQualityScoreSum_PfYield, 37.40267477898711); - assertEquals(eigth_element.Percentage_RawClusterCount_AllRawClusterCounts, 5.770060255141701); - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics_overall() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - Double percentage = 0.0; - for (read_demultiplex_stats.Statistics element : stat) { - if (element.Lane.equals(6)) { - percentage += element.Percentage_RawClusterCount_AllRawClusterCounts; - } - } - assertEquals(100.0, (double)Math.round(percentage * 1000) / 1000); - - } - - @org.testng.annotations.Test - public void testCalculateTotalLaneStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = - read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - HashMap<Integer, read_demultiplex_stats.LaneStatistics> lanesStatistics = - read_demultiplex_stats.calculateTotalLaneStatistics(stat); - - read_demultiplex_stats.LaneStatistics lane2 = lanesStatistics.get(2); - assertEquals(lane2.Sum_RawClusterCount, 4.826808E8); - assertEquals(lane2.Sum_PfClusterCount.intValue(), 332293484); - assertEquals(lane2.Percentage_PfYieldQ30_PfYield, 86.14969791102051); - assertEquals(lane2.Percentage_PfClusterCount_RawClusterCount, 92.63902299583091); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java deleted file mode 100644 index be097bcc3ed..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -public class start_read_demultiplex_stats { - - public static void main(String[] args) { - - String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - ArrayList<read_demultiplex_stats.Statistics> stat = null; - try { - stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - } catch (Exception e) { - e.printStackTrace(); - } - HashMap<Integer, read_demultiplex_stats.LaneStatistics> ls = read_demultiplex_stats.calculateTotalLaneStatistics(stat); -// System.out.println(stat); -// System.out.println(ls); - } -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties deleted file mode 100644 index 1337bde948b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py deleted file mode 100755 index 5695473fe03..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-demultiplex-stats/read-demultiplex-stats.py +++ /dev/null @@ -1,595 +0,0 @@ -''' - @copyright: 2012 ETH Zuerich, CISD - - @license: - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -@author: Manuel Kohler - -XML Structur which is processed: - -<?xml version="1.0"?> -<Summary> - <Lane index="8"> - <Sample index="lane8"> - <Barcode index="Undetermined"> - <Tile index="1101"> - <Read index="1"> - <Raw> - <Yield>1921250</Yield> - <YieldQ30>949680</YieldQ30> - <ClusterCount>38425</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>40995660</QualityScoreSum> - </Raw> - <Pf> - <Yield>945450</Yield> - <YieldQ30>854815</YieldQ30> - <ClusterCount>18909</ClusterCount> - <ClusterCount0MismatchBarcode>0</ClusterCount0MismatchBarcode> - <ClusterCount1MismatchBarcode>0</ClusterCount1MismatchBarcode> - <QualityScoreSum>33815505</QualityScoreSum> - </Pf> - </Read> - </Tile> - [...] - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -''' - -import time -import os -import fnmatch -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - -# ----------------------------------------------------------------------------- - -class qcValues(object): - def __init__(self, Yield = 0, YieldQ30 = 0, ClusterCount = 0, - ClusterCount0MismatchBarcode = 0, ClusterCount1MismatchBarcode = 0, - QualityScoreSum = 0, *args, **kwargs): - self.Yield = Yield - self.YieldQ30 = YieldQ30 - self.ClusterCount = ClusterCount - self.ClusterCount0MismatchBarcode = ClusterCount0MismatchBarcode - self.ClusterCount1MismatchBarcode = ClusterCount1MismatchBarcode - self.QualityScoreSum = QualityScoreSum - - def __str__(self): - return "Yield: %s, YieldQ30: %s, ClusterCount: %s, ClusterCount0MismatchBarcode: %s," \ - " CusterCount1MismatchBarcode: %s, QualityScoreSum: %s" \ - % (self.Yield, self.YieldQ30, self.ClusterCount, self.ClusterCount0MismatchBarcode, - self.ClusterCount1MismatchBarcode, self.QualityScoreSum) - -class sample: - def __init__(self, Lane = 0, Sample = '', Barcode = '', Tile = '', Read = '', rawqc = qcValues([]), - pfqc = qcValues([]), *args, **kwargs): - self.Lane = Lane - self.Sample = Sample - self.Barcode = Barcode - self.Tile = Tile - self.Read = Read - self.rawqc = rawqc - self.pfqc = pfqc - - def __str__(self): - return "Lane: %s, Sample: %s, Barcode: %s, Tile: %s, Read: %s, rawqc: %s, pfqc: %s" \ - % (self.Lane, self.Sample, self.Barcode, self.Tile, self.Read, self.rawqc, self.pfqc) - -# ----------------------------------------------------------------------------- - -class Statistics: - def __init__(self, lane = 0, sampleName = "", index1 = "NoIndex", index2 = "NoIndex", pfYieldSum = 0, - rawYieldSum = 0, pfPercentage = 0.0, rawReadsSum = 0, pfReadsSum = 0, - pfYieldQ30Sum = 0, qualityScoreSum = 0, rawPercentageReadsPerLane = 0.0, - pfYieldQ30Percentage = 0.0, pfsumQualityScore = 0, pfmeanQualityScore = 0.0, - pfReadsSumWithoutUndetermined = 0): - self.lane = lane - self.sampleName = sampleName - self.index1 = index1 - self.index2 = index2 - self.pfYieldSum = pfYieldSum - self.rawYieldSum = rawYieldSum - self.pfPercentage = pfPercentage - self.rawReadsSum = rawReadsSum - self.pfReadsSum = pfReadsSum - self.pfYieldQ30Sum = pfYieldQ30Sum - self.qualityScoreSum = qualityScoreSum - self.rawPercentageReadsPerLane = rawPercentageReadsPerLane - self.pfYieldQ30Percentage = pfYieldQ30Percentage - self.pfsumQualityScore = pfsumQualityScore - self.pfmeanQualityScore = pfmeanQualityScore - self.pfReadsSumWithoutUndetermined = pfReadsSumWithoutUndetermined - - def __str__(self): - return "lane: %s, sampleName: %s, index1: %s, index2: %s, pfYieldSum: %s, pfPercentage: %s," \ - " rawReadsSum: %s, pfReadsSum: %s," \ - " rawPercentageReadsPerLane: %s, pfYieldQ30Percentage: %s," \ - " pfmeanQualityScore: %s" \ - % (self.lane, self.sampleName, self.index1, self.index2, self.pfYieldSum, self.pfPercentage, - self.rawReadsSum, self.pfReadsSum, - self.rawPercentageReadsPerLane, self.pfYieldQ30Percentage, self.pfmeanQualityScore) - - def calculatePercentagePF (self, rawYield = 0, pfYield = 1): - try: - return round(float(pfYield) / float(rawYield) * 100, 2) - except: - return 0.0 - - def calulateMeanQualityScore (self, pfqualityScoreSum = 0, pfYield = 1): - try: - return round (float(pfqualityScoreSum) / float(pfYield), 2) - except: - return 0.0 - - def calculateYieldQ30Percentage (self, pfYieldQ30 = 0, pfYield = 1): - try: - return round (float(pfYieldQ30) / float(pfYield) * 100, 2) - except: - return 0.0 - - -class lane_statistics: - def __init__(self): - self.complete_lane_statistic = Statistics() - - def caluclate_complete_lane_statistic(self, list_of_statistics): - - sample_number = len(list_of_statistics) - - for stat in list_of_statistics: - self.complete_lane_statistic.lane = stat.lane - self.complete_lane_statistic.pfYieldSum += stat.pfYieldSum - self.complete_lane_statistic.rawYieldSum += stat.rawYieldSum - self.complete_lane_statistic.pfReadsSum += stat.pfReadsSum - self.complete_lane_statistic.rawReadsSum += stat.rawReadsSum - self.complete_lane_statistic.pfPercentage += stat.pfPercentage - self.complete_lane_statistic.pfYieldQ30Percentage += stat.pfYieldQ30Percentage - self.complete_lane_statistic.pfmeanQualityScore += stat.pfmeanQualityScore - - if stat.index1 != "Undetermined": - self.complete_lane_statistic.pfReadsSumWithoutUndetermined += stat.pfReadsSum - - self.complete_lane_statistic.pfPercentage = self.complete_lane_statistic.pfPercentage / sample_number - self.complete_lane_statistic.pfYieldQ30Percentage = self.complete_lane_statistic.pfYieldQ30Percentage / sample_number - self.complete_lane_statistic.pfmeanQualityScore = self.complete_lane_statistic.pfmeanQualityScore/ sample_number - - return self.complete_lane_statistic - -# ----------------------------------------------------------------------------- - -def xml2Memory(DEMULTIPLEX_XML): - ''' - Parse the XML file and put all values in a memory structure: - List of: - lane, sample, barcode, tile, read, qcRawList, qcPfList - ''' - - RAW_TAG = "Raw" - PF_TAG = "Pf" - - sampleList = [] - - xml = parseXmlFile(DEMULTIPLEX_XML) - r = xml.tree.getroot() - - for lane in r.getchildren(): - for mysample in lane: - for barcode in mysample: - for tile in barcode: - for read in tile: - - qcRaw = qcValues() - qcPf = qcValues() - qcRawList = [] - qcPfList = [] - - # Read out the Raw fields - raw = read.find(RAW_TAG) - for child in raw.getchildren(): - # equivalent to a Java reflection - setattr(qcRaw, child.tag, int(child.text)) - - # Read out the Pf fields - pf = read.find(PF_TAG) - for child in pf.getchildren(): - # equivalent to a Java reflection - setattr(qcPf, child.tag, int(child.text)) - - qcRawList.append(qcRaw) - qcPfList.append(qcPf) - - singleElement = sample () - - setattr(singleElement, lane.tag, lane.attrib) - setattr(singleElement, mysample.tag, mysample.attrib) - setattr(singleElement, barcode.tag, barcode.attrib) - setattr(singleElement, tile.tag, tile.attrib) - setattr(singleElement, read.tag, read.attrib) - singleElement.rawqc = qcRawList - singleElement.pfqc = qcPfList - - sampleList.append(singleElement) - return sampleList - -# ----------------------------------------------------------------------------- - -def calculateStatistics(listofSamples): - ''' - Structure of 'listofSamples' - Lane: {'index': '6'}, Sample: {'index': 'BSSE-QGF-3524_C0NKPACXX'}, Barcode: {'index': 'TGACCA'}, - Tile: {'index': '2307'}, Read: {'index': '1'}, rawqc:<mem>, pfqc:<mem> - ''' - - numberOfTiles = len(listofSamples) - - tile = sample() - raw = qcValues () - pf = qcValues () - stats = Statistics() - - for tile in listofSamples: - raw = tile.rawqc[0] - pf = tile.pfqc[0] - - stats.pfYieldSum += pf.Yield - stats.rawYieldSum += raw.Yield - stats.rawReadsSum += raw.ClusterCount - stats.pfReadsSum += pf.ClusterCount - stats.pfYieldQ30Sum += pf.YieldQ30 - stats.qualityScoreSum += pf.QualityScoreSum - - # Can not be set here, needs to be calculated later - #stats.rawPercentageReadsPerLane = rawPercentageReadsPerLane - stats.pfPercentage = stats.calculatePercentagePF(stats.rawYieldSum, stats.pfYieldSum) - stats.pfYieldQ30Percentage = stats.calculateYieldQ30Percentage(stats.pfYieldQ30Sum, stats.pfYieldSum) - stats.pfmeanQualityScore = stats.calulateMeanQualityScore(stats.qualityScoreSum, stats.pfYieldSum) - stats.lane = listofSamples[0].Lane.values()[0] - stats.sampleName = listofSamples[0].Sample.values()[0] - index = listofSamples[0].Barcode.values()[0] - try: - stats.index1, stats.index2 = index.split("-") - except: - stats.index1 = index - return stats - -# ----------------------------------------------------------------------------- - - -def rawReadSumPerSamples(stat): - ''' - Creates a dictionary with the lanes as keys - The values are a list where the elements are a dictionary again. - This dictionary has the sample names as key and the RawReadSum as value. - - Example: - {4': [{'BSSE-QGF-3434_C0NKPACXX': 248999502}], '7': [{'lane7': 123921974}, - {'BSSE-QGF-3527_C0NKPACXX': 38587703}, {'BSSE-QGF-3529_C0NKPACXX': 30130893}, - {'BSSE-QGF-3528_C0NKPACXX': 34519296}, {'BSSE-QGF-3526_C0NKPACXX': 34980179}]} - ''' - - laneDict = {} - for e in stat: - if e.lane not in laneDict: - laneDict[e.lane] = [{e.sampleName:e.rawReadsSum}] - else: - laneDict[e.lane].append({e.sampleName:e.rawReadsSum}) - return laneDict - -# ----------------------------------------------------------------------------- - -def createSumRawReadsPerLane(laneDict): - ''' - Creates a dictionary with lane as key and sum of Raw Reads as value: - {'1': 183180877, '3': 244968562, '2': 191496395, '5': 193466239, '4': 248999502, - '7': 262140045, '6': 257136830, '8': 209948449} - ''' - sumRawReadsDict = {} - for lane in laneDict: - sumRawReads = 0 - for sampleNameDict in laneDict[lane]: - sumRawReads += sampleNameDict.values()[0] - - sumRawReadsDict[lane] = sumRawReads - return sumRawReadsDict - -# ----------------------------------------------------------------------------- - -def createPercentagePerLane(laneDict, sumRawReadsDict): - ''' - Creates a dictionary with the sample Name as key and the percentage of raw reads related to - all reads in the same lane - {'lane7': 47.27, 'BSSE-QGF-3433_C0NKPACXX': 100.0, 'BSSE-QGF-3666_C0NKPACXX': 54.12} - ''' - - relRawReadsDict = {} - for lane in laneDict: - for sampleName in laneDict[lane]: - relRawReadsDict[sampleName.keys()[0]] = round(float(sampleName.values()[0]) / - float(sumRawReadsDict[lane]) * 100, 2) - return relRawReadsDict - -# ----------------------------------------------------------------------------- - -def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below - supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - -# ----------------------------------------------------------------------------- - -def getVocabulary(transaction, vocabularyCode): - - vocabularyTermList = [] - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - if (vocabulary is None): - print 'VOCABULARY %s does not exist' % (vocabularyCode) - else: - print "Getting VOCABULARY: " + vocabulary.getCode() - for term in vocabulary.getTerms(): - vocabularyTermList.append(term.getCode()) - vocabularyTermList.sort() - return vocabularyTermList - -# ----------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction,flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + \ - ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property.getValue() - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -def getIndexesofDataSetsofSample(transaction, sample, DATA_SET_TYPE): - - index1List = [] - index2List = [] - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - for ds in foundDataSets: - index1List.append(ds.getPropertyValue('BARCODE')) - index2List.append(ds.getPropertyValue('INDEX2')) - return index1List, index2List - -def searchDataSetsofSample(transaction, sample, index1, index2, DATA_SET_TYPE): - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - - dataSetSc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - #dataSetSc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DATA_SET_TYPE)) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("BARCODE", index1 )) - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("INDEX2", index2)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - print "foundDataSets.size() "+ str(foundDataSets.size()) - for ds in foundDataSets: - print "Index1 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('BARCODE') - print "Index2 for found Data Set" + ds.getDataSetCode() + " " + ds.getPropertyValue('INDEX2') - - return foundDataSets - -def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - foundSample = search_service.searchForSamples(sc) - if foundSample.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - numberOfLanes = foundContainedSamples.size() - return foundSample, foundContainedSamples, numberOfLanes - -# ----------------------------------------------------------------------------- - -def process(transaction): - ''' - Main - ''' - - FASTQ_DATA_SET_TYPE='FASTQ_GZ' - DEMUX_FILE='Flowcell_demux_summary.xml' - NO_INDEX='NOINDEX' - UNDETERMINED='UNDETERMINED' - - incomingPath = transaction.getIncoming().getPath() - name, laneNumber = transaction.getIncoming().getName().split('-') - - print('\n'+time.ctime()) - - fcPropertiesDict, fcPropertyTypes = getFlowCellMetaData(transaction, name) - print fcPropertiesDict - print fcPropertyTypes - - search_service = transaction.getSearchService() - - FileGenerator= locate(DEMUX_FILE, incomingPath) - DEMULTIPLEX_XML = FileGenerator.next() - - sampleList = xml2Memory(DEMULTIPLEX_XML) - - sa = sample() - sampleDict = {} - print ("Length List samples x tiles x surface: " + str(len(sampleList))) - - # key = sample name, value = sample() - for element in range(0, len(sampleList)): - sa = sampleList[element] - # Check if new sample - if (sa.Sample is not sampleList[element - 1].Sample): - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - print(sampleName) - else: - try: - sampleDict[sampleName].append(sa) - except: - sampleName = sa.Sample.values()[0] - sampleDict[sampleName] = [sa] - - stat = [calculateStatistics(sampleDict[mysample]) for mysample in sampleDict] - - # calculate the relative amount of reads per index - laneDict = rawReadSumPerSamples(stat) - sumRawReadsDict = createSumRawReadsPerLane(laneDict) - relRawReadsDict = createPercentagePerLane(laneDict, sumRawReadsDict) - - # set the values in the object - for mye in stat: - mye.rawPercentageReadsPerLane = relRawReadsDict[mye.sampleName] - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, name) - - index1Length = fcPropertiesDict['INDEXREAD'] - index2Length = fcPropertiesDict['INDEXREAD2'] - - full_lane_statistics = lane_statistics() - complete_lane_statistic = full_lane_statistics.caluclate_complete_lane_statistic(stat) - - for lane in lanes: - if laneNumber == lane.getSampleIdentifier().split(":")[-1]: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - break - - mutable_lane.setPropertyValue("YIELD_MBASES", str(complete_lane_statistic.pfYieldSum)) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(complete_lane_statistic.rawYieldSum)) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(complete_lane_statistic.pfPercentage)) - mutable_lane.setPropertyValue('PF_READS_SUM',str(complete_lane_statistic.pfReadsSum)) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(complete_lane_statistic.rawReadsSum)) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(complete_lane_statistic.pfYieldQ30Percentage)) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(complete_lane_statistic.pfmeanQualityScore)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(complete_lane_statistic.pfReadsSumWithoutUndetermined)) - - for mystat in stat: - laneCode = flowcell[0].getCode() + ":" + mystat.lane - searchIndex1 = mystat.index1.upper() - searchIndex2 = mystat.index2.upper() - print '\n' - print mystat - - index1List, index2List = getIndexesofDataSetsofSample(transaction, laneCode, FASTQ_DATA_SET_TYPE) - print "Searching for "+ searchIndex1 + " in " + str(index1List) - print "Searching for "+ searchIndex2 + " in " + str(index2List) - - if searchIndex1 not in (NO_INDEX): - if searchIndex1 not in (UNDETERMINED): - if index1Length > 7: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1] - else: - searchIndex1 = [ index1 for index1 in index1List if searchIndex1 in index1[:-1]] - try: - if len(searchIndex1) > 1: - print("AMBIGIOUS INDEX FOUND!") - print(searchIndex1) - if searchIndex1[0].startswith(mystat.index1.upper()): - searchIndex1 = searchIndex1[0] - else: - searchIndex1 = searchIndex1[1] - else: - searchIndex1 = searchIndex1[0] - - except: - searchIndex1 = 'MISSING' - else: - searchIndex1 = NO_INDEX - if searchIndex2 not in (NO_INDEX): - if searchIndex2 not in (UNDETERMINED): - if index2Length > 7: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2] - else: - searchIndex2 = [ index2 for index2 in index2List if searchIndex2 in index2[:-1]] - try: - searchIndex2 = searchIndex2[0] - except: - searchIndex1 = 'MISSING' - else: - searchIndex2 = NO_INDEX - - print "searchIndex1 " + str(searchIndex1) - print "searchIndex2 " + str(searchIndex2) - - # Search for a data set with those two indices - DataSet = searchDataSetsofSample(transaction, laneCode, searchIndex1, searchIndex2, FASTQ_DATA_SET_TYPE) - try: - assert DataSet.size() == 1 - except AssertionError: - print (str(DataSet.size()) + ' data sets found which match the criterias: '+ - str(laneCode), searchIndex1, searchIndex2) - continue - - sa = transaction.getDataSetForUpdate(DataSet[0].getDataSetCode()) - sa.setPropertyValue('YIELD_MBASES', str(mystat.pfYieldSum)) - sa.setPropertyValue('RAW_YIELD_MBASES', str(mystat.rawYieldSum)) - sa.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(mystat.pfPercentage)) - sa.setPropertyValue('PF_READS_SUM',str(mystat.pfReadsSum)) - sa.setPropertyValue('RAW_READS_SUM',str(mystat.rawReadsSum)) - sa.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(mystat.rawPercentageReadsPerLane)) - sa.setPropertyValue('PFYIELDQ30PERCENTAGE', str(mystat.pfYieldQ30Percentage)) - sa.setPropertyValue('PFMEANQUALITYSCORE', str(mystat.pfmeanQualityScore)) - - print "Modified data sets properties of: " + DataSet[0].getDataSetCode() - - print "DONE" diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index 2c8f40225a2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index c701f27f3d6..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -MarkerGAComplete = 'RTAComplete.txt' -MarkerHiSeqComplete = 'RTAComplete.txt' -MarkerNextSeqComplete = 'RTAComplete.txt' - -def createOpenbisTimeStamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - # Get the incoming name - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - if (split[1].startswith("NS")): - Markerfile = incomingPath + "/" + MarkerNextSeqComplete - name = split[-1][1:] - else: - IS_HISEQ_RUN=True - Markerfile = incomingPath + "/" + MarkerHiSeqComplete - if (len(split) == 2): - Markerfile = incomingPath + "/" + MarkerGAComplete - - # Search for the sample and check if there is already sample with this name - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", createOpenbisTimeStamp(Markerfile)) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties deleted file mode 100644 index d6e67945db5..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py deleted file mode 100644 index 34ff5e55af1..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-basecall-stats/register-basecall-stats.py +++ /dev/null @@ -1,51 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - runFolder = transaction.getIncoming().getName() - flowCellId = runFolder.split("_")[-1][1:] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("NEXTSEQ_BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties deleted file mode 100644 index 2ee11974590..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-bee -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bee.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py deleted file mode 100644 index 65def2a0afb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bee/register-bee.py +++ /dev/null @@ -1,64 +0,0 @@ -from __future__ import with_statement -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -def process (transaction): - - - DATA_SET_TYPE_ALIGNMENT = "ALIGNMENT" - ETHZ_DOMAIN = "@ethz.ch" - METADATA_FILE='metadata.properties' - - def searchDs(transaction, dscode): - # search for the data set - search_service = transaction.getSearchService(); - sc = SearchCriteria(); - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc); - assert (myds.size() == 1); - return myds; - - # Search for parent data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - path = transaction.getIncoming().getAbsolutePath() - - myvars = {} - with open(os.path.join(path, METADATA_FILE)) as myfile: - for line in myfile: - name, var = line.partition("=")[::2] - myvars[name.strip()] = var - print myvars - userId = myvars['analysis_procedure'].split()[-1][1:-1] - dsCode = myvars['storage_provider.parent.dataset.id'] - print userId - print dsCode - - if (not "@" in userId): - userId = userId + ETHZ_DOMAIN; - - userMail = EMailAddress(userId) - - existingDs = searchDs(transaction, dsCode); - print existingDs - firstDs = existingDs.get(0); - - newDataSet = transaction.createNewDataSet(DATA_SET_TYPE_ALIGNMENT); - experiment = firstDs.getExperiment(); - - newDataSet.setParentDatasets([ds.getDataSetCode() for ds in existingDs]) - newDataSet.setExperiment(experiment); - transaction.moveFile(transaction.getIncoming().getAbsolutePath(), newDataSet); - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - - # transaction.getGlobalState().getMailClient().sendEmailMessage(subject, content, replyToOrNull, fromOrNull, recipients) - transaction.getGlobalState().getMailClient().sendEmailMessage("openBIS Bee cluster job finished", - "Result data for " + dsCode + " got registered in openBIS.", replyTo, fromAddress, userMail); diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties deleted file mode 100644 index 26d6bb1da8d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bigwig/ -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bigwig.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py deleted file mode 100755 index 31a0863709f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bigwig/register-bigwig.py +++ /dev/null @@ -1,140 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bigwig/' -BIGWIGINFO='/links/application/dsu/bigWig/bigWigInfo ' -BW_PATTERN='*.bw' - -matches = [] - -# ----------------------------------------------------------------------------- - -def listSearch (myList, searchString): - ''' - Searches for a given String in a list. - Only lines matching the start of a line a considerd as a match - ''' - matches = [] - for i in range (0, len(myList)): - if(re.match(searchString, myList[i])): - matches.append(myList[i]) - return (matches) - -# ----------------------------------------------------------------------------- - -def translateBoolean (value): - if (value.lower() == 'yes') | (value.lower() =='y'): - return True - else: - return False - -def sanitizeInt (intNumber): - return intNumber.replace(',','') - -# ----------------------------------------------------------------------------- - -def convertListToDict(prop): - d={} - for i in range(0,len(prop)-1): - lineSplit = prop[i].split(':') - d[lineSplit[0].strip()] = lineSplit[1].strip() - return(d) - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BIGWIGGLE") - dataSet.setMeasuredData(False) - - # expected: - # Project_110907_SN792_0059_AC012FACXX_3/BSSE-DSU-1662_CGATGTA_L003_R1_001_sorted.bw - split=name.split('_') - if (len(split) == 6): - incoming_sample=split[1]+ '_'+ split[2] + '_' + split[3] + '_' + split[4]+ ':' + split[-1] - if (len(split) ==4): - incoming_sample=split[1]+ '_'+ split[2] + ':' + split[-1] - - # Looking for BWs: - for root, dirnames, filenames in os.walk(FOLDER + name): - for filename in fnmatch.filter(filenames, BW_PATTERN): - matches.append(os.path.join(root, filename)) - - # Extract values from a samtools view and set the results as DataSet properties - # Command: samtools view -H ETHZ_BSSE_110429_63558AAXX_1_sorted.bam - - arguments = BIGWIGINFO + matches[0] - #print('Arguments: '+ arguments) - cmdResult=os.popen(arguments).read() - - properties=cmdResult.split("\n") - dictProp = convertListToDict(properties) - #print(dictProp) - - dataSet.setPropertyValue("VERSION", dictProp['version']) - dataSet.setPropertyValue("ISCOMPRESSED", str(translateBoolean(dictProp['isCompressed']))) - dataSet.setPropertyValue("ISSWAPPED", dictProp['isSwapped']) - dataSet.setPropertyValue("PRIMARYDATASIZE", sanitizeInt(dictProp['primaryDataSize'])) - dataSet.setPropertyValue("PRIMARYINDEXSIZE", sanitizeInt(dictProp['primaryIndexSize'])) - dataSet.setPropertyValue("ZOOMLEVELS", dictProp['zoomLevels']) - dataSet.setPropertyValue("CHROMCOUNT", dictProp['chromCount']) - dataSet.setPropertyValue("BASESCOVERED", sanitizeInt(dictProp['basesCovered'])) - dataSet.setPropertyValue("MEAN", dictProp['mean']) - dataSet.setPropertyValue("MIN", dictProp['min']) - dataSet.setPropertyValue("MAX", dictProp['max']) - dataSet.setPropertyValue("STD", dictProp['std']) - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for parent data set of the same sample - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'FASTQ_GZ')) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties deleted file mode 100644 index f0fac2c142a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-bowtie -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-bowtie.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py deleted file mode 100644 index 0e8f218b29b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-bowtie/register-bowtie.py +++ /dev/null @@ -1,40 +0,0 @@ -''' -This is handling bowtie-BAM files and extracts some properties from the BAM header and -the samtools flagstat command. The results are formatted and attached as a property -to the openBIS DataSet. -Prerequisites are the DataSetType: ALIGNMENT and -the following properties assigned to the DataSetType mentioned above: -ALIGNMENT_SOFTWARE, ISSUED_COMMAND, SAMTOOLS_FLAGSTAT, -TOTAL_READS, MAPPED_READS - -Obviously you need a working samtools binary - -Uses 'flagstat' and 'view -H' -''' - -import os -import fnmatch -import re -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -FOLDER='/links/shared/dsu/dss/register-bowtie/' -SAMTOOLS='/links/application/dsu/samtools/samtools' -BAM_PATTERN='*.bam' - -matches = [] -searchStrings = ['@PG'] -programList = [] - -# ----------------------------------------------------------------------------- - -def process(transaction): - - incomingPath = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - - matches.append(incomingPath) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/AlignmentJavaDataSetRegistrationDropboxV2.jar deleted file mode 100644 index 6b0737361eb622ffefb0267e2fa778eadb2bea9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3750 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 Br8xiq diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv deleted file mode 100644 index 118b26512a0893928a450b3b6e90e475ad11ff84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/lib/alignment.jar.sv2 deleted file mode 100644 index 118b26512a0893928a450b3b6e90e475ad11ff84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties deleted file mode 100644 index 35b2b5253d0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-cluster-alignment-java/plugin.properties +++ /dev/null @@ -1,7 +0,0 @@ -incoming-dir = ${root}/dss/register-cluster-alignment-java -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JavaTopLevelDataSetHandlerV2 -program-class = ch.systemsx.cisd.etlserver.registrator.api.v2.AlignmentJavaDataSetRegistrationDropboxV2 -#program-class = AlignmentJavaDataSetRegistrationDropboxV2 -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -incoming-dir-create = true -incoming-data-completeness-condition = auto-detection diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties deleted file mode 100644 index ad9cc236b38..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-dummy -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-dummy.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py deleted file mode 100644 index 01a2eec1e4f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-dummy/register-dummy.py +++ /dev/null @@ -1,56 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def splitFolderName (folderName): - runFolder, lane = folderName.rsplit("_", 1) - return runFolder + ":" + lane - -def searchSample (transaction, sampleCode): - # Get the search service - search_service = transaction.getSearchService() - - print("Searching for " + sampleCode) - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - assert(len(foundSamples), 1) - return foundSamples[0] - -def process(transaction): - - # expected incoming folder names: - # 120917_SN792_0158_AC125KACXX_4 - - incomingFolder = transaction.getIncoming().getName() - flowLaneName = splitFolderName(incomingFolder) - flowLane = searchSample(transaction, flowLaneName) - - dataSet = transaction.createNewDataSet("ALIGNMENT") - dataSet.setMeasuredData(False) - dataSet.setSample(flowLane) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 353a2b7aa8a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index d538798b932..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,82 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -Expects as incoming folder: Project_120427_SN792_0110_AD0YCGACXX_1 - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def renameFiles(dir, flowcellName): - print dir - print flowcellName - for root, dirs, files in os.walk(dir): - for file in files: - print root + file - os.rename(root + '/' + file, root + "/" + flowcellName + "_" + file) - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - if (len(incomingFolder.split("_")) == 2): - flowCell, flowLane = incomingFolder.split("_") - else: - fcAndLane = incomingFolder.split("_",1)[-1] - flowCell, flowLane = fcAndLane.rsplit("_",1) - - nameLength = len(flowCell.split('_')) - if nameLength == 5: - flowCell = '-'.join(flowCell.rsplit('_',1)) - - print flowCell - print flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCell)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - for indx in range(0, len(foundContainedSamples)): - lane = foundContainedSamples[indx].getCode().split(':')[-1] - print lane - if (flowLane == lane): - dataSet.setSample(foundContainedSamples[indx]) - # Add the incoming file into the data set - transaction.moveFile(incomingPath + "/fastqc/", dataSet) - break diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties deleted file mode 100644 index 8730e628162..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-hiseq -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py deleted file mode 100644 index 62ab3d79aa3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-hiseq/register-flowcell-hiseq.py +++ /dev/null @@ -1,61 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import subprocess -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - args = ['/links/application/dsu/export_QGF_master_data/export_QGF_master_data.sh'] - - try: - p = subprocess.Popen(args, stdout=subprocess.PIPE) - print(p.communicate()[0]) - except: - print("Could not run: " + str(args)) - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - if (len(split) == 4): - dataSet = transaction.createNewDataSet("ILLUMINA_HISEQ_OUTPUT") - - dataSet.setMeasuredData(False) - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties deleted file mode 100644 index 7f274a70db5..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py deleted file mode 100644 index c9321e6c87e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-miseq/register-flowcell-miseq.py +++ /dev/null @@ -1,60 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_MISEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - flowCellId = transaction.getIncoming().getName() - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties deleted file mode 100644 index 29183e5d548..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-flowcell-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py deleted file mode 100644 index 8f70c8c817e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell-nextseq/register-flowcell-nextseq.py +++ /dev/null @@ -1,62 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for MiSeq runs: 120726_M00721_0011_A000000000-A1FVF - -@author: -Manuel Kohler -''' - -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -DATASET_TYPE_MISEQ = "ILLUMINA_NEXTSEQ_OUTPUT" - -def process(transaction): - - incomingPath = transaction.getIncoming().getAbsolutePath() - runFolder = transaction.getIncoming().getName() - flowCellId = runFolder.split("_")[-1][1:] - dataSet = transaction.createNewDataSet(DATASET_TYPE_MISEQ) - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - print("Searching for flowcell: " + flowCellId) - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search_service.searchForSamples(sc) - - # Make sure there is only one Flow cell registered with this Flow Cell Name / ID - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - print (foundFlowCells) - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundFlowCells[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 82d34c7fd9f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py deleted file mode 100644 index 2f712bfd794..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowcell/register-flowcell.py +++ /dev/null @@ -1,106 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -ILLUMINA_HISEQ_OUTPUT_DS_TYPE = "ILLUMINA_HISEQ_OUTPUT" -ILLUMINA_MISEQ_OUTPUT_DS_TYPE = "ILLUMINA_MISEQ_OUTPUT" -ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE = "ILLUMINA_NEXTSEQ_OUTPUT" - - -def get_bcl_version(file): - pattern = re.compile("bcl2fastq") - matching_line_list = [] - bcl_version = "Not specified" - number_of_lines_to_read = 3 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(pattern, line): - matching_line_list.append(line) - else: - print("File " + str(file) + " not found!") - - if matching_line_list: - bcl_version = matching_line_list[0].strip() - return bcl_version - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - if model in HISEQ_LIST: - DATASET_TYPE = ILLUMINA_HISEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.NEXTSEQ_500]: - DATASET_TYPE = ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.MISEQ]: - DATASET_TYPE = ILLUMINA_MISEQ_OUTPUT_DS_TYPE - else: - print("Could set a data set type for flowcell data!") - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - file = glob.glob(os.path.join(incoming_path, "nohup*")) - bcl_version = get_bcl_version(file) - - found_flow_cell = search_unique_sample(transaction, fc_id) - - search_service = transaction.getSearchService() - get_flowcell_with_contained_samples = search_service.getSample(found_flow_cell[0].getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("BCL_VERSION", bcl_version) - - dataSet = transaction.createNewDataSet(DATASET_TYPE) - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_flow_cell[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f6..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties deleted file mode 100644 index 8f519c1de0b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowlane -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowlane.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py deleted file mode 100644 index 073256eee86..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-flowlane/register-flowlane.py +++ /dev/null @@ -1,360 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - - -import os -import shutil -import re -import subprocess -from collections import OrderedDict -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -CRC32_PATH='lib/a.out' - - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - - - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + - sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (sample_space, meta_data_file_name, destinationFolder) - - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/Users/kohleman/tmp/scicore' - #dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX", "BIOZENTRUM_SPANG", - "BIOZENTRUM_JENAL"] - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - else: - print(sample_space + " not in SPACE_LIST. Sample will not be copied to BC2.") - - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - ordered_sample_properties_dict = OrderedDict(sorted(sample_properties_dict.items(), key=lambda t: t[0])) - return ordered_sample_properties_dict - - -def searchParents (search_service, parents): - - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, sample_space, undetermined): - - for file in fastq_files: - extraCopySciCore (sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - elif (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = '1' - undetermined = True - - # MiSeq BSSE_QGF_36097_000000000_AH4PH_1 - elif (len(split) == 6): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = '-'.join([split[3],split[4]]) - flowLane = split[-1] - undetermined = False - - #MiSeq Undetermined_000000000_AH4PH_1 - elif (len(split) == 4): - sample_code = '' - flowCellId = '-'.join([split[1], split[2]]) - flowLane = split[-1] - undetermined = True - else: - print("Expected different naming schema!") - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - - -def process_regular_samples(transaction, name, sample_code, flowLane, fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet): - foundSample = search_unique_sample(transaction, sample_code) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print "sequencing_sample_code: " + sequencing_sample_code - sequencing_sample_properties_dict = get_sample_properties(transaction, foundSample[0]) - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - sample_space = foundSample[0].getSpace() - filepart, suffix = first_fastq_file.split('.', 1) - meta_data_file_name = filepart.rsplit('_', 2)[0] + METADATA_FILE_SUFFIX - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, fastq_files, flowLane) - - return fastq_files, sample_space - - -def process_undetermined(transaction, undetermined, name, flowCellId, flowLane, fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet): - sample_space = "" - newFastqFiles = [] - lane_parents = searchParents(search_service, parents) - print "Found " + str(lane_parents.size()) + " parents" - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties(transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL" - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1] == 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2] == 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print 'NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID + ', probably a pool: ' + sample_code - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - - else: - print sample_code + ": Create parent meta data file" - meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, experiment, sample_space, [], flowLane) - - return newFastqFiles, sample_space - -def process(transaction): - - undetermined = False - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - # get all fastqs - fastq_files = get_file_names(incomingPath, FASTQ_GZ_PATTERN) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - search_service = transaction.getSearchService() - - flowcell_sample_immutable = search_unique_sample (transaction, flowCellId) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - flow_lane_immutable = search_unique_sample (transaction, incoming_sample) - - sample = flow_lane_immutable[0].getSample() - parents = sample.getParents() - - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,name) - - if undetermined: - fastq_files, sample_space = process_undetermined(transaction, undetermined, name, flowCellId, flowLane, - fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet) - else: - fastq_files, sample_space = process_regular_samples(transaction, name, sample_code, flowLane, - fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet) - - put_files_to_dataset (transaction, dataSet, fastq_files, name, flowCellId, sample_space, undetermined) - - sa = transaction.getSampleForUpdate(flow_lane_immutable[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - dataSet.setSample(flow_lane_immutable[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10567 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 DMv_I6 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties deleted file mode 100644 index f7523f7cdec..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py deleted file mode 100755 index 05bd0e2ee55..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-hiseq/register-lane-hiseq.py +++ /dev/null @@ -1,493 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import re -import fnmatch -import time -import shutil -import tempfile -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -CRC32_PATH='lib/crc32' -#CRC32_PATH='lib/a.out' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -# ------------------------------------------------------------------------------- - -def CRC32_from_file(filename, transaction): - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def writeMetadataFile (transaction, fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, - experiment, fastqFileList, flowLane): - ''' - Writes a file of meta date related to one sample - ''' - - fastqFileList.sort() - - expId = experiment.getIdentifier() - try: - meta_data_file = open(fileName,'w') - for propertyType in parentPropertyTypes: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(parentPropertiesMap[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ fileName) - finally: - meta_data_file.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' or affiliation_name == 'SWISS_TPH'): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - dirname = '' - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX"] - - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box/' - #dropBoxFolder = '/Users/kohleman/tmp/scicore' - basename = os.path.basename(filePath) - - splits = basename.split('_') - folderName = "_".join(splits[0:8]) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, folderName) - if destinationFolder: - shutil.copy(filePath, destinationFolder) - else: - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(filePath, dirname) - print("Copied " + basename + " to " + dropBoxFolder + "\n") - return dirname - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - ''' - Searches for all parents and returns a java.util.List<ISampleImmutable> - ''' - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def getProperties (foundParent, fcMetaDataDict): - ''' - - ''' - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - parentSampleType = parent.getSampleType() - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - - parentPropertyTypes.append(SAMPLE_TYPE) - parentPropertyTypes.append(SAMPLE_CODE) - parentPropertiesMap[SAMPLE_TYPE] = parentSampleType - parentPropertiesMap[SAMPLE_CODE] = parentCode - experiment = parent.getExperiment() - - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - i2Length = int(fcMetaDataDict['INDEXREAD2'].tryGetAsString().encode('utf-8')) - if i2Length > 0: - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - else: - index2 = DEFAULT_INDEX - - completeBarcode=barcode + "-" + index2 - parentPropertyTypes.sort() - #print("parentPropertiesMap") - #print(parentPropertiesMap) - return parentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode - -# ------------------------------------------------------------------------------- - -def createMetDataFileName (parentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX): - return parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + flowLane +METADATA_FILE_SUFFIX - -# ------------------------------------------------------------------------------- - -def process(transaction): - - EXPERIMENT_CODE = 'EXPERIMENT' - - # useful for debugging: - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_110715_SN792_0054_BC035RACXX_1 - split=name.split("_") - if (len(split) == 6): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - hiseqTray = split[4][0] - flowCellId = split[4][1:] - flowLane = split[-1] - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - - # ------------------------------------------------------------------------------- - - flowcell_sample_immutable = searchSample (runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + hiseqTray + flowCellId , search_service) - fcMetaDataDict_NEW = get_sample_properties(transaction, flowcell_sample_immutable[0]) - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - - def addExternalSampleName (fastqFileList, usableExternalSampleName): - externalNamesFastqFileDict = {} - - for file in fastqFileList: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - sanitizedExternalSampleName = sanitizeString(usableExternalSampleName) - if sanitizedExternalSampleName: - newFile = folder + "/" + filepart + "_" + sanitizedExternalSampleName + "." + suffix - else: - newFile = file - externalNamesFastqFileDict[file] = newFile - return externalNamesFastqFileDict - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - - dataSet.setSample(foundSamples[0]) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - usableExternalSampleName = "EXTERNAL_NAME" - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - - parentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - nameOfFile = createMetDataFileName (parentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - #print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - #print "Folder split: " + folderSplit - #print str(parentCode) - organism = parentPropertiesMap['NCBI_ORGANISM_TAXONOMY'].tryGetAsString().split(":")[-1].strip() - - if (parentCode == folderSplit): - sample_space = foundParent.getSpace() - - externalSampleName = parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - lengthLimit = 30 - if len(externalSampleName) > lengthLimit: - usableExternalSampleName = externalSampleName[0:lengthLimit] - else: - usableExternalSampleName = externalSampleName - - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + \ - flowLane + "_" + sanitizeString(usableExternalSampleName) + METADATA_FILE_SUFFIX - - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - - for extFileNameFastQ in externalNamesFastqFileDict: - print ("RENAME file " + str(os.path.basename(extFileNameFastQ)) + " TO " + str(os.path.basename(externalNamesFastqFileDict[extFileNameFastQ]))) - os.rename(extFileNameFastQ, externalNamesFastqFileDict[extFileNameFastQ]) - destinationFolder = '' - extraCopySciCore (sample_space, externalNamesFastqFileDict[extFileNameFastQ], destinationFolder) - - writeMetadataFile(transaction, pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, externalNamesFastqFileDict.values(), flowLane) - extraCopySciCore (sample_space, pathToFile) - - for extFileNameFastQ in externalNamesFastqFileDict: - transaction.moveFile(externalNamesFastqFileDict[extFileNameFastQ] , dataSet, folders[f]) - - # Undetermined files ################################# - elif (folderSplit.startswith('lane') and barcode == "NoIndex" and index2 == "NoIndex" and organism !='10847'): - usableExternalSampleName = "" - print("********************** Creating metadata file for Undetermined:" + nameOfFile) - - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - writeMetadataFile(transaction, pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, externalNamesFastqFileDict.values(), flowLane) - - sample_space = foundParent.getSpace() - dirName = extraCopySciCore (sample_space, pathToFile) - - externalNamesFastqFileDict = addExternalSampleName(fastqFileList, usableExternalSampleName) - for extFileNameFastQ in externalNamesFastqFileDict: - extraCopySciCore (sample_space, externalNamesFastqFileDict[extFileNameFastQ], dirName) - - # Write Meta data for Parents Files - for foundParent in foundParents: - addParentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - nameOfFile = createMetDataFileName (addParentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - if (parentCode != addParentCode): - tmpDir = tempfile.mkdtemp() - fileName = os.path.join(tmpDir, "PARENT_" + nameOfFile) - writeMetadataFile(transaction, fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict_NEW, experiment, [], flowLane) - sample_space = foundParent.getSpace() - extraCopySciCore (sample_space, fileName, dirName) - - try: - for extFileNameFastQ in externalNamesFastqFileDict: - transaction.moveFile(externalNamesFastqFileDict[extFileNameFastQ] , dataSet, folders[f]) - except: - # Happens when we have more than one pool registered, then the files have been moved away already - pass diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10567 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 DMv_I6 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties deleted file mode 100644 index 51c2eec3813..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py deleted file mode 100644 index 985022f203b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-miseq/register-lane-miseq.py +++ /dev/null @@ -1,327 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -Project_<Flow Cell>_<Lane> -e.g.Project_110715_SN792_0054_BC035RACXX_1 or Project_110816_6354LAAXX_1 - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION= {'FMI': '/links/shared/dsu/dss/customers/fmi/drop-box/','BIOCENTER_BASEL': '/links/shared/dsu/dss/customers/biozentrum/drop-box/', 'NEUROSTEMX': '/links/shared/dsu/dss/customers/biozentrum/drop-box/'} -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' - -DEFAULT_INDEX='NoIndex' - -# ------------------------------------------------------------------------------- - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile (fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList): - ''' - Writes a file of meta date related to one sample - ''' - try: - metaDataFile = open(fileName,'w') - for propertyType in parentPropertyTypes: - metaDataFile.write(propertyType.encode('utf-8') + "\t" + - parentPropertiesMap[propertyType].tryGetAsString().encode('utf-8') + "\n") - - metaDataFile.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - - for fcMetaData in fcMetaDataList: - metaDataFile.write(fcMetaData.encode('utf-8') + "\t" + - fcMetaDataDict[fcMetaData].tryGetAsString().encode('utf-8') + "\n") - pass - except IOError: - print ('File error, could not write '+ fileName) - finally: - metaDataFile.close() - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -def extraCopy (affiliation_name, path): - ''' - Handles the extra copies of the data for transfer with datamover via the - bc2 network to the FMI and BIOCENTER - For the BIOCENTER there is a folder created in which all data gets into - ''' - if (affiliation_name in AFFILIATION): - if (affiliation_name == 'BIOCENTER_BASEL' or affiliation_name == 'NEUROSTEMX' ): - dirname = AFFILIATION[affiliation_name] + datetime.now().strftime("%Y-%m-%d") - if not os.path.exists(dirname): - os.mkdir(dirname) - shutil.copy(path, dirname) - else: - shutil.copy(path, AFFILIATION[affiliation_name]) -# ------------------------------------------------------------------------------- - -def getFlowCellMetaData (transaction, flowCellId): - - def sortedDictValues(adict): - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - - search = transaction.getSearchService() - sc = SearchCriteria() - print('Searching FlowCell: '+ str(flowCellId)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowCellId)); - foundFlowCells = search.searchForSamples(sc) - - try: - assert foundFlowCells.size() == 1 - except AssertionError: - print (str(foundFlowCells.size()) + ' flow cells found which match the criterias: '+ flowCellId) - - fcPropertiesDict = {} - fcPropertyTypes = [] - - fcProperties = foundFlowCells[0].getSample().getProperties() - for property in fcProperties: - code = property.getPropertyType().getSimpleCode() - fcPropertyTypes.append(code) - fcPropertiesDict[code] = property - - fcPropertyTypes.sort() - return fcPropertiesDict, fcPropertyTypes - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def process(transaction): - - # useful for debugging: - print(datetime.now()) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: Project_131107_M01761_0043_000000000_A5BNW_1_1 - split=name.split("_") - if (len(split) == 8): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - flowCellId = split[4] + "-" + split[5] - flowLane = "_".join(split[-2:]) - incoming_sample=runningDate+ '_'+ sequencerId + '_' + sequentialNumber + '_' + flowCellId + ':' + flowLane - - # expected Project_130805_M01761_0018_000000000_A59MV_1 - if (len(split) == 7): - runningDate = split[1] - sequencerId = split[2] - sequentialNumber = split[3] - flowCellId = split[4] + "-" + split[5] - flowLane = split[-1] - incoming_sample = '_'.join([runningDate, sequencerId, sequentialNumber, flowCellId]) + ':' + flowLane - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the incoming_sample which is a Flow Lane - sc = SearchCriteria() - print('Processing sample: '+ str(incoming_sample)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incoming_sample)); - foundSamples = search_service.searchForSamples(sc) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - foundParents = searchParents(search_service, parents) - - # ------------------------------------------------------------------------------- - - usableExternalSampleName = "" - - # loop over each Sample folder within a lane - for f in range(0,len(folders)): - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,folders[f]) - - # if multiplexed samples then there is more than one folder - pathPerLane = incomingPath + '/' + folders[f] - print ("pathPerLane: " + pathPerLane) - - # get all properties of the parent samples - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - #print("Found parent code: "+ parentCode) - - # reformat Java ArrayList and Sort - parentPropertyTypes = [] - parentPropertiesMap = {} - for property in parentProperties: - code = property.getPropertyType().getSimpleCode() - parentPropertyTypes.append(code) - parentPropertiesMap[code] = property - try: - barcode = parentPropertiesMap[INDEX1].tryGetAsString() - if barcode == "NOINDEX": - barcode = DEFAULT_INDEX - else: - barcode.split()[-1][:-1] - except: - barcode = DEFAULT_INDEX - - try: - index2 = parentPropertiesMap[INDEX2].tryGetAsString() - if index2 == "NOINDEX": - index2 = DEFAULT_INDEX - else: - index2.split()[-1][:-1] - except: - index2 = DEFAULT_INDEX - - # just use the first six nucleotides for the naming - completeBarcode=barcode + "-" + index2 - - parentPropertyTypes.sort() - - print folders[f] - folderSplit = '-'.join(folders[f].split('_')[1:4]) - print "Folder split: " + folderSplit - print str(parentCode) - - if (parentCode == folderSplit): - - # BSSE-1754_C0364ACXX_CTTGTAA-AACC_L007_R1_001.fastq.gz - # BSSE_QGF_10002_121130_SN792_0189_AD1FBTACXX_1_NoIndex_L001_R1_001.fastq.gz - externalSampleName = parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString() - if len(externalSampleName) > 15: - usableExternalSampleName = externalSampleName[0:15] - else: - usableExternalSampleName = externalSampleName - - nameOfFile = parentCode.replace('-','_') + "_" + incoming_sample.replace(':', '_') + "_" + completeBarcode + "_L00" + \ - flowLane + "_" + sanitizeString(usableExternalSampleName) + METADATA_FILE_SUFFIX - dataSet.setPropertyValue(INDEX1, barcode) - dataSet.setPropertyValue(INDEX2, index2) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, parentPropertiesMap[EXTERNAL_SAMPLE_NAME].tryGetAsString()) - print("Creating metadata file:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - - fcMetaDataDict, fcMetaDataList = getFlowCellMetaData(transaction, incoming_sample.split(":")[0]) - writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList) - - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - extraCopy (affiliation_name, pathToFile) - - elif (folderSplit.startswith('lane') and barcode == "NoIndex" and index2 == "NoIndex"): - usableExternalSampleName = "" - #print("Creating metadata file for Undetermined:" + nameOfFile) - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - #pathToFile = transaction.createNewFile(dataSet, folders[f], nameOfFile) - #writeMetadataFile(pathToFile, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList, experiment) - #affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - #extraCopy (affiliation_name, pathToFile) - #for foundParent in foundParents: - # addParentCode, parentProperties, parentPropertyTypes, parentPropertiesMap, experiment, barcode, index2, completeBarcode = getProperties (foundParent, fcMetaDataDict) - # nameOfFile = createMetDataFileName (addParentCode, incoming_sample, completeBarcode, flowLane, METADATA_FILE_SUFFIX) - # if (parentCode != addParentCode): - # tmpDir = tempfile.mkdtemp() - # fileName = os.path.join(tmpDir, "PARENT_" + nameOfFile) - # writeMetadataFile(fileName, parentPropertyTypes, parentPropertiesMap, fcMetaDataDict, fcMetaDataList, experiment) - # affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - # extraCopy (affiliation_name, fileName) - - - # get all fastqs in this dataSet - fastqFileList=getFileNames(pathPerLane) - print("fastqFileList:") - print(fastqFileList) - - # put the files into the dataSet - affiliation_name = parentPropertiesMap[AFFILIATION_PROPERTY_NAME].tryGetAsString() - for file in fastqFileList: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - sanitizedExternalSampleName = sanitizeString(usableExternalSampleName) - - if sanitizedExternalSampleName: - newFile = folder + "/" + filepart + "_" + sanitizedExternalSampleName + "." + suffix - print ("RENAME file " + file + " TO " + newFile) - os.rename(file, newFile) - else: - # Undetermined file - newFile = file - - extraCopy (affiliation_name, newFile) - # finally add the files to the data set - transaction.moveFile(newFile , dataSet, folders[f]) - - if foundSamples.size() > 0: - sa = transaction.getSampleForUpdate(foundSamples[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10567 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 DMv_I6 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f6..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties deleted file mode 100644 index e80d511ec82..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-lane-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-lane-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py deleted file mode 100644 index 5ca8462c770..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-lane-nextseq/register-lane-nextseq.py +++ /dev/null @@ -1,398 +0,0 @@ -''' -Processes each flow lane of a Sequencing run - -Expects as incoming folder: -BSSE_QGF_22266_H0W8YBGXX_1 -or -Undetermined_H0W8YBGXX - -Note: -print statements go to: ~openbis/sprint/datastore_server/log/startup_log.txt -''' - -import os -import fnmatch -import time -import shutil -import re -import subprocess -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -AFFILIATION_PROPERTY_NAME='AFFILIATION' -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -CRC32_PATH='lib/a.out' - -# ------------------------------------------------------------------------------- - -def getThreadProperties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = getThreadProperties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - -def getFileNames(path): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, FASTQ_GZ_PATTERN): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane): - ''' - Writes a file of meta data related to one sample - ''' - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - for file in fastqFileList: - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (sample_space, meta_data_file_name, destinationFolder) - -def create_openbis_timestamp (): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - -# ------------------------------------------------------------------------------- - - def sortedDictValues(adict): - ''' - Given a dictionary it returns the values of this dict sorted - by the keys - d = {2:1, 4:1, 1:1, 100:3, 3:5} - sortedDictValues(d) - [1, 1, 5, 1, 3] - ''' - keys = adict.keys() - keys.sort() - return map(adict.get, keys) - -# ------------------------------------------------------------------------------- - -def extraCopySciCore (sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/Users/kohleman/tmp/scicore' - #dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_LIST = ["UNI_BASEL_SALZBURGER", "BIOCENTER_HANDSCHIN", "BIOCENTER_ZAVOLAN", - "BIOCENTER_KELLER", "BIOCENTER_SILANDER", "ETHZ_NEUROSTEMX", - "UNI_BASEL_UTZINGER", "UNI_BASEL_GAGNEUX"] - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_LIST): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO " + dirname) - shutil.copy(filePath, dirname) - -# ------------------------------------------------------------------------------- - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - return sample_properties_dict - -# ------------------------------------------------------------------------------- - -def searchParents (search_service, parents): - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - return foundParents - -# ------------------------------------------------------------------------------- - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - -# ------------------------------------------------------------------------------- - -def searchSample (sample_code, search_service): - sc = SearchCriteria() - print('Searching sample: '+ str(sample_code)) - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def renameFiles (fastq_files, undetermined, flow_cell_id): - - newFastqFileList = [] - for file in fastq_files: - if undetermined: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - -# ------------------------------------------------------------------------------- - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, flow_cell_id, sample_space, undetermined): - - for file in fastq_files: - extraCopySciCore (sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGXX - if (len(split) == 2): - sample_code = '' - flowCellId = split[-1] - flowLane = "1" - undetermined = True - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - -def process(transaction): - - undetermined = False - - print("\n" + str(datetime.now())) - - incomingPath = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - print("register-lane-nextseq.py is processing: " + name) - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - # get all fastqs - fastq_files=getFileNames(incomingPath) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - # Get the search service - search_service = transaction.getSearchService() - - flowcell_sample_immutable = searchSample (flowCellId, search_service) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - foundLane = searchSample (incoming_sample, search_service) - - # there should be only one sample because it is unique within one Flow Cell - if (len(foundLane) > 1): - raise Exception("More than one sample found! No unique code: " + incoming_sample) - elif (len(foundLane) == 0): - raise Exception("No matching sample found for: " + incoming_sample) - else : - sample = foundLane[0].getSample() - parents = sample.getParents() - - # Create a data set and set type - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dirName = transaction.createNewDirectory(dataSet,name) - - if not undetermined: - newFastqFiles = fastq_files - foundSample = searchSample (sample_code, search_service) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print("sequencing_sample_code: "+ sequencing_sample_code) - - sequencing_sample_properties_dict = get_sample_properties (transaction, foundSample[0]) - - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - sample_space = foundSample[0].getSpace() - - filepart, suffix = first_fastq_file.split('.',1) - meta_data_file_name = filepart.rsplit('_',2)[0] + METADATA_FILE_SUFFIX - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastq_files, flowLane) - affiliation_for_Undetermined = sample_space - - # Undetermined Files - else: - sample_space = "" - affiliation_for_Undetermined = "" - newFastqFiles = [] - lane_parents = searchParents (search_service, parents) - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties (transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - print(sample_space) - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print(sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL") - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - affiliation_for_Undetermined = sample_space - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1]== 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2]== 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print('NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID +', probably a pool: ' + sample_code) - meta_data_file_path = transaction.createNewFile(dataSet, name, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0] + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, newFastqFiles, flowLane) - affiliation_for_Undetermined = sample_space - # PARENTS: - else: - # Create Parent Meta data - print(sample_code + ": Create parent meta data file") - meta_data_file_path = transaction.createNewFile(dataSet, name, 'PARENT_' + sample_code + '_' + flowCellId + METADATA_FILE_SUFFIX) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, [], flowLane) - continue - - put_files_to_dataset (transaction, dataSet, newFastqFiles, name, flowCellId, affiliation_for_Undetermined, undetermined) - - if foundLane.size() > 0: - sa = transaction.getSampleForUpdate(foundLane[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp()) - dataSet.setSample(foundLane[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties deleted file mode 100644 index 9d5511bd58c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-macs -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-macs.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py deleted file mode 100755 index 17a9d5b074c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-macs/register-macs.py +++ /dev/null @@ -1,22 +0,0 @@ - -def process(transaction): - # Create a data set and set type - dataSet = transaction.createNewDataSet("MACS_OUTPUT") - dataSet.setPropertyValue("MACS_VERSION", "1.4.0RC2") - dataSet.setMeasuredData(False) - - incomingPath = incoming.getAbsolutePath() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # rsplit not in Python 2.2 - #sampleName = ":".join(incomingPath.split("/")[-1].rsplit("_",1)) - flowCell = "_".join((incomingPath.split("/")[-1].split("_")[2:-1])) - lane = (incomingPath.split("/")[-1]).split("_")[-1] - sampleName = flowCell + ":" + lane - - # Set the owner of the data set -- the specified sample - sample = transaction.getSample("/BSSE_BEISEL/" + sampleName) - - dataSet.setSample(sample) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties deleted file mode 100644 index 8572688f224..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-runstatistics -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-runstatistics.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py deleted file mode 100644 index d7b8b8400d3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-runstatistics/register-runstatistics.py +++ /dev/null @@ -1,73 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=[] - folders=os.listdir(incomingPath) - - split=incomingFolder.split("_") - if (len(split) == 4): - IS_HISEQ_RUN=True - if (len(split) == 2): - IS_HISEQ_RUN=False - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingFolder)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - - # Search for another data set of the same sample and make it a child of it - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - foundContainedSamples = search_service.searchForSamples(sampleSc) - if foundContainedSamples.size() > 0: - for fcs in range(0,foundContainedSamples.size()): - dataSet = transaction.createNewDataSet("RUNINFO") - dataSet.setMeasuredData(False) - dataSet.setSample(foundContainedSamples[fcs]) - # Add the incoming file into the data set - shutil.copytree(incomingPath, incomingPath + "_" + str(fcs+1)) - transaction.moveFile(incomingPath + "_" + str(fcs+1), dataSet) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties deleted file mode 100644 index 5b89e279f2f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-thumbnails -#incoming-dir = /links/sonas/cisd/store/incoming-flowCell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-thumbnails.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py deleted file mode 100644 index 60937ed4520..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-thumbnails/register-thumbnails.py +++ /dev/null @@ -1,55 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX - -@author: -Manuel Kohler -''' - -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - dataSet = transaction.createNewDataSet("THUMBNAILS") - - # Create a data set and set type - dataSet.setMeasuredData(False) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)); - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - dataSet.setSample(foundSamples[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties deleted file mode 100644 index fd7c9481927..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-unaligned-miseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned-miseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py deleted file mode 100755 index 97397b4e0bc..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned-miseq/register-unaligned-miseq.py +++ /dev/null @@ -1,176 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -UNALIGNED_FOLDER='Unaligned_no_mismatch' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-miseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName() - - split=name.split("_") - DSTYPE='ILLUMINA_MISEQ_OUTPUT' - #flowcell=name.split('_')[-1].split('-')[-1] - flowcell=name.split('_')[-1] - - #move Lanes into a different drop box - laneList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - - undeterminedList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - [shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(incomingPath + '/'+ UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob(incomingPath + '/' + UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, UNALIGNED_FOLDER) - # move all files is data set - [transaction.moveFile(file, dataSet, UNALIGNED_FOLDER) for file in fileList] - # move base call stat dir into data set - print("flowcell: "+flowcell) - transaction.moveFile(incomingPath + '/' + UNALIGNED_FOLDER + '/' + BASECALL_STATS_FOLDER + flowcell, dataSet, UNALIGNED_FOLDER + '/') - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, name)) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties deleted file mode 100644 index 9c8c317b60d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-unaligned -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-unaligned.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py deleted file mode 100755 index c8e364f1795..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-unaligned/register-unaligned.py +++ /dev/null @@ -1,195 +0,0 @@ -''' -@copyright: -2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Expects as incoming folder: <FlowCell>/Unaligned_no_mismatch - -@note: - -@author: -Manuel Kohler -''' - -import os -import glob -import shutil -import time -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -BASECALL_STATS_FOLDER = 'Basecall_Stats_' -REGEX_FILES = '*.*' -REGEX_MAKEFILE = 'Make*' -REGEX_LANES='/P*' -REGEX_UNDETERMINED = '/U*/Sample*' -LANE_FOLDER='/links/shared/dsu/dss/register-lane-hiseq/' -MARKER_STRING='.MARKER_is_finished_' - -def touch_markerfile(filename): - try: - # do a touch - open(filename, 'w').close() - except: - print('Could not touch ' + filename) - -def searchForLaneParents(transaction, sampleCode): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - # there should be only one sample because it is unique within one Flow Cell - if (len(foundSamples) > 1): - raise Exception("More than one sample found! No unique code: " + sampleCode) - elif (len(foundSamples) == 0): - raise Exception("No matching sample found for: " + sampleCode) - else : - sample = foundSamples[0].getSample() - parents = sample.getParents() - - # search for the parents - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - - parentCodeList = [] - - for foundParent in foundParents: - parent = foundParent.getSample() - # ArrayList - parentProperties = parent.getProperties() - # just get the current code - parentCode = parent.getCode() - parentCodeList.append(parentCode) - #print("Found parent code: "+ parentCode) - - return parentCodeList - - -def renameFiles(transaction, dir, flowcellName): - # Limit of Samples when the Sample Code is still used in the renaming. If Number of Samples is - # bigger than this number, we just write the number in the file name. - - MAX_SAMPLES = 20 - FACILITY_CODE = "BSSE_QGF_" - - for root, dirs, files in os.walk(dir): - for file in files: - lane = file.split("_")[0][-1] - if lane.isdigit(): - sampleCode = flowcellName + ":" + lane - print sampleCode - parentCodeList = searchForLaneParents(transaction, sampleCode) - print parentCodeList - length = len(parentCodeList) - if length > MAX_SAMPLES: - # BSSE_QGF_96_samples_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + str(length) + "_samples_" + flowcellName + "_" + file) - else: - # BSSE_QGF_10001_10002_10003_10004_C1A8YACXX_Undetermined_L008_R1_001.fastq.gz - SampleCodeString = "_".join([(e.split("-")[-1]) for e in parentCodeList]) - os.rename(root + '/' + file, root + "/" + FACILITY_CODE + SampleCodeString + "_" + flowcellName + "_" + file) - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - name = transaction.getIncoming().getName().split('-')[0] - print("incomingPath") - print(incomingPath) - UNALIGNED_FOLDER=glob.glob(os.path.join(incomingPath, 'Unaligned_[0-9]'))[0] - #UNALIGNED_FOLDER=incomingPath - - split=name.split("_") - if (len(split) == 4): - DSTYPE='ILLUMINA_HISEQ_OUTPUT' - flowcell=name.split("_")[-1][1:] - if (len(split) ==2): - DSTYPE='ILLUMINA_GA_OUTPUT' - flowcell=name.split("_")[-1] - - #move Lanes into a different drop box - laneList=glob.glob(UNALIGNED_FOLDER + REGEX_LANES) - laneList.sort() - print ("-------------- Lane List --------------") - print laneList - - undeterminedList=glob.glob(UNALIGNED_FOLDER + REGEX_UNDETERMINED) - print ("GLOB:") - print(UNALIGNED_FOLDER + REGEX_UNDETERMINED) - undeterminedList.sort() - print ("undeterminedList: ") - print (undeterminedList) - - # add the Flow Cell Name to the Undetermined FASTQ files - [renameFiles(transaction, dir, name) for dir in undeterminedList] - - # Multiplexing: - # First move the Undetermined reads to the other ones - try: - #[shutil.move(undeterminedLane, laneList[int(undeterminedLane.split('/')[-1][-1])-1] +'/' + undeterminedLane.split('/')[-1]) for undeterminedLane in undeterminedList] - print("SHUTIL:") - print(undeterminedList[0], os.path.join(laneList[0], os.path.basename(undeterminedList[0]))) - shutil.move(undeterminedList[0], os.path.join(laneList[0], os.path.basename(undeterminedList[0]))) - except: - print ("laneList is not matching the total number of lanes (Missing Project<xxx> folder?)") - - [shutil.move(lane, LANE_FOLDER+lane.split('/')[-1]) for lane in laneList] - markerFileList = [touch_markerfile(LANE_FOLDER+MARKER_STRING+lane.split('/')[-1]) for lane in laneList] - - # Create a data set and set type - dataSet = transaction.createNewDataSet("BASECALL_STATS") - dataSet.setMeasuredData(False) - - # Build up a list of file which are part of the data set - fileList=glob.glob(UNALIGNED_FOLDER + '/' + REGEX_FILES) - [fileList.append(i) for i in glob.glob( UNALIGNED_FOLDER +'/' +REGEX_MAKEFILE)] - - basename_folder = os.path.basename(UNALIGNED_FOLDER) - # Add the incoming file into the data set - transaction.createNewDirectory(dataSet, basename_folder) - # move all files in data set - [transaction.moveFile(file, dataSet, basename_folder) for file in fileList] - print("MOVE:") - print(os.path.join(UNALIGNED_FOLDER, BASECALL_STATS_FOLDER + flowcell)) - transaction.moveFile(os.path.join(UNALIGNED_FOLDER, BASECALL_STATS_FOLDER + flowcell), dataSet, basename_folder) - - # Get the search service - search_service = transaction.getSearchService() - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, transaction.getIncoming().getName().replace("-", ":"))) - foundSamples = search_service.searchForSamples(sc) - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample and make it a child of it - dataSetSc = SearchCriteria() - dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, DSTYPE)) - dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - foundDataSets = search_service.searchForDataSets(dataSetSc) - if foundDataSets.size() > 0: - dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) - - #shutil.rmtree(incomingPath) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties deleted file mode 100644 index c78a57ca244..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/register-undetermined -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-undetermined.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py deleted file mode 100644 index 9a7414e4081..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register-undetermined/register-undetermined.py +++ /dev/null @@ -1,63 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def splitFolderName (folderName): - runFolder, lane = folderName.rsplit("-", 1) - - # check if it is a NextSeq run, as we use only the Flowcell code as a Sample code - if ("NS" in runFolder): - return runFolder.split("_")[-1][1:] + ":" + lane - - return runFolder + ":" + lane - -def searchSample (transaction, sampleCode): - # Get the search service - search_service = transaction.getSearchService() - - print("Searching for " + sampleCode) - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)) - foundSamples = search_service.searchForSamples(sc) - assert(len(foundSamples), 1) - return foundSamples[0] - -def process(transaction): - - # expected incoming folder names: - # MiSeq: 141217_D00535_0040_BC6GHLANXX-1 - # NextSeq: 141217_NS500318_0034_AH1766BGXX-1 - # HiSeq: 141204_D00535_0035_BC5LPVANXX-8 - - incomingFolder = transaction.getIncoming().getName() - flowLaneName = splitFolderName(incomingFolder) - flowLane = searchSample(transaction, flowLaneName) - - dataSet = transaction.createNewDataSet("UNDETERMINED_READS_DISTRIBUTION") - dataSet.setMeasuredData(False) - dataSet.setSample(flowLane) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties deleted file mode 100644 index b5620f9aa35..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/plugin.properties +++ /dev/null @@ -1,11 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${root}/dss/register-aggregated-basecall-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-aggregated-basecall-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py deleted file mode 100644 index b9bfdfb031c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/drop-boxes/register_aggregated-basecall-stats/register-aggregated-basecall-stats.py +++ /dev/null @@ -1,72 +0,0 @@ -''' -@copyright: -2014 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt -expected incoming Name for HiSeq runs: 110715_SN792_0054_BC035RACXX -expected incoming Name for GAII runs: 110812_6353WAAXX -expected incoming Name for MiSeq runs: 121218_M00721_0017_000000000-A0T19 - -@author: -Manuel Kohler -''' - -import os -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - folders=os.listdir(incomingPath) - - # expected incoming Name, e.g.: 110715_SN792_0054_BC035RACXX - - # Create a data set and set type - dataSet = transaction.createNewDataSet("AGGREGATED_BASECALL_STATS") - dataSet.setMeasuredData(False) - - dataSet.setPropertyValue("MISMATCH_IN_INDEX", "NONE") - - # Get the search service - search_service = transaction.getSearchService() - - # Add the incoming file into the data set - transaction.moveFile(incomingPath, dataSet) - - # Search for the sample - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, incomingPath)) - foundSamples = search_service.searchForSamples(sc) - - - if foundSamples.size() > 0: - dataSet.setSample(foundSamples[0]) - - # Search for another data set of the same sample - #dataSetSc = SearchCriteria() - #dataSetSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, 'ILLUMINA_HISEQ_OUTPUT')) - #dataSetSc.addSubCriteria(SearchSubCriteria.createSampleCriteria(sc)) - #foundDataSets = search_service.searchForDataSets(dataSetSc) - #if foundDataSets.size() > 0: - # dataSet.setParentDatasets([ds.getDataSetCode() for ds in foundDataSets]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties deleted file mode 100644 index 253d1a19bb6..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Set Invoice Sent property -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py deleted file mode 100644 index a01000b8dc9..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/setInvoiceSent/script.py +++ /dev/null @@ -1,65 +0,0 @@ -def process(tr, parameters, tableBuilder): - - import subprocess - import os - import re - from java.util import EnumSet - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - from ch.systemsx.cisd.openbis.dss.client.api.v1 import OpenbisServiceFacadeFactory - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SampleFetchOption - - def sanitizeString(myString): - myString = myString.replace(u'ä', 'ae') - myString = myString.replace(u'ü', 'ue') - myString = myString.replace(u'ö', 'oe') - return re.sub('[^A-Za-z0-9]+', '_', myString) - - sampleId = parameters.get("sampleId") - plainPi = parameters.get("pI") - flowcellId = sampleId.split('/')[-1] - - # Search for the sample - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcellId)); - myFC = search_service.searchForSamples(sc) - try: - assert myFC.size() == 1 - except AssertionError: - print (str(myFC.size()) + " " + flowcellId) - - for p in myFC: - numberOfLanes = int(p.getPropertyValue('LANECOUNT')) - - for lane in range(1, numberOfLanes + 2): - myLane = flowcellId + ":" + str(lane) - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = search_service.searchForSamples(laneSc) - - if not laneList: - myLane = flowcellId + ":1_" + str(lane) - print("myLane: " + myLane) - laneSc = SearchCriteria(); - laneSc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, myLane)); - laneList = search_service.searchForSamples(laneSc) - - for l in laneList: - laneParents = l.getParentSampleIdentifiers() - - for sampleCode in laneParents: - Sample = tr.getSample(sampleCode) - FullSamplePi = Sample.getPropertyValue('PRINCIPAL_INVESTIGATOR_NAME') - samplePi = sanitizeString(FullSamplePi) - print samplePi + " == " + sanitizeString(plainPi) + " ?" - - if (samplePi == sanitizeString(plainPi)): - print "Setting Property 'INVOICE_SENT' to true for sample: " + sampleCode - updateableSample = tr.getSampleForUpdate(sampleCode) - updateableSample.setPropertyValue('INVOICE', 'True') - - tableBuilder.addHeader("CSV") - - row = tableBuilder.addRow() - row.setCell("CSV",plainPi) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties deleted file mode 100644 index f759e0ab0f4..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger Sample Sheet Creation -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonAggregationService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py deleted file mode 100644 index 6fbad460abe..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerCreateSampleSheet/script.py +++ /dev/null @@ -1,44 +0,0 @@ -def aggregate(parameters, tableBuilder): - - import subprocess - sampleSheetBinary = "/links/application/dsu/createSampleSheet/createSampleSheet.sh" - sampleSheetBinaryMiSeq = "/links/application/dsu/createSampleSheet/createSampleSheet_miseq.sh" - - miSeqPath = "/links/shared/dsu/runs/yoda" - - sampleId = parameters.get("sampleId") - sendEmail = parameters.get("sendEmail") - miSeqRun = parameters.get("miSeqRun") - flowcellId = sampleId.split('/')[-1] - - if '-' in flowcellId: - flowCellName = flowcellId.split('_')[3] - else: - flowCellName = flowcellId.split('_')[3][1:] - - sampleSheetFileName = "SampleSheet_" + flowCellName + ".csv" - - if miSeqRun: - binary = sampleSheetBinaryMiSeq - else: - binary = sampleSheetBinary - - sampleSheet = subprocess.Popen([binary, "-f", flowcellId, "-v", "-o", miSeqPath, "=l", "win32"], stdout=subprocess.PIPE) - result = sampleSheet.stdout.read() - ssList = result.split('\n') - if sendEmail: - mailService.createEmailSender().withSubject("Sample Sheet for flow cell: " + flowcellId).withAttachedText(result, sampleSheetFileName).send() - - tableBuilder.addHeader("CSV") - - row = tableBuilder.addRow() - row.setCell("CSV","Created Sample Sheet "+ sampleSheetFileName + " and stored here: " + "Y:/yoda") - row = tableBuilder.addRow() - row.setCell("CSV",200*"-") - - for line in ssList: - row = tableBuilder.addRow() - row.setCell("CSV",line) - - row = tableBuilder.addRow() - row.setCell("CSV",200*"-") diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties deleted file mode 100644 index dd31feda599..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger Invoice Creation -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py deleted file mode 100644 index 5161cd0f050..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerInvoice/script.py +++ /dev/null @@ -1,75 +0,0 @@ -def process(tr, parameters, tableBuilder): - - import subprocess - import os - from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - - base = "/home/sbsuser/openbis/createInvoices/" - createInvoiceBinary = base + "createInvoices.sh" - outDir = base + "invoices/" - magicString = "@Invoice@" - - invoiceSentList = [] - tmpIndexList = [] - - sampleId = parameters.get("sampleId") - sendEmail = parameters.get("sendEmail") - flowcellId = sampleId.split('/')[-1] - invoiceList = subprocess.Popen([createInvoiceBinary, "-f", flowcellId, "-o", outDir, "-d"], stdout=subprocess.PIPE) - result = invoiceList.stdout.read() - - ssList = result.split('\n') - print ssList - - for idx, element in enumerate(ssList): - if element.startswith(magicString): - tmpIndexList.append(idx) - invoiceSentList.append(element.split('@')[-1]) - - tmpIndexList.sort(reverse=True) - for idx in tmpIndexList: - ssList.pop(idx) - - ssList = ssList[:-1] - - if sendEmail: - mailService.createEmailSender().withSubject("Invoice for flow cell: " + flowcellId).withAttachedText(result, "Invoice_" + flowcellId + ".csv").send() - - # Search for the sample - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, flowcellId)); - myFC = search_service.searchForSamples(sc) - try: - assert myFC.size() == 1 - except AssertionError: - print (str(myFC.size()) + " " + myFC.getCode()) - - def attachFile(fileToAttach): - f = open(fileToAttach, 'r') - print ("Attaching " + fileToAttach + " to " + myFC[0].getSampleIdentifier()) - updateableSample = tr.getSampleForUpdate(myFC[0].getSampleIdentifier()) - updateableSample.addAttachment(fileToAttach, "Invoice for Flow Cell " + flowcellId, "Invoice", f.read()) - - column1 = "CSV" - column2 = "invoiceFlag" - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - for pI in invoiceSentList: - print pI - - for line in ssList: - XLXSfile = os.path.split(line)[-1] - print ("___________________________") - print line - print "File: " + XLXSfile - #line = '<a target="_self" href="' + filePath + XLXSfile + '">' + XLXSfile + '</a>' - attachFile(outDir + XLXSfile) - row = tableBuilder.addRow() - row.setCell(column1,"Attached file as " + XLXSfile) - - for pI in invoiceSentList: - row = tableBuilder.addRow() - row.setCell(column2, pI) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/lib/jyson-1.0.2.jar deleted file mode 100644 index 9988738cfce62d14d74610118a57eb604d66d2fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7805 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�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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties deleted file mode 100644 index f8682933750..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger bee job -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py deleted file mode 100644 index dd43a63be7e..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggerbee/script.py +++ /dev/null @@ -1,194 +0,0 @@ -from __future__ import with_statement -import subprocess -import os -import time -import shutil -import sys -import datetime -import httplib -import urllib - -from com.xhaus.jyson import JysonCodec as json -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -ORGANISM_CODE = 'NCBI_ORGANISM_TAXONOMY' - -# here we have a lookup table to look for the the bowtie2 index names given -# by the NCBI/openBIS taxonomy - -ORGANISM_DICT = {"10090" : "mm10", # Mouse - "9606" : "hg19", # Human - "7227" : "dm3", # Fruit fly - "10847" : "phix", # phiX - "4932" : "sacCer3", # baker's yeast - "1773" : "myc_tub_h37rv_2", # M. tuberculosis H37Rv -} - -column1 = "resultCode" -column2 = "resultString" - -def process(tr, parameters, tableBuilder): - ''' - Main function which controls the output - ''' - method = parameters.get("method") - permId = parameters.get("permId") - userId = parameters.get("userId") - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - if method == "startJob": - print "Start the job" - startJob(tr, parameters, userId, tableBuilder) - - if method == "pollJob": - pollJob(tr, parameters, userId, tableBuilder) - -# -------------------------------------------------------------------- - -def startJob(tr, parameters, userId, tableBuilder): - ''' - Starts job - ''' - permId = parameters.get("permId") - sendEmail = parameters.get("sendEmail") - bowtieParam = parameters.get("bowtieParam") - clusteroption = parameters.get("clusteroptionsParam") - - outputDict = {} - result = "" - - def searchDs (tr, dscode): - # search for the data set - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc) - try: - assert myds.size() == 1 - except assertionerror: - print (str(myds.size()) + " " + myds.getcode()) - return myds - - # -------------------------------------------------------------------- - - def searchSample (tr, sampleCode): - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - searchedSamples = search_service.searchForSamples(sc) - try: - assert searchedSamples.size() == 1 - except assertionerror: - print (str(searchedSamples.size()) + " " + searchedSamples.getcode()) - return searchedSamples - - # -------------------------------------------------------------------- - - dataSet = searchDs(tr, permId) - connectedSampleId = dataSet[0].getSample().getSampleIdentifier() - - # We have to do a second search for the sample, otherwise the peroperties - # are not present when using dataSet[0].getSample() fro accessing the sample - - content = contentProvider.getContent(permId) - #print content - pList = content.listMatchingNodes(".*.fastq.gz") - #print pList - - stop = False - taxonomyURL = "http://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?id=" - - def returnDict(outputDict): - for entry in outputDict: - row = tableBuilder.addRow() - row.setCell(column1, outputDict[entry][0]) - row.setCell(column2, outputDict[entry][1]) - - if pList: - sampleCode = "-".join(str(pList[0].tryGetFile()).split("/")[-1].split("_")[0:3]) - - print sampleCode - foundSample = searchSample(tr, sampleCode) - organism = foundSample[0].getPropertyValue(ORGANISM_CODE) - - if organism: - print organism - try: - org = ORGANISM_DICT[organism] - outputDict[0] = [0, "Found " + org + "[" +organism + \ - "] as reference genome - defined in Sample " + \ - sampleCode ] - except: - outputDict[0] = [1, 'Given organism <a href=\"' + taxonomyURL + organism + '\" target=\"_blank\">' + organism + '</a> from sample ' + sampleCode + ' is not available as bowtie2 index.'] - #sys.exit("Given organism not available as bowtie2 index") - stop = True - - if not bowtieParam: - bowtieParam = '--phred33' - - if not stop: - headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} - workflow = open('/home/sbsuser/bee/bowtie2_bee.xml').read() - params = urllib.urlencode({'workflow': workflow, 'api.datasetID': permId, 'api.organism': ORGANISM_DICT[organism], 'api.bowtieParams':bowtieParam, 'api.user' : userId}) - conn = httplib.HTTPConnection("127.0.0.1:9999") - conn.request("POST", "/apiv1/processes", params, headers) - resp = conn.getresponse() - conn.close() - outputDict[1] = [0, "Job started..."] - #outputDict[1] = [0, str(resp.read())] - #outputDict[2] = [0, str(resp.status)] - - else: - outputDict[0] = [1, "No organism specified in the sample. Making an alignment is not possible."] - - #sampleId, fcDate, seqSn, runningNumber, fcID, lane, index, fullLane, readNumber, fileNumber = filename.split('-')[-1].split('_') - - returnDict(outputDict) - -# -------------------------------------------------------------------- - -def pollJob(tr, parameters, userId, tableBuilder): - - permId = parameters.get("permId") - - conn = httplib.HTTPConnection("127.0.0.1:9999") - conn.request("GET", "/apiv1/processes?inputId=" + permId) - resp = conn.getresponse().read() - conn.close() - - if resp != 'null': - data = json.loads(resp) - processes = data['workflowDTO'] - strOut = "Processing history: \n" - else: - strOut = "No Job started." - processes = [] - - isThereRunning = False - - if not isinstance(processes, list): - processes = [processes] - - for p in processes: - d = datetime.datetime.fromtimestamp(float(p['startTime'])/1000.0) - strOut += "Process started: " + str(d) + " is in state: " + p['status'] + "\n" - if not isFinished(p['status']): - isThereRunning = True - - column1 = "resultCode" - column2 = "resultString" - - row = tableBuilder.addRow() - if not isThereRunning: - row.setCell(column1, 100 ) - row.setCell(column2, strOut ) - else: - row.setCell(column1, 101 ) - row.setCell(column2, strOut ) - -def isFinished(status): - return status == 'COMPLETE' or status == 'ABORTED' or status == 'ERROR' or status == 'WARNING' diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties deleted file mode 100644 index 0755ced0278..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/plugin.properties +++ /dev/null @@ -1,3 +0,0 @@ -label = Trigger gc3pie job -class = ch.systemsx.cisd.openbis.dss.generic.server.plugins.jython.JythonIngestionService -script-path = script.py diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py deleted file mode 100644 index 92d9e9d84cc..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/dss/reporting-plugins/triggergc3pie/script.py +++ /dev/null @@ -1,201 +0,0 @@ -from __future__ import with_statement -import subprocess -import os -import time -import shutil -import sys -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -ORGANISM_CODE = 'NCBI_ORGANISM_TAXONOMY' - -# here we have a lookup table to look for the the bowtie2 index names given -# by the NCBI/openBIS taxonomy - -ORGANISM_DICT = {"10090" : "mm10", # Mouse - "9606" : "hg19", # Human - "7227" : "dm3", # Fruit fly - "10847" : "phix", # phiX - "4932" : "sacCer3", # baker's yeast -} - -SESSIONDIR="/home/sbsuser/openbis/sprint/servers/datastore_server/dss-tmp/" - -column1 = "resultCode" -column2 = "resultString" - -# -------------------------------------------------------------------- - -def fileExists (fileName): - - #if os.path.isfile(fileName): - # return True - #else: - # return False - - try: - with open(fileName): - print fileName - print "exists!" - return True - except IOError: - print "no file" - return False - -# -------------------------------------------------------------------- - -def getSessionPath(permId, userId): - return SESSIONDIR + permId + "_" + userId - -# -------------------------------------------------------------------- - -def process(tr, parameters, tableBuilder): - ''' - Main function which controls the output - ''' - method = parameters.get("method") - permId = parameters.get("permId") - userId = parameters.get("userId") - - tableBuilder.addHeader(column1) - tableBuilder.addHeader(column2) - - if (method == "startJob" and not os.path.exists(getSessionPath(permId, userId))): - print "Start the job" - startJob(tr, parameters, userId, tableBuilder) - - if method == "pollJob": - pollJob(tr, parameters, userId, tableBuilder) - -# -------------------------------------------------------------------- - -def startJob(tr, parameters, userId, tableBuilder): - ''' - Starts job - ''' - permId = parameters.get("permId") - sendEmail = parameters.get("sendEmail") - bowtieParam = parameters.get("bowtieParam") - clusteroption = parameters.get("clusteroptionsParam") - - #print(permId) - #print(sendEmail) - #print(bowtieParam) - #print(clusteroption) - - outputDict = {} - result = "" - - CMD = "/home/sbsuser/openbis/bin/gc3_bowtie2.sh" - - def searchDs (tr, dscode): - # search for the data set - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, dscode)); - myds = search_service.searchForDataSets(sc) - try: - assert myds.size() == 1 - except assertionerror: - print (str(myds.size()) + " " + myds.getcode()) - return myds - - # -------------------------------------------------------------------- - - def searchSample (tr, sampleCode): - search_service = tr.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch( \ - SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - searchedSamples = search_service.searchForSamples(sc) - try: - assert searchedSamples.size() == 1 - except assertionerror: - print (str(searchedSamples.size()) + " " + searchedSamples.getcode()) - return searchedSamples - - # -------------------------------------------------------------------- - - dataSet = searchDs(tr, permId) - connectedSampleId = dataSet[0].getSample().getSampleIdentifier() - - # We have to do a second search for the sample, otherwise the peroperties - # are not present when using dataSet[0].getSample() fro accessing the sample - - content = contentProvider.getContent(permId) - #print content - pList = content.listMatchingNodes(".*.fastq.gz") - #print pList - - def returnDict(outputDict): - for entry in outputDict: - row = tableBuilder.addRow() - row.setCell(column1, outputDict[entry][0]) - row.setCell(column2, outputDict[entry][1]) - - - if pList: - sampleCode = "-".join(str(pList[0].tryGetFile()).split("/")[-1].split("_")[0:3]) - - print sampleCode - foundSample = searchSample(tr, sampleCode) - organism = foundSample[0].getPropertyValue(ORGANISM_CODE) - print organism - - if organism: - try: - outputDict[0] = [0, "Found " + ORGANISM_DICT[organism] + "[" +organism + \ - "] as reference genome - defined in Sample " + \ - sampleCode ] - - for element in pList: - print element.tryGetFile() - file = str(element.tryGetFile()) - - # here we actually start the job - proc = subprocess.Popen([CMD, file, permId + "_" + userId, ORGANISM_DICT[organism], "\'" + bowtieParam + "\'", clusteroption, "8" , getSessionPath(permId, userId)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - strOut, err = proc.communicate() - print strOut - print err - - filename = os.path.basename(file) - if len(err) == 0: - outputDict[5] = [0, strOut] - outputDict[1] = [0, "Processing " + filename] - outputDict[3] = [0, "Successfully submitted job to... "] - else: - outputDict[5] = [1, err] - - except: - outputDict[0] = [1, "Given organism " + organism + " from sample " + sampleCode + " is not available as bowtie2 index."] - else: - outputDict[0] = [1, "No organism specified in the sample. Making an alignment is not possible."] - - #sampleId, fcDate, seqSn, runningNumber, fcID, lane, index, fullLane, readNumber, fileNumber = filename.split('-')[-1].split('_') - - returnDict(outputDict) - -# -------------------------------------------------------------------- - -def pollJob(tr, parameters, userId, tableBuilder): - - permId = parameters.get("permId") - - output = subprocess.Popen(["/home/sbsuser/bela_play/gc3Status.sh", getSessionPath(permId, userId)], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - strOut, err = output.communicate() - strOut = strOut.strip() - - column1 = "resultCode" - column2 = "resultString" - - row = tableBuilder.addRow() - if strOut == 'TERMINATED' or strOut == 'STOPPED' or strOut == 'Nope': - row.setCell(column1, 100 ) - row.setCell(column2, strOut ) - else: - row.setCell(column1, 101 ) - row.setCell(column2, strOut ) - - if strOut == 'TERMINATED' or strOut == 'STOPPED': - shutil.rmtree(getSessionPath(permId, userId)) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py deleted file mode 100644 index eebbe6b7ac2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/1/jython-lib/gfb_utils.py +++ /dev/null @@ -1,120 +0,0 @@ -import os -import time -import fnmatch -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# HISEQ_DICT = {'HISEQ_4000': 'Illumina HiSeq 4000', -# 'HISEQ_3000': 'Illumina HiSeq 3000', -# 'HISEQ_2500': 'Illumina HiSeq 2500', -# 'HISEQ_2000': 'Illumina HiSeq 2000', -# 'HISEQ_X': 'Illumina HiSeq X' -# } -# NEXTSEQ_DICT = {'NEXTSEQ_500': 'Illumina NextSeq 500'} -# MISEQ_DICT = {'MISEQ': 'Illumina MiSeq'} -# UNIDENTIFIED_DICT = {'UNIDENTIFIED': 'Unidentified'} - -# Instead of using Enum: -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED= \ - ('Illumina HiSeq 4000','Illumina HiSeq 3000','Illumina HiSeq 2500','Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') - -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_thread_properties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - - -def create_openbis_timestamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - - -def create_openbis_timestamp_now(): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -def search_unique_sample(transaction, sample_code): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - found_sample = search_service.searchForSamples(sc) - try: - assert found_sample.size() == 1 - except AssertionError: - print (str(found_sample.size()) + ' samples found which match the criterias: '+ sample_code) - return found_sample - - -def get_file_names(path, pattern): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py deleted file mode 100644 index 2fd4f6c1571..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/create-flowcell.py +++ /dev/null @@ -1,312 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Parses the two Illumina provided files 'RunParameters.xml' / 'runParameters.xml -'and 'RunInfo.xml' and creates one Sample of type 'ILLUMINA_FLOW_CELL' -and sets Sample properties from those two XML files. Additionally the -number of lanes are read out and are created as contained samples of -type 'ILLUMINA_FLOW_LANE'. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import shutil -import re -from time import * -from datetime import * -import xml.etree.ElementTree as etree -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.common.mail import EMailAddress - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -RUNPARAMETERS = 'RunParameters.xml' -ALTERNATIVE_RUNPARAMETERS = 'runParameters.xml' -RUNINFO = 'RunInfo.xml' -FLOWCELL_SPACE='/BSSE_FLOWCELLS/' -FLOWCELL_PROJECT='FLOWCELLS/' -EXPERIMENT_TYPE_CODE='HT_SEQUENCING' -CYCLES_VOCABULARY_NAME = "CYCLES" - -# Mapping between XML file naming and openBIS properties - -RUNINFO_XML = {'LANECOUNT':'LaneCount', 'SURFACECOUNT':'SurfaceCount', - 'SWATHCOUNT':'SwathCount', 'TILECOUNT':'TileCount'} -RUNPARAMETERS_XML = {'FLOWCELL':'Flowcell', 'RTAVERSION':'RTAVersion', - 'CONTROLLANE':'ControlLane', 'SBS':'Sbs', 'INDEX':'Index', - 'CYCLES_REQUESTED_BY_CUSTOMER':'Read1', 'PE':'Pe', 'RUN_MODE': 'RunMode', - 'CONTROL_SOFTWARE_VERSION': 'ApplicationVersion'} - -PERSISTENT_KEY_MAP = "persistent_key_map" - - -class parseXmlFile: - - def __init__(self, xmlFile): - self.xmlFile = xmlFile - self.tree = etree.parse(self.xmlFile) - self.root = self.tree.getroot() - - - def getXmlElement (self, elementName): - ''' - Returns the text value of a given XML element - ''' - for e in self.root.getchildren(): - element = e.find(elementName) - if element is None: - return 'None' - else: - return element.text - - - def getAllchildren (self, elementName): - ''' - finds all children of a given XML Element and returns them as list - ''' - for e in self.root.getchildren(): - # the '//' means look recursively for all children not only direct ones - childList = self.tree.findall('.//' + elementName) - return childList - - -def registerFlowLane(a_lane, transaction, name, newFlowCell): - ''' - Registers a new Flow lane - ''' - newFlowLane = transaction.createNewSample(FLOWCELL_SPACE + name + ':' + str(a_lane), "ILLUMINA_FLOW_LANE") - newFlowLane.setPropertyValue('CONCENTRATION_FLOWLANE', str(0)) - newFlowLane.setContainer(newFlowCell) - - -def addVocabularyTerm(transaction, vocabularyName, vocabularyCode): - modifiableVocabulary = transaction.getVocabularyForUpdate(vocabularyName) - if not (modifiableVocabulary.containsTerm(vocabularyCode)): - ordinals = [] - terms = modifiableVocabulary.getTerms() - for term in terms: - ordinals.append(term.getOrdinal()) - - newOrdinal = max(ordinals)+1; - - newTerm = transaction.createNewVocabularyTerm(); - newTerm.setCode(vocabularyCode) - newTerm.setOrdinal(newOrdinal) - modifiableVocabulary.addTerm(newTerm) - - -def send_email(mailClient, persistent_map): - - replyTo = EMailAddress("no-reply@bsse.ethz.ch") - fromAddress = replyTo - manuel = EMailAddress("manuel.kohler@id.ethz.ch") - ina = EMailAddress("ina.nissen@bsse.ethz.ch") - christian = EMailAddress("christian.beisel@bsse.ethz.ch") - katja = EMailAddress("katja.eschbach@bsse.ethz.ch") - philippe = EMailAddress("philippe.demougin@unibas.ch") - elodie = EMailAddress("belodie@ethz.ch") - fabian = EMailAddress("fabian.koechl@bsse.ethz.ch") - - subject = "Automatically created new " + persistent_map[1] + " flow cell " + persistent_map[0] + " in openBIS" - body = "A new run got started with flow cell: " + persistent_map [0] + \ - "\n Direct Link: https://openbis-dsu.bsse.ethz.ch/openbis/index.html?#entity=SAMPLE&permId=" + persistent_map[2] + "\nHave a good day! :-)" - mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, ina, katja, christian, philippe, manuel, elodie, fabian); - #mailClient.sendEmailMessage(subject, body, replyTo, fromAddress, manuel); - - -def post_storage(context): - mailClient = context.getGlobalState().getMailClient() - persistent_map = context.getPersistentMap().get(PERSISTENT_KEY_MAP) - send_email(mailClient, persistent_map) - - -def searchSample(transaction, sampleName): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleName)); - foundSamples = search_service.searchForSamples(sc) - return foundSamples - - -def setFcProperty(searchId, my_dict, runInfo, newFlowCell): - children = runInfo.getAllchildren(searchId) - for element in (my_dict): - if (element != '') and (my_dict[element] != ''): - newFlowCell.setPropertyValue(element, children[0].attrib[my_dict[element]]) - - -def set_index_lengths (readMap, newFlowCell): - - indexCount = 0 - readCount = 0 - - for entry in readMap: - if readMap[entry][1] == 'Y': - indexCount += 1 - else: - readCount += 1 - - if readCount == 2: - newFlowCell.setPropertyValue("END_TYPE", "PAIRED_END") - else: - newFlowCell.setPropertyValue("END_TYPE", "SINGLE_READ") - - try: - if indexCount == 1: - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD", '0') - - try: - if indexCount == 2: - newFlowCell.setPropertyValue("INDEXREAD2", readMap['3'][0]) - newFlowCell.setPropertyValue("INDEXREAD", readMap['2'][0]) - else: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - except: - newFlowCell.setPropertyValue("INDEXREAD2", '0') - - -def sanitizeString(myString): - return re.sub('[^A-Za-z0-9]+', '_', myString) - - -def get_version(my_path): - return my_path[-4:-2] - - -def create_or_update_flowcell(transaction, fcId): - - found_samples = searchSample(transaction, fcId) - # if flow cell already exists then just get it for an update - if found_samples.size() > 0: - print('Already found a Flow Cell with the following name: ' + fcId + ". Will re-set the properties...") - new_flowcell = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - else: - new_flowcell = transaction.createNewSample(FLOWCELL_SPACE + fcId, "ILLUMINA_FLOW_CELL") - exp = transaction.getExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + datetime.now().strftime("%Y.%m")) - if exp is None: - exp = transaction.createNewExperiment(FLOWCELL_SPACE + FLOWCELL_PROJECT + - datetime.now().strftime("%Y.%m"), EXPERIMENT_TYPE_CODE) - new_flowcell.setExperiment(exp) - return new_flowcell - - -def set_run_mode(transaction, new_flowcell, run_mode): - addVocabularyTerm(transaction, "RUN_MODE_VOCABULARY", run_mode) - new_flowcell.setPropertyValue("RUN_MODE", run_mode) - -def process(transaction): - - incoming = transaction.getIncoming() - incomingPath = incoming.getAbsolutePath() - - run_id = incoming.getName() - model = get_model(run_id) - print("Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - # Parse the RunInfo.xml and RunParameters.xml - runInfo = parseXmlFile(os.path.join(incomingPath, RUNINFO)) - try: - runParameters = parseXmlFile(os.path.join(incomingPath, RUNPARAMETERS)) - except: - runParameters = parseXmlFile(os.path.join(incomingPath, ALTERNATIVE_RUNPARAMETERS)) - - # get the number of lanes - max_lanes = runInfo.getAllchildren('FlowcellLayout')[0].attrib[RUNINFO_XML['LANECOUNT']] - new_flowcell = create_or_update_flowcell(transaction, fc_id) - permId = new_flowcell.getPermId() - transaction.getRegistrationContext().getPersistentMap().put(PERSISTENT_KEY_MAP, [fc_id, model, permId]) - - flow_lanes = new_flowcell.getContainedSamples() - if len(flow_lanes) is 0: - if model in [Sequencers.NEXTSEQ_500]: - max_lanes = 1 - [registerFlowLane(lane, transaction, fc_id, new_flowcell) for lane in range(1,int(max_lanes)+1)] - - # NextSeq specific - if model in [Sequencers.NEXTSEQ_500]: - run_mode = sanitizeString(runParameters.getAllchildren('Chemistry')[0].text) - set_run_mode(transaction, new_flowcell, run_mode) - recipe_folder = (runParameters.getAllchildren('RecipeFolder'))[0].text - major_version = get_version(recipe_folder) - new_flowcell.setPropertyValue("SBS_KIT", major_version) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # MiSeq specific - if model in [Sequencers.MISEQ]: - ReagentKitBarcode = (runParameters.getAllchildren('ReagentKitBarcode'))[0].text - new_flowcell.setPropertyValue("SBS_KIT", ReagentKitBarcode) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getAllchildren('ApplicationVersion')[0].text) - - # HiSeq specific - if model in HISEQ_LIST: - run_mode = sanitizeString(runParameters.getXmlElement(RUNPARAMETERS_XML['RUN_MODE'])) - new_flowcell.setPropertyValue("FLOWCELLTYPE", runParameters.getXmlElement(RUNPARAMETERS_XML['FLOWCELL'])) - new_flowcell.setPropertyValue("SBS_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['SBS'])) - new_flowcell.setPropertyValue("CONTROL_SOFTWARE_VERSION", runParameters.getXmlElement(RUNPARAMETERS_XML['CONTROL_SOFTWARE_VERSION'])) - if (new_flowcell.getPropertyValue("END_TYPE") == "PAIRED_END"): - new_flowcell.setPropertyValue("PAIRED_END_KIT", runParameters.getXmlElement(RUNPARAMETERS_XML['PE'])) - set_run_mode(transaction, new_flowcell, run_mode) - - rta_version = (runParameters.getAllchildren('RTAVersion'))[0].text - addVocabularyTerm(transaction, "PIPELINE_VERSION", rta_version) - new_flowcell.setPropertyValue("ILLUMINA_PIPELINE_VERSION", rta_version) - - # Reading out <FlowcellLayout LaneCount="1" SurfaceCount="1" SwathCount="1" TileCount="12" /> - setFcProperty('FlowcellLayout', RUNINFO_XML, runInfo, new_flowcell) - - sequencer = runInfo.getAllchildren('Instrument') - addVocabularyTerm(transaction, "SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("SEQUENCER", sequencer[0].text) - new_flowcell.setPropertyValue("FLOW_CELL_SEQUENCED_ON", create_openbis_timestamp(os.path.join(incomingPath, RUNINFO))) - new_flowcell.setPropertyValue("RUN_NAME_FOLDER", run_id) - - readMap = {} - reads = runInfo.getAllchildren('Reads') - read = reads[0].findall('Read') - - for r in read: - cycles = r.get('NumCycles', 'str') - number = r.get('Number', 'str') - is_indexed = r.get('IsIndexedRead', 'str') - readMap[number] = [cycles, is_indexed] - - # example of readMap: {'1': ['151', 'N'], '2': ['8', 'Y'], '3': ['8', 'Y'], '4': ['151', 'N']} - number_of_cycles = readMap['1'][0] - addVocabularyTerm(transaction, CYCLES_VOCABULARY_NAME, number_of_cycles) - new_flowcell.setPropertyValue("CYCLES_REQUESTED_BY_CUSTOMER", number_of_cycles) - - set_index_lengths(readMap, new_flowcell) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties deleted file mode 100644 index dd75e75ff45..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/create-flowcell/plugin.properties +++ /dev/null @@ -1,9 +0,0 @@ -# -# Drop box for creating a flow cell -# -incoming-dir = ${incoming-root-dir}/create-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = create-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties deleted file mode 100644 index 06c8edfcacb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-miseq-hiseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-miseq-hiseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py deleted file mode 100755 index c10028aa6d1..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read-demultiplex-stats-miseq-hiseq.py +++ /dev/null @@ -1,366 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Manuel Kohler - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats_miseq_hiseq -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.get(lane_in_int).Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.get(lane_in_int).Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_CLUSTERS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_CLUSTERS_SUM',str(int(totalLaneStatistics.get(lane_in_int).Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.get(lane_in_int).Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.get(lane_in_int).Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.get(lane_in_int).Clusters_PfWithoutNoindex))) - - ########################################################## - - def update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell): - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - - nprocessedDataSets = 0 - - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) -# print(index1list) - - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - - pre_filtered_list = [sample for sample in samplestatisticslist if sample.Lane == int(codeSampleFlowLane[-1])] - print("Number of samples: " + str(len(pre_filtered_list)) + " for lane " + codeSampleFlowLane[-1]) - - for s in pre_filtered_list: - print "\nContent in XML file:\n", s - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet(' + str(index1list) + ') in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - index2 = [ index2 for index2 in index2list if (index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - return nprocessedDataSets - - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats_miseq_hiseq() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXmlAndCalculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - print(samplestatisticslist[0].Flowcell) - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - - for lane in lanes: - lane_in_int = int(lane.getCode().split(":")[-1]) - if (lane_in_int in totalLaneStatistics.keySet()): - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - codeSampleFlowLane = ":".join([codeSampleFlowCell, str(lane_in_int)]) - nprocessedDataSets = update_datatsets(transaction, samplestatisticslist, codeSampleFlowLane, codeSampleFlowCell) - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java deleted file mode 100644 index 7f04fc6acbc..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-miseq-hiseq/read_demultiplex_stats_miseq_hiseq.java +++ /dev/null @@ -1,736 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -//########################################################## - -public final class read_demultiplex_stats_miseq_hiseq -{ - - public static ArrayList<Statistics> importXmlAndCalculateStatistics(String XMLFile) throws Exception { - - ArrayList<Statistics> stats = executeImportXmlAndCalculateStatistics(XMLFile); - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(stats); - - for (Statistics s : stats) - s.adaptStatisticsWithRespectToAllSamples(stats, groupedList); - return stats; - } - - /** - * - * Streams through a given XML file, parses the data and writes it into a Statistics object - * - * @param XMLfile: ConversionStats.xml - * @return a ArrayList of <Statistics> - */ - private static ArrayList<Statistics> executeImportXmlAndCalculateStatistics(String XMLfile) throws Exception { - ArrayList<Statistics> sampleStatisticsList = new ArrayList<>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: sampleStatisticsList (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - - </Project> - <Lane number="2"> - <TopUnknownBarcodes> - <Barcode count="150988002" sequence="NNNNNNN"/> - <Barcode count="167095" sequence="CCCCCCC"/> - <Barcode count="57859" sequence="CCCGTCC"/> - <Barcode count="49993" sequence="CCGATGT"/> - <Barcode count="42981" sequence="GTCCCGC"/> - <Barcode count="40446" sequence="TAAAATT"/> - <Barcode count="39962" sequence="CCAGATC"/> - <Barcode count="34688" sequence="GATGTAT"/> - <Barcode count="32013" sequence="AAAAAGT"/> - <Barcode count="30501" sequence="AGATCAT"/> - </TopUnknownBarcodes> - </Lane> - [...] - */ - -// Map<Integer, Map<String, Integer>> barcodesPerLane = null; - - try { - String errorMessage; - int event; - int skip; - String flowcellName = ""; - String projectName = ""; - String sampleName = ""; - String barcodeName = ""; - int laneNumber = 0; - int tileNumber; - Sample currentSample = null; - Statistics statistics; - SampleItem rawItem; - SampleItem pfItem; - Map<String, Integer> barcodesMap = new HashMap<>(); - Map<Integer, Map<String, Integer>> barcodesPerLane = new HashMap<>(); - - InputStream xmlFile = new FileInputStream(XMLfile); - XMLInputFactory xmlFactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlParser = xmlFactory.createXMLStreamReader(xmlFile); - - // Start-Tag "Stats": - event = xmlParser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlParser.getLocalName().equals("Stats")) { - errorMessage = - "STRANGE ERROR IN METHOD importXmlAndCalculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errorMessage); - } - - // Loop over potential Tags "Flowcell": - event = xmlParser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = xmlParser.getAttributeValue(0); - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Flowcell")) { - flowcellName = ""; - event = xmlParser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Project")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - //skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - projectName = xmlParser.getAttributeValue(0); - - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Project")) { - projectName = ""; - event = xmlParser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - sampleName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Sample")) { - sampleName = ""; - event = xmlParser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - if (xmlParser.getAttributeValue(0).equals("all")) { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) { - event = xmlParser.next(); - switch (event) { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else { - barcodeName = xmlParser.getAttributeValue(0); - } - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - barcodeName = ""; - event = xmlParser.nextTag(); - - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Lane")) { -// System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - laneNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - - // Now we have everything we need, we put it into a Sample - currentSample = new Sample(); - - if (sampleName.startsWith("Undetermined")) { - currentSample.Sample = sampleName + "_" + flowcellName + "_" + laneNumber; - } else { - currentSample.Sample = sampleName; - } - - currentSample.Flowcell = flowcellName; - currentSample.Lane = laneNumber; - currentSample.Project = projectName; - currentSample.Barcode = barcodeName; - event = xmlParser.nextTag(); -// System.out.println(currentSample.Sample); - - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Lane")) { - // Statistics 1st step: calculate individual statistics per sample: - statistics = new Statistics(currentSample); - if (!currentSample.Project.equals("")) { - sampleStatisticsList.add(statistics); - } - currentSample = null; - statistics = null; - -// laneNumber = Double.NaN; - event = xmlParser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = Integer.parseInt(xmlParser.getAttributeValue(0)); - // concerning Raw with Assumption: Raw-element is singlechild: - xmlParser.nextTag(); - rawItem = new SampleItem(); - rawItem.Type = "Raw"; - rawItem.Lane = laneNumber; - rawItem.Tile = tileNumber; - xmlParser.nextTag(); - rawItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + rawItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - rawItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - rawItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + rawItem.YieldList.get(rawItem.YieldList.size()-1) + ", YieldQ30=" + rawItem.YieldQ30List.get(rawItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + rawItem.QualityScoreSumList.get(rawItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + rawItem); - currentSample.RawList.add(rawItem); - - - rawItem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlParser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - pfItem = new SampleItem(); - pfItem.Type = "Pf"; - pfItem.Lane = laneNumber; - pfItem.Tile = tileNumber; - xmlParser.nextTag(); - pfItem.ClusterCount = Integer.parseInt(xmlParser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + pfItem.ClusterCount); - xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Read")) { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlParser.nextTag(); - pfItem.YieldList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.YieldQ30List.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - pfItem.QualityScoreSumList.add(Double.parseDouble(xmlParser.getElementText())); - xmlParser.nextTag(); - xmlParser.nextTag(); - //System.out.println("Values in Read: Yield=" + pfItem.YieldList.get(pfItem.YieldList.size()-1) + ", YieldQ30=" + pfItem.YieldQ30List.get(pfItem.YieldQ30List.size()-1) + ", QualityScoreSum=" + pfItem.QualityScoreSumList.get(pfItem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + pfItem); - currentSample.PfList.add(pfItem); - pfItem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlParser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Tile")) { - tileNumber = 0; - event = xmlParser.nextTag(); - - - } else if (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - event = xmlParser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlParser.getLocalName().equals("Barcode")) { - Integer numberOfBarcodes = Integer.valueOf((xmlParser.getAttributeValue(0))); - String barcode = xmlParser.getAttributeValue(1); - barcodesMap.put(barcode, numberOfBarcodes); - xmlParser.nextTag(); - event = xmlParser.nextTag(); - } - - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("TopUnknownBarcodes")) { - - barcodesPerLane.put(laneNumber, barcodesMap); - event = xmlParser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlParser.getLocalName().equals("Stats")) { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlParser.close(); - - } catch (FileNotFoundException | XMLStreamException | IllegalArgumentException e) { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } - return sampleStatisticsList; - } - - public static HashMap<Integer, LaneStatistics> calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - HashMap<Integer, LaneStatistics> listOfLaneStatistics= new HashMap<Integer, LaneStatistics>(); - - HashMap<Integer, ArrayList<Statistics>> groupedList = groupByLane(samplestatisticslist); - - for (Integer key : groupedList.keySet()) { - - LaneStatistics laneStats = new LaneStatistics(groupedList.get(key)); - laneStats.calculateOverallStats(key); - listOfLaneStatistics.put(key, laneStats); - } - return listOfLaneStatistics; - } - - - private static HashMap<Integer, ArrayList<Statistics>> groupByLane(ArrayList<Statistics> samplestatisticslist) { - // Group ArrayList by Lane - HashMap<Integer, ArrayList<Statistics>> groupedList = new HashMap <Integer, ArrayList<Statistics>>(); - for (Statistics s : samplestatisticslist) { - - if (groupedList.containsKey(s.Lane)) { - groupedList.get(s.Lane).add(s); - } - else { - ArrayList <Statistics> newEntry = new ArrayList<Statistics>(); - newEntry.add(s); - groupedList.put(s.Lane, newEntry); - } - } - return groupedList; - } - - - // ########################################################## - - private static class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - public Integer Lane = 0; - - public Integer Tile = 0; - - public Integer ClusterCount = 0; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<>(); - - public List<Double> YieldQ30List = new ArrayList<>(); - - public List<Double> QualityScoreSumList = new ArrayList<>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public static class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public Integer Lane = 0; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<>(); - - public List<SampleItem> PfList = new ArrayList<>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: " + this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public static class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public Integer Sum_RawClusterCount = 0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Lane = sample.Lane; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Lane: "+ this.Lane + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount + "\n"; - } - - public void adaptStatisticsWithRespectToAllSamples(ArrayList<Statistics> statisticslist, HashMap<Integer, ArrayList<Statistics>> groupedList) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT" + - " IN METHOD adaptStatisticsWithRespectToAllSamples!"; - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - for (Integer key : groupedList.keySet()) { - double sumAllRawClusterCounts = 0; - ArrayList<Statistics> groupList = groupedList.get(key); - for (Statistics element : groupList) { - sumAllRawClusterCounts += element.Sum_RawClusterCount; - } - for (Statistics element : groupList) { - element.Percentage_RawClusterCount_AllRawClusterCounts = - calculate_Percentage(element.Sum_RawClusterCount, sumAllRawClusterCounts); - } - } - } - } - - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = 0.0; - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = 0.0; - } - return z; - } - } - - public static class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public Integer Lane = 0; - - public double Sum_RawClusterCount = 0.0; - - public Integer Sum_PfClusterCount = 0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats(Integer key) - { - int sampleNumber = statisticsList.size(); - for (Statistics s : statisticsList) { - if (!s.Barcode.equals("") || s.Barcode.equals("unknown")) { - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - if (!Double.isNaN(s.Percentage_PfYieldQ30_PfYield)) { - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - } - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - - this.Lane = key; - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Lane " + this.Lane + " Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount " + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield + - " Percentage_PfClusterCount_RawClusterCount " + this.Percentage_PfClusterCount_RawClusterCount; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties deleted file mode 100644 index 102a5fe3f83..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/plugin.properties +++ /dev/null @@ -1,10 +0,0 @@ -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-demultiplex-stats-nextseq -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-demultiplex-stats-nextseq.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py deleted file mode 100755 index b66873933cb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read-demultiplex-stats-nextseq.py +++ /dev/null @@ -1,353 +0,0 @@ -''' -@copyright: 2012 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle - -@note: print statements go to ~/openbis/servers/datastore_server/log/startup_log.txt - -''' - -import time -import math -import os -import fnmatch -# Load Java-Library to import XML data: -import read_demultiplex_stats -# Load openBIS-Libraries: -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - - -def process(transaction): - ''' - Main method in corresponding openBIS dropbox - ''' - - # Constants: - XML_FILENAME = 'ConversionStats.xml' - TYPE_DATASET = 'FASTQ_GZ' - INDEX_NO = 'NOINDEX' - INDEX_UNKNOWN = 'UNKNOWN' - INDEX_EMPTY = '' - CODE_INDEX1 = 'BARCODE' - CODE_INDEX2 = 'INDEX2' - CODE_INDEX1LENGTH = 'INDEXREAD' - CODE_INDEX2LENGTH = 'INDEXREAD2' - BARCODE_SPLIT_CHAR = "+" - - - ########################################################## - def locate(pattern, root): - '''Locate all files matching supplied filename pattern in and below supplied root directory.''' - for path, dirs, files in os.walk(os.path.abspath(root)): - for filename in fnmatch.filter(files, pattern): - yield os.path.join(path, filename) - - ########################################################## - def getInfoVocabularyTerms(vocabularyCode): - ''' - Get information about Terms of certain Vocabulary in openBIS. - Input: - - vocabularyCode: code of Vocabulary to be investigated - Output: - - vocabularyTerms: list of Terms in Vocabulary - ''' - vocabulary = transaction.getSearchService().searchForVocabulary(vocabularyCode) - - vocabularyTerms = [] - if (vocabulary is None): - print '\nOCCURRED EXCEPTION: Vocabulary %s does not exist' % (vocabularyCode) - else: - for term in vocabulary.getTerms(): - vocabularyTerms.append(term.getCode()) - vocabularyTerms.sort() - - return vocabularyTerms - - ########################################################## - def getInfoSampleProperties(sampleCode): - ''' - Get information about Properties of certain Sample in openBIS. - Input: - - sampleCode: code of Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - foundSamples = ss.searchForSamples(scSample) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundSamples.size() == 1 - properties = foundSamples[0].getSample().getProperties() - for p in properties: - codeProperty = p.getPropertyType().getSimpleCode() - propertiesCode.append(codeProperty) - propertiesCodeValue[codeProperty] = p.getValue() - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundSamples.size()) + ' Samples found which match the criteria code \"' + sampleCode + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getInfoDataSetPropertiesOfSample(sampleCode): - ''' - Get information about Properties of some DataSet of certain Sample in openBIS. - Input: - - sampleCode: code of DataSet's Sample to be investigated - Outputs: - - propertiesCode: list of Properties' codes - - propertiesCodeValue: dictionary of Properties' codes and values - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - propertiesCode = [] - propertiesCodeValue = {} - try: - assert foundDataSets.size() > 0 - codeProperties = foundDataSets[0].getAllPropertyCodes() - for cp in codeProperties: - propertiesCode.append(cp) - propertiesCodeValue[cp] = foundDataSets[0].getPropertyValue(cp) - propertiesCode.sort() - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleCode + '\" and type \"' + TYPE_DATASET + '\".') - - return propertiesCode, propertiesCodeValue - - ########################################################## - def getIndexesOfDataSetsOfSample(sampleFlowLaneCode): - ''' - Get both indexes (parts of barcode) of all DataSets of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - Outputs: - - indexes1: list of first index of DataSets - - indexes2: list of second index of DataSets - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSamples = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - - indexes1 = [] - indexes2 = [] - try: - assert foundDataSets.size() > 0 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(foundDataSets.size()) + ' DataSets found which Sample match the criteria code \"' + sampleFlowLaneCode + '\" and type \"' + TYPE_DATASET + '\".') - for ds in foundDataSets: - indexes1.append(ds.getPropertyValue(CODE_INDEX1)) - indexes2.append(ds.getPropertyValue(CODE_INDEX2)) - - return indexes1, indexes2 - - ########################################################## - def searchDataSetsOfSample(sampleFlowLaneCode, index1, index2): - ''' - Search DataSets by corresponding indexes (parts of barcode) of certain FlowLane-Sample in openBIS. - Inputs: - - sampleFlowLaneCode: code of DataSet's Sample - - index1: first index of DataSet - - index2: second index of DataSet - Output: - - foundDataSets: DataSets corresponding to inputs and constant TYPE_DATASET - ''' - ss = transaction.getSearchService() - - scSample = SearchCriteria() - scSample.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sampleFlowLaneCode)); - #foundSample = ss.searchForSamples(scSample) - - scDataSet = SearchCriteria() - scDataSet.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, TYPE_DATASET)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX1, index1)) - scDataSet.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch(CODE_INDEX2, index2)) - scDataSet.addSubCriteria(SearchSubCriteria.createSampleCriteria(scSample)) - foundDataSets = ss.searchForDataSets(scDataSet) - for ds in foundDataSets: - print "Index1 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX1) - print "Index2 of found DataSet " + ds.getDataSetCode() + ": " + ds.getPropertyValue(CODE_INDEX2) - - return foundDataSets - - ########################################################## - def reversecomplement(sequence): - ''' - Reverse sequence and replace each nucleotide by its complement. - Input: - - sequence: sequence of nucleotides - Output: - - reverse_complement_sequence: reversed and complemented sequence - ''' - lookup_table = {'A': 'T', 'T': 'A', 'G': 'C', 'C': 'G'} - reverse_complement_sequence = '' - for nucleotide in reversed(sequence): - reverse_complement_sequence += lookup_table[nucleotide] - return reverse_complement_sequence - - ########################################################## - - def sampleSearch(transaction, code=''): - sc = SearchCriteria() - numberOfLanes = 0 - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, code)); - search_service = transaction.getSearchService() - flowcell = search_service.searchForSamples(sc) - if flowcell.size() > 0: - # Search for contained samples - sampleSc = SearchCriteria() - sampleSc.addSubCriteria(SearchSubCriteria.createSampleContainerCriteria(sc)) - lanes = search_service.searchForSamples(sampleSc) - numberOfLanes = lanes.size() - return flowcell, lanes, numberOfLanes - - ########################################################## - - def updateLane(transaction, codeSampleFlowCell, totalLaneStatistics): - - flowcell, lanes, numberOfLanes = sampleSearch(transaction, codeSampleFlowCell) - lane = lanes[0] - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - print("Setting Complete Lanes Statistics For: " + lane.getSampleIdentifier()) - - mutable_lane.setPropertyValue("YIELD_MBASES", str(int(totalLaneStatistics.Sum_PfYield))) - mutable_lane.setPropertyValue('RAW_YIELD_MBASES', str(int(totalLaneStatistics.Sum_RawYield))) - mutable_lane.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(int(totalLaneStatistics.Percentage_PfClusterCount_RawClusterCount))) - mutable_lane.setPropertyValue('PF_READS_SUM',str(int(totalLaneStatistics.Sum_PfClusterCount))) - mutable_lane.setPropertyValue('RAW_READS_SUM',str(int(totalLaneStatistics.Sum_RawClusterCount))) - mutable_lane.setPropertyValue('PFYIELDQ30PERCENTAGE', str(int(totalLaneStatistics.Percentage_PfYieldQ30_PfYield))) - mutable_lane.setPropertyValue('PFMEANQUALITYSCORE', str(totalLaneStatistics.Fraction_PfQualityScoreSum_PfYield)) - mutable_lane.setPropertyValue('CLUSTERS_PF_WITHOUT_NOINDEX', str(int(totalLaneStatistics.Clusters_PfWithoutNoindex))) - - ########################################################## - - print('\nPROCESS RUNNING '+time.ctime()) - incomingPath = transaction.getIncoming().getPath() - FileGenerator= locate(XML_FILENAME, incomingPath) - xmlfile = FileGenerator.next() - print "File: " + xmlfile - - # Import data of XML file (independent of openBIS data): - JavaClassToProcessXML = read_demultiplex_stats() # this function is implemented as Class in Java: - samplestatisticslist = JavaClassToProcessXML.importXMLdata_and_calculateStatistics(xmlfile) - totalLaneStatistics = JavaClassToProcessXML.calculateTotalLaneStatistics(samplestatisticslist) - - if len(samplestatisticslist) == 0: - print "\nNo Projects/Samples/Barcodes are contained in XML-file " + xmlfile + "!" - return - - # Prepare links between XML and openBIS w.r.t. Samples: - codeSampleFlowCell = samplestatisticslist[0].Flowcell # expect just one equal FlowCell of all imported datasets - codeSampleFlowLane = samplestatisticslist[0].Flowcell + ":1" # expect just one equal FlowLane of all imported datasets - - updateLane(transaction, codeSampleFlowCell, totalLaneStatistics) - - # Prepare links between XML and openBIS w.r.t to indexes in DataSet (openBIS): - index1list, index2list = getIndexesOfDataSetsOfSample(codeSampleFlowLane) - propertiesCode, propertiesCodeValue = getInfoSampleProperties(codeSampleFlowCell) - index1length = int(propertiesCodeValue[CODE_INDEX1LENGTH]) - index2length = int(propertiesCodeValue[CODE_INDEX2LENGTH]) - - nprocessedDataSets = 0 - for s in samplestatisticslist: - print "\nContent in XML file:\n", s - print "Connection to openBIS:" - - # Prepare link between XML and openBIS w.r.t to indexes in Barcode (XML): - indexes = s.Barcode.split(BARCODE_SPLIT_CHAR) - if len(indexes) == 1: # only first part in Barcode - index1search = indexes[0].upper() - index2search = INDEX_EMPTY - elif len(indexes) == 2: # both parts in Barcode - index1search = indexes[0].upper() - index2search = indexes[1].upper() - else: - index1search = INDEX_EMPTY - index2search = INDEX_EMPTY - - # Set link between XML and openBIS w.r.t to indexes in DataSet (openBIS): - if index1search == INDEX_EMPTY or index1search == INDEX_UNKNOWN: - index1 = INDEX_NO - else: # Hint: just two cases were known about index1length, that is 8 or 6 - if index1length > 7: - index1 = [ index1 for index1 in index1list if index1search == index1 ] - else: # for smaller indexlength, the index is by 1 shorter in XML-file than in openBIS - index1 = [ index1 for index1 in index1list if index1search == index1[:index1length] ] - try: - index1 = index1[0] - except: - print '\nOCCURRED EXCEPTION: First index \"' + index1search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index1 = 'MISSING' - if index2search == INDEX_EMPTY or index2search == INDEX_UNKNOWN: - index2 = INDEX_NO - else: # Hint: just one case was known about index2length, that is 8 - if index2length > 7: # second and larger index must be reversed and complemented in contrast to first or smaller index - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - else: # second and smaller index is unknown how to handle - index2 = [ index2 for index2 in index2list if reversecomplement(index2search) == index2 ] - try: - index2 = index2[0] - except: - print '\nOCCURRED EXCEPTION: Second index \"' + index2search + '\" of Barcode in XML file has no corresponding DataSet in openBIS!' - index2 = 'MISSING' - - # Get DataSet of openBIS corresponding to Project/Sample/Barcode of XML file: - correspondingDataSet = searchDataSetsOfSample(codeSampleFlowLane, index1, index2) - try: - assert correspondingDataSet.size() == 1 - except AssertionError: - print ('\nOCCURRED EXCEPTION: ' + str(correspondingDataSet.size()) + ' DataSets found which Sample match the criteria index1 \"' + str(index1) + '\" and index2 \"' + str(index2) + '\" and code \"' + codeSampleFlowLane + '\" and type \"' + TYPE_DATASET + '\".') - continue - - # Modify Properties of corresponding DataSet: - # (method setPropertyValue requires Strings as Input, but Number format must fit to Properties already defined in openBIS) - ds = transaction.getDataSetForUpdate(correspondingDataSet[0].getDataSetCode()) - ds.setPropertyValue('YIELD_MBASES', str(int(s.Mega_PfYield))) - ds.setPropertyValue('RAW_YIELD_MBASES', str(int(s.Mega_RawYield))) - ds.setPropertyValue('PERCENTAGE_PASSED_FILTERING',str(s.Percentage_PfClusterCount_RawClusterCount)) - ds.setPropertyValue('PF_READS_SUM',str(int(s.Sum_PfClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('RAW_READS_SUM',str(int(s.Sum_RawClusterCount))) # convert first to Integer, then to String - ds.setPropertyValue('PERCENTAGE_RAW_CLUSTERS_PER_LANE', str(s.Percentage_RawClusterCount_AllRawClusterCounts)) - ds.setPropertyValue('PFYIELDQ30PERCENTAGE', str(s.Percentage_PfYieldQ30_PfYield)) - ds.setPropertyValue('PFMEANQUALITYSCORE', str(s.Fraction_PfQualityScoreSum_PfYield)) - print "Properties in DataSet \"" + correspondingDataSet[0].getDataSetCode() + "\" are modified." - nprocessedDataSets += 1 - - print "\n", nprocessedDataSets, " openBIS-DataSets were processed." - print len(samplestatisticslist), " XML-Projects/-Samples/-Barcodes were processed." - print("PROCESS DONE "+time.ctime()) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java deleted file mode 100644 index e10a38ce32f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_stats.java +++ /dev/null @@ -1,727 +0,0 @@ -/* -@copyright: 2015 ETH Zuerich, CISD - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: Fabian Gemperle -@autor: Manuel Kohler - -@note: This Class is in Jython importable as Java-Library after compiling it. - In compilation 4 Class files arise: - - read_demultiplex_stats.class - - read_demultiplex_stats$SampleItem.class - - read_demultiplex_stats$Sample.class - - read_demultiplex_stats$Statistics.class - */ - -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLStreamConstants; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamReader; - -//########################################################## - -public final class read_demultiplex_stats -{ - - public List<Statistics> importXMLdata_and_calculateStatistics(String XMLfile) - { - - ArrayList<Statistics> samplestatisticslist = new ArrayList<Statistics>(); - - /*Parse corresponding XML file, put all values into a memory structure, calculate statistics overall samples. - Output: samplestatisticslist (list of Sample-Statistics-Objects) - Input: XMLfile having structure of file ConversionStats.xml (Example of 1.10.2014): - <?xml version="1.0" encoding="utf-8"?> => Assumptions about XML structure: - <Stats> => Element is singlechild - <Flowcell flowcell-id="H0YVKBGXX"> => Element is singlechild - <Project name="BSSE_QGF_23096_H0YVKBGXX_1"> => Element is one of many children, additionally there is summary-element with attribute name="all" - <Sample name="BSSE_QGF_23096_H0YVKBGXX_1_PZ27_PZ33_CelSEQ_"> => Element is singlechild except second summary-element with attribute name="all" - <Barcode name="unknown"> => Element is singlechild except second summary-element with attribute name="all" - <Lane number="1"> => Element is one of several children - <Tile number="11101"> => Element is one of many children - <Raw> => Element is singlechild - <ClusterCount>328653</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16162292</YieldQ30> => Element is singlechild - <QualityScoreSum>703070796</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>24977628</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Raw> - <Pf> => Element is singlechild - <ClusterCount>302121</ClusterCount> => Element is singlechild - <Read number="1"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>15842531</YieldQ30> => Element is singlechild - <QualityScoreSum>686898532</QualityScoreSum> => Element is singlechild - </Read> - <Read number="2"> => Element is one of several children - <Yield>22961196</Yield> => Element is singlechild - <YieldQ30>16233173</YieldQ30> => Element is singlechild - <QualityScoreSum>699507245</QualityScoreSum> => Element is singlechild - </Read> - </Pf> - </Tile> - <Tile number="11102"> - [...] - */ - - try - { - - // temporary variables (frequently changing during XML-read-in): - String errormessage = ""; - int event = 0; - int skip = 0; - String curflowcellname = ""; - String curprojectname = ""; - String cursamplename = ""; - String curbarcodename = ""; - double curlanenumber = Double.NaN; // obvious double, but could be turned into int - double curtilenumber = Double.NaN; // obvious double, but could be turned into int - Sample cursample = null; - Statistics curstatistics = null; - SampleItem currawitem = null; - SampleItem curpfitem = null; - - InputStream xmlfile = new FileInputStream(XMLfile); - XMLInputFactory xmlfactory = XMLInputFactory.newInstance(); - XMLStreamReader xmlparser = xmlfactory.createXMLStreamReader(xmlfile); - - // Start-Tag "Stats": - event = xmlparser.nextTag(); // Assumption: just white space or comments are aside explicit start-tag - if (event != XMLStreamConstants.START_ELEMENT || !xmlparser.getLocalName().equals("Stats")) - { - errormessage = - "STRANGE ERROR IN METHOD importXMLdata_and_calculateStatistics WHEN READING IN XMLFILE. => CHECK CODE AND XMLFILE-STRUCTURE! Got " + event; - throw new Exception(errormessage); - } - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - - // Loop over potential Tags "Flowcell": - event = xmlparser.nextTag(); // Assumption: just white spaces or comments are aside start- or end-tag - // List<Statistics> samplestatistics = new ArrayList<Statistics>(); - boolean doimport = true; - while (doimport) - { - // concerning tag Flowcell: - if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Flowcell")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curflowcellname = xmlparser.getAttributeValue(0); // Assumption: Flowcell-attribute flowcell-id is just string - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Flowcell")) - { - curflowcellname = ""; - event = xmlparser.nextTag(); - - // concerning tag Project: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Project")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; - default: - skip += 0; // text elements, spaces, ... - break; - } - } - } else - { - curprojectname = xmlparser.getAttributeValue(0); // Assumption: Project-attribute name is just string - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Project")) - { - curprojectname = ""; - event = xmlparser.nextTag(); - - // concerning tag Sample: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Sample")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; // break-command after each case is necessary in switch-statement - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; // break-command after each case is necessary in switch-statement - default: - skip += 0; // text elements, spaces, ... - break; // break-command after each case is necessary in switch-statement - } - } - } else - { - cursamplename = xmlparser.getAttributeValue(0); // Assumption: Sample-attribute name is just string - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Sample")) - { - cursamplename = ""; - event = xmlparser.nextTag(); - - // concerning tag Barcode (which is as well the start/end of Project-/Sample-Entry): - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Barcode")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - if (xmlparser.getAttributeValue(0).equals("all")) - { - // skip the current XML element and all of its following subelements: - skip = 1; - while (skip > 0) - { - event = xmlparser.next(); - switch (event) - { - case XMLStreamConstants.END_ELEMENT: - skip -= 1; - break; // break-command after each case is necessary in switch-statement - case XMLStreamConstants.START_ELEMENT: - skip += 1; - break; // break-command after each case is necessary in switch-statement - default: - skip += 0; // text elements, spaces, ... - break; // break-command after each case is necessary in switch-statement - } - } - } else - { - curbarcodename = xmlparser.getAttributeValue(0); // Assumption: Barcode-attribute name is just string - cursample = new Sample(); - cursample.Flowcell = curflowcellname; - cursample.Project = curprojectname; - cursample.Sample = cursamplename; - cursample.Barcode = curbarcodename; - } - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Barcode")) - { - // Statistics 1st step: calculate individual statistics per sample: - curstatistics = new Statistics(cursample); - samplestatisticslist.add(curstatistics); - cursample = null; - curstatistics = null; - curbarcodename = ""; - event = xmlparser.nextTag(); - - // concerning Lane: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Lane")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curlanenumber = Double.parseDouble(xmlparser.getAttributeValue(0)); // Assumption:Lane-attribute number is always numeric - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Lane")) - { - curlanenumber = Double.NaN; - event = xmlparser.nextTag(); - - // concerning Tile with all its sub-elements: - } else if (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Tile")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - curtilenumber = Double.parseDouble(xmlparser.getAttributeValue(0)); // Assumption: Tile-attribute number is always numeric - // concerning Raw with Assumption: Raw-element is singlechild: - xmlparser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - currawitem = new SampleItem(); - currawitem.Type = "Raw"; - currawitem.Lane = curlanenumber; - currawitem.Tile = curtilenumber; - xmlparser.nextTag(); - currawitem.ClusterCount = Double.parseDouble(xmlparser.getElementText()); // Assumption: ClusterCount-element is numeric singlechild - //System.out.println("\nValue: ClusterCount=" + currawitem.ClusterCount); - xmlparser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Read")) - { // Assumption: at least or more than 1 Read-element - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlparser.nextTag(); - currawitem.YieldList.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: Yield-element is numeric singlechild - xmlparser.nextTag(); - currawitem.YieldQ30List.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: YieldQ30List-element is numeric singlechild - xmlparser.nextTag(); - currawitem.QualityScoreSumList.add(Double.parseDouble(xmlparser.getElementText())); // Assumption: QualityScoreSumList-element is numeric singlechild - xmlparser.nextTag(); - xmlparser.nextTag(); - //System.out.println("Values in Read: Yield=" + currawitem.YieldList.get(currawitem.YieldList.size()-1) + ", YieldQ30=" + currawitem.YieldQ30List.get(currawitem.YieldQ30List.size()-1) + ", QualityScoreSum=" + currawitem.QualityScoreSumList.get(currawitem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nRaw-SampleItem " + currawitem); - cursample.RawList.add(currawitem); - currawitem = null; - // concerning Pf with Assumption that entire Pf-element is structured same as Raw: - xmlparser.nextTag(); - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName()); - curpfitem = new SampleItem(); - curpfitem.Type = "Pf"; - curpfitem.Lane = curlanenumber; - curpfitem.Tile = curtilenumber; - xmlparser.nextTag(); - curpfitem.ClusterCount = Double.parseDouble(xmlparser.getElementText()); - //System.out.println("\nValue: ClusterCount=" + curpfitem.ClusterCount); - xmlparser.nextTag(); - while (event == XMLStreamConstants.START_ELEMENT && xmlparser.getLocalName().equals("Read")) - { - //System.out.println("\nStart-Element with tag " + xmlparser.getLocalName() + " with " + xmlparser.getAttributeCount() + " attributes with first attribute: " + xmlparser.getAttributeLocalName(0) +" = " + xmlparser.getAttributeValue(0)); - xmlparser.nextTag(); - curpfitem.YieldList.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - curpfitem.YieldQ30List.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - curpfitem.QualityScoreSumList.add(Double.parseDouble(xmlparser.getElementText())); - xmlparser.nextTag(); - xmlparser.nextTag(); - //System.out.println("Values in Read: Yield=" + curpfitem.YieldList.get(curpfitem.YieldList.size()-1) + ", YieldQ30=" + curpfitem.YieldQ30List.get(curpfitem.YieldQ30List.size()-1) + ", QualityScoreSum=" + curpfitem.QualityScoreSumList.get(curpfitem.QualityScoreSumList.size()-1)); - } - //System.out.println("\nPf-SampleItem " + curpfitem); - cursample.PfList.add(curpfitem); - curpfitem = null; - // attain end of current Tile and afterwards continue in next Tile/Lane/Barcode/Sample/Project: - event = xmlparser.nextTag(); - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Tile")) - { - curtilenumber = Double.NaN; - event = xmlparser.nextTag(); - - // concerning finish of reading in XML or hit upon error due XML content: - } else if (event == XMLStreamConstants.END_ELEMENT && xmlparser.getLocalName().equals("Stats")) - { - // this final part of while loop is just for analyzing potential errors, but - // could be removed and changed in: while xmlparser.getLocalName() != 'Stats' - doimport = false; - } else - { - doimport = false; - System.out.println("Warning: Different XML structure than expectet. Got event: " + event); - } - } - xmlparser.close(); - - } catch (FileNotFoundException | XMLStreamException e) - { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } catch (IllegalArgumentException e) - { - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } catch (Exception e) - { // catch any other exception - System.out.println("OCCURRED EXCEPTION " + e.toString()); - e.printStackTrace(); - } finally - { // anyway adapt statistics and return output (It would be empty list due to constructor of this object) - // Statistics 2nd step: adapt single sample's statistics including entire list of samples - for (Statistics s : samplestatisticslist) - s.adaptStatisticsWithRespectToAllSamples(samplestatisticslist); - } - return samplestatisticslist; - - } - - public LaneStatistics calculateTotalLaneStatistics(ArrayList<Statistics> samplestatisticslist) - { - LaneStatistics laneStats = new LaneStatistics(samplestatisticslist); - laneStats.calculateOverallStats(); - return laneStats; - } - - // ########################################################## - - public class SampleItem - { - /* - * Object of an item in sample including - the corresponding type Raw or Pf - the index of corresponding Lane, Tile - measured value of - * ClusterCount and values in Lists (w.r.t. Read) of Yield, YieldQ30, QualityScoreSum - */ - - public String Type = ""; - - // Define unknown numerical value. Type double could be exchanged with int, but double is necessary to initialize NaN-value. - public double Lane = Double.NaN; - - public double Tile = Double.NaN; - - public double ClusterCount = Double.NaN; - - // Define unknown ArrayList of numerical values with changeable List size. Type Double(object) instead of double(primitive) is necessary in - // Lists. - public List<Double> YieldList = new ArrayList<Double>(); - - public List<Double> YieldQ30List = new ArrayList<Double>(); - - public List<Double> QualityScoreSumList = new ArrayList<Double>(); - - public String toString() - { - return "Type: " + this.Type + ", Lane: " + (long) this.Lane + ", Tile: " + (long) this.Tile - + ", ClusterCount: " + (long) this.ClusterCount + ", YieldList: " + this.YieldList - + ", YieldQ30List: " + this.YieldQ30List + ", QualityScoreSumList: " + this.QualityScoreSumList; - } - - } - - // ########################################################## - - public class Sample - { - /* - * Object of an entire sample including - the name of Flowcell, Project, Sample, Barcode - the list of Raw and Pf SampleItem-Objects - */ - - public String Flowcell = ""; - - public String Project = ""; - - public String Sample = ""; - - public String Barcode = ""; - - // Define unknown ArrayList of SampleItems: - public List<SampleItem> RawList = new ArrayList<SampleItem>(); - - public List<SampleItem> PfList = new ArrayList<SampleItem>(); - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", RawList: " + this.RawList + ", PfList: " + this.PfList; - } - - } - - // ########################################################## - - public class Statistics extends Sample - { - /* - * Object of Statistics within one single sample inherited from Sample-Object - */ - - public double Sum_RawClusterCount = Double.NaN; // obvious double, but could be turned into int - - public double Sum_PfClusterCount = Double.NaN; // obvious double, but could be turned into int - - public double Sum_RawYield = Double.NaN; - - public double Sum_PfYield = Double.NaN; - - public double Sum_RawYieldQ30 = Double.NaN; - - public double Sum_PfYieldQ30 = Double.NaN; - - public double Sum_RawQualityScoreSum = Double.NaN; - - public double Sum_PfQualityScoreSum = Double.NaN; - - public double Mega_RawYield = Double.NaN; // obvious double, but could be turned into int - - public double Mega_PfYield = Double.NaN; // obvious double, but could be turned into int - - public double Percentage_PfYield_RawYield = Double.NaN; - - public double Percentage_PfYieldQ30_PfYield = Double.NaN; - - public double Fraction_PfQualityScoreSum_PfYield = Double.NaN; - - public double Percentage_PfClusterCount_RawClusterCount = Double.NaN; - - public double Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - - public Statistics(Sample sample) - { - /* - * Constructor of derived class Initialization: Already initialized Sample-Object is necessary argument. - */ - - super(); - Flowcell = sample.Flowcell; - Project = sample.Project; - Sample = sample.Sample; - Barcode = sample.Barcode; - RawList = sample.RawList; - PfList = sample.PfList; - - if (RawList.size() > 0) - Sum_RawClusterCount = 0; - for (SampleItem s : RawList) - Sum_RawClusterCount += s.ClusterCount; - if (PfList.size() > 0) - Sum_PfClusterCount = 0; - for (SampleItem s : PfList) - Sum_PfClusterCount += s.ClusterCount; - if (RawList.size() > 0) - Sum_RawYield = 0; - for (SampleItem s : RawList) - for (double d : s.YieldList) - Sum_RawYield += d; - if (PfList.size() > 0) - Sum_PfYield = 0; - for (SampleItem s : PfList) - for (double d : s.YieldList) - Sum_PfYield += d; - if (RawList.size() > 0) - Sum_RawYieldQ30 = 0; - for (SampleItem s : RawList) - for (double d : s.YieldQ30List) - Sum_RawYieldQ30 += d; - if (PfList.size() > 0) - Sum_PfYieldQ30 = 0; - for (SampleItem s : PfList) - for (double d : s.YieldQ30List) - Sum_PfYieldQ30 += d; - if (RawList.size() > 0) - Sum_RawQualityScoreSum = 0; - for (SampleItem s : RawList) - for (double d : s.QualityScoreSumList) - Sum_RawQualityScoreSum += d; - if (PfList.size() > 0) - Sum_PfQualityScoreSum = 0; - for (SampleItem s : PfList) - for (double d : s.QualityScoreSumList) - Sum_PfQualityScoreSum += d; - // Mega_RawYield = calculate_MegaUnit(Sum_RawYield); - // Mega_PfYield = calculate_MegaUnit(Sum_PfYield); - - Mega_RawYield = Sum_RawYield; - Mega_PfYield = Sum_PfYield; - - Percentage_PfYield_RawYield = calculate_Percentage(Sum_PfYield, Sum_RawYield); - Percentage_PfYieldQ30_PfYield = calculate_Percentage(Sum_PfYieldQ30, Sum_PfYield); - Fraction_PfQualityScoreSum_PfYield = calculate_Fraction(Sum_PfQualityScoreSum, Sum_PfYield); - Percentage_PfClusterCount_RawClusterCount = calculate_Percentage(Sum_PfClusterCount, Sum_RawClusterCount); - // Calculation of attribute "Percentage_RawClusterCount_AllRawClusterCounts" needs statistics of all other included samples. => After - // initializing this object, apply method: adaptStatisticsWithRespectToAllSamples(statisticslist) - } - - public String toString() - { - return "Flowcell: " + this.Flowcell + ", Project: " + this.Project + ", Sample: " + this.Sample + ", Barcode: " + this.Barcode - + ", Raw Clusters: " + (long) this.Sum_RawClusterCount + ", Mbases Raw Yield: " + this.Mega_RawYield - + ", % Raw Clusters overall: " + this.Percentage_RawClusterCount_AllRawClusterCounts - + ", Pf Clusters: " + (long) this.Sum_PfClusterCount + ", Mbases Pf Yield: " + this.Mega_PfYield - + ", % PfYield/RawYield: " + this.Percentage_PfYield_RawYield - + ", % PfYieldQ30/PfYield: " + this.Percentage_PfYieldQ30_PfYield - + ", Mean Pf Quality Score: " + this.Fraction_PfQualityScoreSum_PfYield - + ", % Passes Filtering: " + this.Percentage_PfClusterCount_RawClusterCount; - } - - public void adaptStatisticsWithRespectToAllSamples(List<Statistics> statisticslist) - { - /* - * This Statistics-Object (corresponding to one sample) is adapted by employing a list of Statistics-Objects corresponding to all samples - * influencing the statistics of single sample. Input: statisticslist contains all Statistics-Objects - */ - if (statisticslist.size() == 0) - { // here it additionally should be checked, if calling object is included ... - Percentage_RawClusterCount_AllRawClusterCounts = Double.NaN; - String errormessage = - "INPUT ARGUMENT statisticslist MUST BE LIST OF Statistics OBJECTS INCLUDING THE CALLING OBJECT IN METHOD adaptStatisticsWithRespectToAllSamples!"; - // System.out.println(errormessage); - throw new IllegalArgumentException(errormessage); // Exception reasonable since otherwise wrong results. - } else - { - double sum_allrawclustercounts = 0; - for (Statistics s : statisticslist) - sum_allrawclustercounts += s.Sum_RawClusterCount; - Percentage_RawClusterCount_AllRawClusterCounts = calculate_Percentage(Sum_RawClusterCount, sum_allrawclustercounts); - } - } - - public double calculate_MegaUnit(double x) - { - double z; - if (x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY || Double.isNaN(x)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_MegaUnit! x = " + x + " (Values were in Sample " + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - z = x / 1000000; - } - return z; - } - - public double calculate_Percentage(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_Percentage! x = " + x + ", y = " + y + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - z = 100 * z; - } - return z; - } - - public double calculate_Fraction(double x, double y) - { - double z = x / y; - if (z == Double.POSITIVE_INFINITY || z == Double.NEGATIVE_INFINITY || Double.isNaN(z)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD calculate_Fraction! x = " + x + ", y = " + y + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } - return z; - } - - public double roundspecific(double x, int places) - { - double z; - if (places < 0 || places > 13 || x == Double.POSITIVE_INFINITY || x == Double.NEGATIVE_INFINITY || Double.isNaN(x)) - { - z = Double.NaN; - String errormessage = - "INPUT ARGUMENT WAS UNREASONABLE IN METHOD roundspecific! x = " + x + ", places = " + places + " (Values were in Sample " - + Sample + ")"; - // System.out.println(errormessage); - // throw new IllegalArgumentException(errormessage); - } else - { - double factor = Math.pow(10, places); - z = Math.round(x * factor); - z = z / factor; - } - return z; - } - - } - - public class LaneStatistics - { - /* - * Total Lane Statistics - */ - public ArrayList<Statistics> statisticsList; - - public double Sum_RawClusterCount = 0.0; - - public double Sum_PfClusterCount = 0.0; - - public double Sum_RawYield = 0.0; - - public double Sum_PfYield = 0.0; - - public double Sum_RawYieldQ30 = 0.0; - - public double Sum_PfYieldQ30 = 0.0; - - public double Sum_RawQualityScoreSum = 0.0; - - public double Sum_PfQualityScoreSum = 0.0; - - public double Percentage_PfYield_RawYield = 0.0; - - public double Percentage_PfYieldQ30_PfYield = 0.0; - - public double Fraction_PfQualityScoreSum_PfYield = 0.0; - - public double Percentage_PfClusterCount_RawClusterCount = 0.0; - - public double Percentage_RawClusterCount_AllRawClusterCounts = 0.0; - - public double Clusters_PfWithoutNoindex = 0.0; - - public LaneStatistics(ArrayList<Statistics> statisticsList) - { - this.statisticsList = statisticsList; - } - - public void calculateOverallStats() - { - - int sampleNumber = statisticsList.size(); - - for (Statistics s : statisticsList) - { - if (!s.Barcode.equals("unknown")) - { - System.out.println("BARCODE " + s.Barcode); - this.Clusters_PfWithoutNoindex += s.Sum_PfClusterCount; - System.out.println(s.Sum_PfClusterCount); - } - - this.Sum_RawClusterCount += s.Sum_RawClusterCount; - this.Sum_PfClusterCount += s.Sum_PfClusterCount; - this.Sum_RawYield += s.Sum_RawYield; - this.Sum_PfYield += s.Sum_PfYield; - this.Sum_RawYieldQ30 += s.Sum_RawYieldQ30; - this.Sum_PfYieldQ30 += s.Sum_PfYieldQ30; - this.Sum_RawQualityScoreSum += s.Sum_RawQualityScoreSum; - this.Sum_PfQualityScoreSum += s.Sum_PfQualityScoreSum; - this.Percentage_PfYield_RawYield += s.Percentage_PfYield_RawYield; - this.Percentage_PfYieldQ30_PfYield += s.Percentage_PfYieldQ30_PfYield; - this.Percentage_PfClusterCount_RawClusterCount += s.Percentage_PfClusterCount_RawClusterCount; - this.Fraction_PfQualityScoreSum_PfYield += s.Fraction_PfQualityScoreSum_PfYield; - } - this.Sum_RawQualityScoreSum = this.Sum_RawQualityScoreSum / sampleNumber; - this.Sum_PfQualityScoreSum = this.Sum_PfQualityScoreSum / sampleNumber; - this.Percentage_PfYield_RawYield = this.Percentage_PfYield_RawYield / sampleNumber; - this.Percentage_PfYieldQ30_PfYield = this.Percentage_PfYieldQ30_PfYield / (double) sampleNumber; - this.Percentage_PfClusterCount_RawClusterCount = this.Percentage_PfClusterCount_RawClusterCount / (double) sampleNumber; - this.Fraction_PfQualityScoreSum_PfYield = this.Fraction_PfQualityScoreSum_PfYield / (double) sampleNumber; - } - - public String toString() - { - return "Sum_RawClusterCount " + this.Sum_RawClusterCount + " Sum_PfClusterCount" + this.Sum_PfClusterCount + - " Percentage_PfYieldQ30_PfYield " + this.Percentage_PfYieldQ30_PfYield; - } - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java deleted file mode 100644 index bc409770abf..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/read_demultiplex_statsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -import static org.testng.AssertJUnit.assertEquals; - -public class read_demultiplex_statsTest { - - private String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - - - @org.testng.annotations.BeforeMethod - public void setUp() throws Exception { - } - - @org.testng.annotations.AfterMethod - public void tearDown() throws Exception { - - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - assertEquals(stat.size(), 39); - read_demultiplex_stats.Statistics eigth_element = stat.get(8); - assertEquals(eigth_element.Flowcell, "H2VYMBBXX"); - assertEquals(eigth_element.Barcode, "GCCAATA"); - assertEquals(eigth_element.Sum_RawClusterCount.intValue(), 27850973); - assertEquals(eigth_element.Sum_RawYield, 8.410993846E9); - assertEquals(eigth_element.Percentage_PfYieldQ30_PfYield, 87.6792784423112); - assertEquals(eigth_element.Fraction_PfQualityScoreSum_PfYield, 37.40267477898711); - assertEquals(eigth_element.Percentage_RawClusterCount_AllRawClusterCounts, 5.770060255141701); - } - - @org.testng.annotations.Test - public void testImportXmlAndCalculateStatistics_overall() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - Double percentage = 0.0; - for (read_demultiplex_stats.Statistics element : stat) { - if (element.Lane.equals(6)) { - percentage += element.Percentage_RawClusterCount_AllRawClusterCounts; - } - } - assertEquals(100.0, (double)Math.round(percentage * 1000) / 1000); - - } - - @org.testng.annotations.Test - public void testCalculateTotalLaneStatistics() throws Exception { - ArrayList<read_demultiplex_stats.Statistics> stat = - read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - - HashMap<Integer, read_demultiplex_stats.LaneStatistics> lanesStatistics = - read_demultiplex_stats.calculateTotalLaneStatistics(stat); - - read_demultiplex_stats.LaneStatistics lane2 = lanesStatistics.get(2); - assertEquals(lane2.Sum_RawClusterCount, 4.826808E8); - assertEquals(lane2.Sum_PfClusterCount.intValue(), 332293484); - assertEquals(lane2.Percentage_PfYieldQ30_PfYield, 86.14969791102051); - assertEquals(lane2.Percentage_PfClusterCount_RawClusterCount, 92.63902299583091); - } -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java deleted file mode 100644 index be097bcc3ed..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-demultiplex-stats-nextseq/start_read_demultiplex_stats.java +++ /dev/null @@ -1,21 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; - -public class start_read_demultiplex_stats { - - public static void main(String[] args) { - - String XMLfile = - "/Users/kohleman/Documents/workspace/datastore_server/targets/read-demultiplex-stats-nextseq/" + - "150724_J00121_0017_AH2VYMBBXX.sv/ConversionStats.xml"; - ArrayList<read_demultiplex_stats.Statistics> stat = null; - try { - stat = read_demultiplex_stats.importXmlAndCalculateStatistics(XMLfile); - } catch (Exception e) { - e.printStackTrace(); - } - HashMap<Integer, read_demultiplex_stats.LaneStatistics> ls = read_demultiplex_stats.calculateTotalLaneStatistics(stat); -// System.out.println(stat); -// System.out.println(ls); - } -} diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties deleted file mode 100644 index 98a7c8ff001..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/read-json -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-json.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py deleted file mode 100644 index dac56d3206c..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-json/read-json.py +++ /dev/null @@ -1,96 +0,0 @@ -''' -@copyright: -2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -import json - - -def get_json_from_file(file): - with open(file, 'r') as f: - read_json = f.read() - return json.loads(read_json)[0] - -def get_lane_count(json_string): - return int(json_string['lanecount']) - - -def get_flowcell_id(json_string): - return json_string['name'] - - -def register_in_openbis(transaction, json_string): - lane_count = get_lane_count(json_string) - flowcell_id = get_flowcell_id(json_string) - - found_flow_cell = search_unique_sample(transaction, flowcell_id) - search_service = transaction.getSearchService() - - flowcell = found_flow_cell[0] - - get_flowcell_with_contained_samples = search_service.getSample(flowcell.getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - lane_number = lane.getCode().split(":")[-1] - - try: - aligned_mean = json_string['cluster_lane_dict'][str(lane_number)]['aligned'][0]['mean'] - except KeyError: - print ("Problem occurred with aligned value for PhiX") - aligned_mean = -1 - - try: - cluster_density_mean = json_string['cluster_lane_dict'][str(lane_number)]['clusterDensity'][0]['mean'] - except KeyError: - print ("Problem occurred with cluster density") - cluster_density_mean = -1 - - try: - error_rate_mean = json_string['error_metrics'][str(lane_number)]['mean'] - except KeyError: - print ("Problem occurred with error rate") - error_rate_mean = -1 - - mutable_lane.setPropertyValue("PERC_PHIX_ALIGNED", str(aligned_mean)) - mutable_lane.setPropertyValue("CLUSTER_DENSITY", str(cluster_density_mean)) - mutable_lane.setPropertyValue("ERROR_RATE", str(error_rate_mean)) - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - - json_file = glob.glob(os.path.join(incoming_path, "*.json")) - - if json_file: - json_string = get_json_from_file(json_file[0]) - register_in_openbis(transaction, json_string) - else: - print("No json file found!") \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties deleted file mode 100644 index 2c8f40225a2..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/plugin.properties +++ /dev/null @@ -1,12 +0,0 @@ -# -# Drop box for registering a flow cell output as a data set -# -# Variables: -# incoming-root-dir -# Path to the directory which contains incoming directories for drop boxes. -incoming-dir = ${incoming-root-dir}/read-rta-timestamp -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = read-rta-timestamp.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py deleted file mode 100644 index 88851e92cc5..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/read-rta-timestamp/read-rta-timestamp.py +++ /dev/null @@ -1,67 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Reads out the timestamp of the RTAComplete.txt file to register the timestamp in openBIS - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import os -import sys -import shutil -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from os.path import basename - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -MARKER_RUN_COMPLETE = 'RTAComplete.txt' - -def process(transaction): - - print "HELLO PATH: " + str(sys.path) - - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - marker_file = os.path.join(incoming_path, MARKER_RUN_COMPLETE) - - found_samples = search_unique_sample(transaction, fc_id) - - sa = transaction.getSampleForUpdate(found_samples[0].getSampleIdentifier()) - sa.setPropertyValue("SEQUENCER_FINISHED", create_openbis_timestamp(marker_file)) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties deleted file mode 100644 index 86752d6d27d..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-fastqc -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-fastqc.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py deleted file mode 100644 index 7efc89630a5..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-fastqc/register-fastqc.py +++ /dev/null @@ -1,54 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("FASTQC") - dataSet.setMeasuredData(False) - - dataSet.setSample(connected_sample[0]) - - sa = transaction.getSampleForUpdate(connected_sample[0].getSampleIdentifier()) - sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties deleted file mode 100644 index 82d34c7fd9f..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowcell -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowcell.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py deleted file mode 100644 index 65ccad87004..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowcell/register-flowcell.py +++ /dev/null @@ -1,107 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -ILLUMINA_HISEQ_OUTPUT_DS_TYPE = "ILLUMINA_HISEQ_OUTPUT" -ILLUMINA_MISEQ_OUTPUT_DS_TYPE = "ILLUMINA_MISEQ_OUTPUT" -ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE = "ILLUMINA_NEXTSEQ_OUTPUT" - - -def get_bcl_version(file): - pattern = re.compile("bcl2fastq") - matching_line_list = [] - bcl_version = "Not specified" - number_of_lines_to_read = 3 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(pattern, line): - matching_line_list.append(line) - else: - print("File " + str(file) + " not found!") - - if matching_line_list: - bcl_version = matching_line_list[0].strip() - print("GOT BCL2FASTQ Version: " + bcl_version) - return bcl_version - - -def process(transaction): - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - model = get_model(run_id) - - if model in HISEQ_LIST: - DATASET_TYPE = ILLUMINA_HISEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.NEXTSEQ_500]: - DATASET_TYPE = ILLUMINA_NEXTSEQ_OUTPUT_DS_TYPE - elif model in [Sequencers.MISEQ]: - DATASET_TYPE = ILLUMINA_MISEQ_OUTPUT_DS_TYPE - else: - print("Could set a data set type for flowcell data!") - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - file = glob.glob(os.path.join(incoming_path, "nohup*")) - bcl_version = get_bcl_version(file) - - found_flow_cell = search_unique_sample(transaction, fc_id) - - search_service = transaction.getSearchService() - get_flowcell_with_contained_samples = search_service.getSample(found_flow_cell[0].getSampleIdentifier()) - flowlanes = get_flowcell_with_contained_samples.getContainedSamples() - - for lane in flowlanes: - mutable_lane = transaction.getSampleForUpdate(lane.getSampleIdentifier()) - mutable_lane.setPropertyValue("BCL_VERSION", bcl_version) - - dataSet = transaction.createNewDataSet(DATASET_TYPE) - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_flow_cell[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/a.out deleted file mode 100755 index c08fdbaeb8d8411a5ef60e9659dc30f12e6b5ff8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13120 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 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32 deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10567 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 DMv_I6 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32.sv deleted file mode 100755 index 7959ca94a1fa61e47c2e4df815bb35fceb7bd809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10567 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 DMv_I6 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c deleted file mode 100644 index b38d22d40f6..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/lib/crc32_v2.c +++ /dev/null @@ -1,206 +0,0 @@ -/*----------------------------------------------------------------------------*\ - * CRC-32 version 2.0.0 by Craig Bruce, 2006-04-29. - * - * This program generates the CRC-32 values for the files named in the - * command-line arguments. These are the same CRC-32 values used by GZIP, - * PKZIP, and ZMODEM. The Crc32_ComputeBuf() can also be detached and - * used independently. - * - * THIS PROGRAM IS PUBLIC-DOMAIN SOFTWARE. - * - * Based on the byte-oriented implementation "File Verification Using CRC" - * by Mark R. Nelson in Dr. Dobb's Journal, May 1992, pp. 64-67. - * - * v1.0.0: original release. - * v1.0.1: fixed printf formats. - * v1.0.2: fixed something else. - * v1.0.3: replaced CRC constant table by generator function. - * v1.0.4: reformatted code, made ANSI C. 1994-12-05. - * v2.0.0: rewrote to use memory buffer & static table, 2006-04-29. -\*----------------------------------------------------------------------------*/ - -#include <stdio.h> -#include <stdlib.h> - -/*----------------------------------------------------------------------------*\ - * Local functions -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ); - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ); - -/*----------------------------------------------------------------------------*\ - * NAME: - * main() - main function for CRC-32 generation - * DESCRIPTION: - * Computes the CRC-32 value for the set of files named in the command- - * line arguments. - * ARGUMENTS: - * argc - command-line-argument count - * argv - command-line-argument strings - * RETURNS: - * err - 0 on success or executes exit(1) on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -int main( int argc, const char *argv[] ) -{ - FILE *file = NULL; - const char *filename; - unsigned long argIdx; - unsigned long crc32; - int err; - - /** compute crcs **/ - if (argc < 2) { - /** read from 'stdin' if no arguments given **/ - err = Crc32_ComputeFile( stdin, &crc32 ); - if (err == -1) goto ERR_EXIT; - printf("crc32 = 0x%08lX for (stdin)\n", crc32 ); - } else { - /** report named files in sequence **/ - for (argIdx=1; argIdx < argc; argIdx++) { - filename = argv[argIdx]; - file = fopen( filename, "rb" ); - if (file == NULL) { - fprintf( stderr, "error opening file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - err = Crc32_ComputeFile( file, &crc32 ); - if (err == -1) goto ERR_EXIT; - /*printf("crc32 = 0x%08lX for \"%s\"\n", crc32, filename );*/ - printf("%08lX", crc32); - err = fclose( file ); - file = NULL; - if (err == EOF) { - fprintf( stderr, "error closing file \"%s\"!\n", filename ); - goto ERR_EXIT; - } - } - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - if (file != NULL) fclose( file ); - exit( 1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeFile() - compute CRC-32 value for a file - * DESCRIPTION: - * Computes the CRC-32 value for an opened file. - * ARGUMENTS: - * file - file pointer - * outCrc32 - (out) result CRC-32 value - * RETURNS: - * err - 0 on success or -1 on error - * ERRORS: - * - file errors -\*----------------------------------------------------------------------------*/ - -static int Crc32_ComputeFile( FILE *file, unsigned long *outCrc32 ) -{ -# define CRC_BUFFER_SIZE 8192 - unsigned char buf[CRC_BUFFER_SIZE]; - size_t bufLen; - - /** accumulate crc32 from file **/ - *outCrc32 = 0; - while (1) { - bufLen = fread( buf, 1, CRC_BUFFER_SIZE, file ); - if (bufLen == 0) { - if (ferror(file)) { - fprintf( stderr, "error reading file\n" ); - goto ERR_EXIT; - } - break; - } - *outCrc32 = Crc32_ComputeBuf( *outCrc32, buf, bufLen ); - } - return( 0 ); - - /** error exit **/ -ERR_EXIT: - return( -1 ); -} - -/*----------------------------------------------------------------------------*\ - * NAME: - * Crc32_ComputeBuf() - computes the CRC-32 value of a memory buffer - * DESCRIPTION: - * Computes or accumulates the CRC-32 value for a memory buffer. - * The 'inCrc32' gives a previously accumulated CRC-32 value to allow - * a CRC to be generated for multiple sequential buffer-fuls of data. - * The 'inCrc32' for the first buffer must be zero. - * ARGUMENTS: - * inCrc32 - accumulated CRC-32 value, must be 0 on first call - * buf - buffer to compute CRC-32 value for - * bufLen - number of bytes in buffer - * RETURNS: - * crc32 - computed CRC-32 value - * ERRORS: - * (no errors are possible) -\*----------------------------------------------------------------------------*/ - -static unsigned long Crc32_ComputeBuf( unsigned long inCrc32, const void *buf, - size_t bufLen ) -{ - static const unsigned long crcTable[256] = { - 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535, - 0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD, - 0xE7B82D07,0x90BF1D91,0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D, - 0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC, - 0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,0x3B6E20C8,0x4C69105E,0xD56041E4, - 0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C, - 0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,0x26D930AC, - 0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F, - 0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB, - 0xB6662D3D,0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F, - 0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB, - 0x086D3D2D,0x91646C97,0xE6635C01,0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E, - 0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA, - 0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,0x4DB26158,0x3AB551CE, - 0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A, - 0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9, - 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409, - 0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81, - 0xB7BD5C3B,0xC0BA6CAD,0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739, - 0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8, - 0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,0xF00F9344,0x8708A3D2,0x1E01F268, - 0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0, - 0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,0xD6D6A3E8, - 0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B, - 0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF, - 0x4669BE79,0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703, - 0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7, - 0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A, - 0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE, - 0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,0x86D3D2D4,0xF1D4E242, - 0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6, - 0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45, - 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D, - 0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5, - 0x47B2CF7F,0x30B5FFE9,0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605, - 0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94, - 0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D }; - unsigned long crc32; - unsigned char *byteBuf; - size_t i; - - /** accumulate crc32 for buffer **/ - crc32 = inCrc32 ^ 0xFFFFFFFF; - byteBuf = (unsigned char*) buf; - for (i=0; i < bufLen; i++) { - crc32 = (crc32 >> 8) ^ crcTable[ (crc32 ^ byteBuf[i]) & 0xFF ]; - } - return( crc32 ^ 0xFFFFFFFF ); -} - -/*----------------------------------------------------------------------------*\ - * END OF MODULE: crc32.c -\*----------------------------------------------------------------------------*/ diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties deleted file mode 100644 index 8f519c1de0b..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-flowlane -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-flowlane.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py deleted file mode 100644 index 501a3ee66a3..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-flowlane/register-flowlane.py +++ /dev/null @@ -1,477 +0,0 @@ -''' -@copyright: -2016 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - - -import os -import shutil -import re -import sys -import subprocess -import glob -from itertools import islice -from collections import OrderedDict -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from java.lang import System; -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -from __builtin__ import file - -FASTQ_GZ_PATTERN = "*.fastq.gz" -METADATA_FILE_SUFFIX = "_metadata.tsv" -INDEX1='BARCODE' -INDEX2='INDEX2' -EXTERNAL_SAMPLE_NAME='EXTERNAL_SAMPLE_NAME' -FASTQ_SAMPLE_CODE = 'FASTQ_SAMPLE_CODE' -INDEXREAD1='INDEXREAD' -INDEXREAD2='INDEXREAD2' -MISMATCH_IN_INDEX='MISMATCH_IN_INDEX' -BCL_VERSION='BCL_VERSION' -SAMPLE_TYPE = 'SAMPLE_TYPE' -SAMPLE_CODE = 'SAMPLE_CODE' -NCBI_ORGANISM_TAXONOMY='NCBI_ORGANISM_TAXONOMY' -PHIX_TAXONOMY_ID='10847' -DEFAULT_INDEX='NoIndex' -CRC32_PATH='lib/crc32' -if System.getProperty('os.name') == 'Mac OS X': - CRC32_PATH='lib/a.out' -NOHUP_REGEX = 'nohup*.txt' -CHECKSUMS_REGEX = 'checksums.txt' -COMMAND_LINE_INVOCATION = 'Command-line invocation' -MISMATCH_REGEX = r'(barcode-mismatches) ([0-9])' -mismatch_dict = {0: 'NONE', 1:'ONE', 2:'TWO'} -MISMATCH_ABREVIATION = "_MM_" - -def get_mismatches(file): - - command_line_regex = re.compile(COMMAND_LINE_INVOCATION) - mismatch_regex = re.compile(MISMATCH_REGEX) - command_line_list = [] - mismatches = 0 - number_of_lines_to_read = 5 - - if file: - with open(file[0]) as nohup: - head = list(islice(nohup, number_of_lines_to_read)) - for line in head: - if re.search(command_line_regex, line): - command_line_list.append(line) - rr = re.search(mismatch_regex, line) - mismatches = int(rr.group().split()[1]) - else: - print("File " + str(file) + " not found!") - return command_line_list, mismatches - - -def mismatch_string_builder (mismatches, file_part_name): - - if mismatches > 0: - mismatch_string = MISMATCH_ABREVIATION + str(mismatches) - else: - mismatch_string = "" - meta_data_file_name = file_part_name + mismatch_string + METADATA_FILE_SUFFIX - return meta_data_file_name - - -def checkOnFileSize(file): - return os.stat(file).st_size == 0 - - -def CRC32_from_file(filename, transaction): - - if checkOnFileSize(filename): - raise Exception("FILE " + filename + " IS EMPTY!") - - threadPropertyDict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(threadPropertyDict['script-path'])) - fullPathCrc32 = (os.path.join(absolutePath, CRC32_PATH)) - if os.path.exists(fullPathCrc32): - args = [fullPathCrc32, filename] - p = subprocess.Popen(args, stdout=subprocess.PIPE) - cksum = (p.communicate()[0]) - print("Calculated crc32 checksum for: "+ os.path.basename(filename) + " " + cksum) - else: - cksum = 0 & 0xFFFFFFFF - return cksum - - -def writeMetadataFile(transaction, folder_name, meta_data_file_name, sequencing_sample_properties_dict, - fcMetaDataDict, experiment, sample_space, fastqFileList, flowLane, dataSet, flow_lane_sample): - ''' - Writes a file of meta data related to one sample - ''' - - incoming_path = transaction.getIncoming().getAbsolutePath() - - sequencing_sample_properties_list = sequencing_sample_properties_dict.keys() - sequencing_sample_properties_list.sort() - - expId = experiment.getIdentifier() - try: - - - meta_data_file = open(meta_data_file_name,'w') - for propertyType in sequencing_sample_properties_list: - if (propertyType in [u'FLOW_CELL_PROPERTIES']): - continue - if propertyType in [SAMPLE_TYPE] or propertyType in [SAMPLE_CODE]: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - str(sequencing_sample_properties_dict[propertyType])+ "\n") - else: - meta_data_file.write(propertyType.encode('utf-8') + "\t" + - sequencing_sample_properties_dict[propertyType].encode('utf-8').replace('\n',',') + "\n") - - meta_data_file.write("EXPERIMENT\t" + expId + "\n".encode('utf-8')) - meta_data_file.write("\nFLOWCELL PROPERTIES\n".encode('utf-8')) - fcMetaDataDict["LANE_NUMBER"] = flowLane - keys = fcMetaDataDict.keys() - keys.sort() - - sequencer_vocabulary_description = get_vocabulary_descriptions(transaction, 'SEQUENCER') - meta_data_file.write('SEQUENCER_MODEL' + "\t" + - sequencer_vocabulary_description[fcMetaDataDict['SEQUENCER']].encode('utf-8') + "\n") - - for k in keys: - meta_data_file.write(k.encode('utf-8') + "\t" + fcMetaDataDict[k].encode('utf-8') + "\n") - - meta_data_file.write("\nFASTQ_FILES\n".encode('utf-8')) - - checksums_file = get_file_names(incoming_path, CHECKSUMS_REGEX) - if checksums_file: - with open(checksums_file[0]) as checksums: - for line in checksums: - # Ugly hack :-( - if line.starts_with("Undetermined"): - line = fcMetaDataDict['CODE'] + "_" + line - meta_data_file.write(line) - else: - print("File " + str(checksums_file) + " not found!") - - # Use slow fall back solution - for file in fastqFileList: - print("Using fall back solution for creation of CRC32 checksums") - meta_data_file.write(os.path.basename(file) + "\t" + str(CRC32_from_file(file, transaction)) + "\n") - - meta_data_file.write("\nDATASET PROPERTIES\n".encode('utf-8')) - # Data Set Property: - if fastqFileList: - - meta_data_file.write((MISMATCH_IN_INDEX + "\t" + dataSet.getPropertyValue(MISMATCH_IN_INDEX) + "\n").encode('utf-8')) - meta_data_file.write((BCL_VERSION + "\t" + flow_lane_sample.getPropertyValue(BCL_VERSION)).encode('utf-8')) - except IOError: - print ('File error, could not write '+ file) - finally: - meta_data_file.close() - - destinationFolder = folder_name - extraCopySciCore (transaction, sample_space, meta_data_file_name, destinationFolder) - - -def extraCopySciCore (transaction, sample_space, filePath, destinationFolder=""): - ''' - Handles the extra copies of the data for transfer with datamover for SCICORE - ''' - - dropBoxFolder = '/links/shared/dsu/dss/customers/biozentrum_scicore/drop-box' - if System.getProperty('os.name') == 'Mac OS X': - dropBoxFolder = '/Users/kohleman/tmp/scicore' - - # if a sample is part of this space list then it will be transferred to sciCore - SPACE_WHITELIST = ["DUW_SALZBURGER", "BIOZENTRUM_HANDSCHIN", "BIOZENTRUM_ZAVOLAN", - "BIOZENTRUM_KELLER", "BIOZENTRUM_NIMWEGEN", "BSSE_DBM_BIOZENTRUM_NEUROSTEMX", - "UNI_BASEL_STPH_UTZINGER", "UNI_BASEL_STPH_GAGNEUX", - "BIOZENTRUM_PAPASSOTIROPOULOS_BEERENWINKEL", "BIOZENTRUM_SPANG", - "BIOZENTRUM_JENAL", "UNI_BASEL_CHEMIE_CREUS","UKBB_WELLMANN" - ] - DBM_SPACE_PREFIX = "DBM_" - - basename = os.path.basename(filePath) - - if (sample_space in SPACE_WHITELIST) or sample_space.startswith(DBM_SPACE_PREFIX): - dirname = os.path.join(dropBoxFolder, destinationFolder) - if not os.path.exists(dirname): - os.mkdir(dirname) - print("COPYING " + filePath + " TO SCICORE FOLDER " + dirname) - shutil.copy(filePath, dirname) - #os.chmod(os.path.join(dirname, basename), 0774) - else: - print(sample_space + " not in SPACE_WHITELIST. Sample will not be copied to sciCORE.\n") - - -def get_sample_properties (transaction, sample): - - sample_properties_dict = {} - # returns Map<String, String> - sample_properties = sample.getSample().getProperties() - sequencing_sample_type = sample.getSampleType() - sequencing_sample_code = sample.getCode() - sample_properties_dict[SAMPLE_TYPE] = sequencing_sample_type - sample_properties_dict[SAMPLE_CODE] = sequencing_sample_code - - for property in sample_properties: - code = property.getPropertyType().getSimpleCode() - sample_properties_dict[code] = property.tryGetAsString() - - ordered_sample_properties_dict = OrderedDict(sorted(sample_properties_dict.items(), key=lambda t: t[0])) - return ordered_sample_properties_dict - - -def searchParents (search_service, parents): - - sc = SearchCriteria() - # set the Search Criteria to an OR condition, default is AND - sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES) - # Get the codes for all parents - for parent in parents: - parentSubCode = parent.getSubCode() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, parentSubCode)); - # all parents of the flow lane - foundParents = search_service.searchForSamples(sc) - return foundParents - - -def renameFiles (fastq_files, undetermined, flow_cell_id, mismatches): - - newFastqFileList = [] - for file in fastq_files: - folder = os.path.dirname(file) - fileName = os.path.basename(file) - filepart, suffix = fileName.split('.',1) - if undetermined: - if mismatches > 0: - new_file = folder + "/" + flow_cell_id + '_' + filepart + MISMATCH_ABREVIATION + str(mismatches) + "." + suffix - else: - new_file = folder + "/" + flow_cell_id + '_' + filepart + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - if mismatches > 0: - new_file = folder + "/" + filepart + MISMATCH_ABREVIATION + str(mismatches) + "." + suffix - print ("Renaming file " + file + " to " + new_file) - os.rename(file, new_file) - else: - new_file = file - newFastqFileList.append(new_file) - return newFastqFileList - - -def put_files_to_dataset (transaction, dataSet, fastq_files, folder_name, sample_space): - - for file in fastq_files: - print("SAMPLE_SPACE:" + sample_space) - extraCopySciCore (transaction, sample_space, file, folder_name) - transaction.moveFile(file, dataSet, folder_name) - -# ------------------------------------------------------------------------------- - -def split_incoming_folder_name (name): - split=name.split("_") - - # expected incoming Name, e.g.: BSSE_QGF_22266_H0W8YBGXX_1 - if (len(split) == 5): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = split[3] - flowLane = split[-1] - undetermined = False - - # expected Undetermined_H0W8YBGX_1 - elif (len(split) == 3): - sample_code = '' - flowCellId = split[-2] - flowLane = split[-1] - undetermined = True - - # MiSeq BSSE_QGF_36097_000000000_AH4PH_1 - elif (len(split) == 6): - sample_code = '-'.join([split[0], split[1], split[2]]) - flowCellId = '-'.join([split[3],split[4]]) - flowLane = split[-1] - undetermined = False - - #MiSeq Undetermined_000000000_AH4PH_1 - elif (len(split) == 4): - sample_code = '' - flowCellId = '-'.join([split[1], split[2]]) - flowLane = split[-1] - undetermined = True - else: - print("Expected different naming schema!") - - incoming_sample = flowCellId + ':' + flowLane - return sample_code, flowCellId, flowLane, incoming_sample, undetermined - -# ------------------------------------------------------------------------------- - -def get_vocabulary_descriptions (transaction, vocabulary_name): - vocabulary_descriptions_dict = {} - vocabulary = transaction.getVocabulary(vocabulary_name) - vocabulary_terms = vocabulary.getTerms() - for term in vocabulary_terms: - vocabulary_descriptions_dict[term.getCode()] = term.getDescription() - return vocabulary_descriptions_dict - -# ------------------------------------------------------------------------------- - - -def process_regular_samples(transaction, name, sample_code, flowCellId, flowLane, fastq_files, first_fastq_file, - search_unique_sample, fcMetaDataDict, dataSet, flow_lane_sample, mismatches): - - newFastqFiles = renameFiles(fastq_files, False, flowCellId, mismatches) - - foundSample = search_unique_sample(transaction, sample_code) - sequencing_sample = foundSample[0].getSample() - experiment = sequencing_sample.getExperiment() - sequencing_sample_code = sequencing_sample.getCode() - print "sequencing_sample_code: " + sequencing_sample_code - sequencing_sample_properties_dict = get_sample_properties(transaction, foundSample[0]) - if (INDEX1 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD1] > 0): - #print(sequencing_sample_properties_dict[INDEX1]) - dataSet.setPropertyValue(INDEX1, sequencing_sample_properties_dict[INDEX1]) - if (INDEX2 in sequencing_sample_properties_dict) and (fcMetaDataDict[INDEXREAD2] > 0): - dataSet.setPropertyValue(INDEX2, sequencing_sample_properties_dict[INDEX2]) - dataSet.setPropertyValue(EXTERNAL_SAMPLE_NAME, sequencing_sample_properties_dict[EXTERNAL_SAMPLE_NAME]) - dataSet.setPropertyValue(FASTQ_SAMPLE_CODE, sequencing_sample_code.replace('-','_')) - - sample_space = foundSample[0].getSpace() - filepart, suffix = first_fastq_file.split('.', 1) - - meta_data_file_name = mismatch_string_builder(mismatches, filepart.rsplit('_', 2)[0]) - - # get a file from the IDataSetRegistrationTransaction so it is automatically part of the data set - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - return newFastqFiles, sample_space - - -def process_undetermined(transaction, undetermined, name, flowCellId, flowLane, fastq_files, first_fastq_file, - search_service, fcMetaDataDict, parents, dataSet, flow_lane_sample, mismatches): - sample_space = "" - newFastqFiles = [] - sample_space_list = [] - lane_parents = searchParents(search_service, parents) - print "Found " + str(lane_parents.size()) + " parents" - newFastqFiles = renameFiles(fastq_files, undetermined, flowCellId, mismatches) - for parent in lane_parents: - sequencing_sample_properties_dict = get_sample_properties(transaction, parent) - parent_sample = parent.getSample() - sample_code = parent_sample.getCode() - experiment = parent_sample.getExperiment() - sample_space = parent.getSpace() - sample_space_list.append(sample_space) - - # Special Sample Types without index (e.g. ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL) are caught here. - # as those samples do not have a NCBI ORGANISM TAXONOMY - if NCBI_ORGANISM_TAXONOMY not in sequencing_sample_properties_dict: - print sample_code + ": Processing Sample without NCBI ORGANISM TAXONOMY: ILLUMINA_SEQUENCING_NEUROSTEMX_SINGLECELL" - meta_data_file_name = mismatch_string_builder(mismatches, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0]) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - elif (INDEX1 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX1] == 'NOINDEX') and \ - (INDEX2 not in sequencing_sample_properties_dict or sequencing_sample_properties_dict[INDEX2] == 'NOINDEX') and \ - (sequencing_sample_properties_dict[NCBI_ORGANISM_TAXONOMY] != PHIX_TAXONOMY_ID): - print 'NONINDEXED sample and Taxonomy id is NOT ' + PHIX_TAXONOMY_ID + ', probably a pool: ' + sample_code - meta_data_file_name = mismatch_string_builder(mismatches, sample_code + '_' + flowCellId + '_' + first_fastq_file.split('.')[0]) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, newFastqFiles, flowLane, dataSet, flow_lane_sample) - - else: - print sample_code + ": Create parent meta data file" - meta_data_file_name = mismatch_string_builder(mismatches, 'PARENT_' + sample_code + '_' + flowCellId) - meta_data_file_path = transaction.createNewFile(dataSet, name, meta_data_file_name) - writeMetadataFile(transaction, name, meta_data_file_path, sequencing_sample_properties_dict, fcMetaDataDict, - experiment, sample_space, [], flowLane, dataSet, flow_lane_sample) - - sample_space_set = set(sample_space_list) - try: - sample_space_set.remove("PHIX") - except: - print("No Phix on this lane...") - sample_space = sample_space_set.pop() - return newFastqFiles, sample_space - -def process(transaction): - - undetermined = False - mismatches = 0 - print("\n" + str(datetime.now())) - - incoming_path = transaction.getIncoming().getAbsolutePath() - name = transaction.getIncoming().getName() - - sample_code, flowCellId, flowLane, incoming_sample, undetermined = split_incoming_folder_name (name) - - nohup_file = glob.glob(os.path.join(incoming_path, NOHUP_REGEX)) - if nohup_file: - command_line_list, mismatches = get_mismatches(nohup_file) - - - # get all fastqs - fastq_files = get_file_names(incoming_path, FASTQ_GZ_PATTERN) - - # BSSE-QGF-22266-H0W8YBGXX-1-654-BC3-TTAGGC_S1_L001_R1_001.fastq.gz - # BSSE-QGF-22051-H0T25AGXX-1-1-1-TAAGGCGA-CTCTCTAT_S46_L001_R1_001.fastq.gz - first_fastq_file = os.path.basename(fastq_files[0]) - - search_service = transaction.getSearchService() - - flowcell_sample_immutable = search_unique_sample (transaction, flowCellId) - fcMetaDataDict = get_sample_properties(transaction, flowcell_sample_immutable[0]) - flow_lane_immutable = search_unique_sample (transaction, incoming_sample) - - sample = flow_lane_immutable[0].getSample() - parents = sample.getParents() - - dataSet = transaction.createNewDataSet("FASTQ_GZ") - dataSet.setMeasuredData(False) - dataSet.setPropertyValue(INDEX1, DEFAULT_INDEX) - dataSet.setPropertyValue(INDEX2, DEFAULT_INDEX) - dataSet.setPropertyValue(MISMATCH_IN_INDEX, mismatch_dict[mismatches]) - dataSet.setPropertyValue(BCL_VERSION, flow_lane_immutable[0].getPropertyValue(BCL_VERSION)) - - if mismatches > 0: - name += MISMATCH_ABREVIATION + str(mismatches) - dirName = transaction.createNewDirectory(dataSet,name) - - if undetermined: - fastq_files, sample_space = process_undetermined(transaction, undetermined, name, flowCellId, flowLane, - fastq_files, first_fastq_file, search_service, fcMetaDataDict, parents, dataSet, - flow_lane_immutable[0], mismatches) - else: - fastq_files, sample_space = process_regular_samples(transaction, name, sample_code, flowCellId, flowLane, - fastq_files, first_fastq_file, search_unique_sample, fcMetaDataDict, dataSet, - flow_lane_immutable[0], mismatches) - - put_files_to_dataset (transaction, dataSet, fastq_files, name, sample_space) - - sa = transaction.getSampleForUpdate(flow_lane_immutable[0].getSampleIdentifier()) - # Deactivated as this creates for each sample a new history entry, eventually moved to the registration of Basecall- Stats - #sa.setPropertyValue("DATA_TRANSFERRED", create_openbis_timestamp_now()) - dataSet.setSample(flow_lane_immutable[0]) - diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties deleted file mode 100644 index 6c92aaded21..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/register-undetermined -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-undetermined.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py deleted file mode 100644 index c2f37ad6127..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/register-undetermined/register-undetermined.py +++ /dev/null @@ -1,51 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@author: -Manuel Kohler -''' - -import os -import shutil -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchSubCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("UNDETERMINED_READS_DISTRIBUTION") - dataSet.setMeasuredData(False) - dataSet.setSample(connected_sample[0]) - transaction.moveFile(transaction.getIncoming().getPath(), dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties deleted file mode 100644 index bed822d96bb..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/v2_register-demuliplex-stats -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-demuliplex-stats.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py deleted file mode 100644 index bd26425284a..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-demuliplex-stats/register-demuliplex-stats.py +++ /dev/null @@ -1,78 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@description: -Registers an incoming directory as a data set in openBIS. The name of the directory is used to -search for the matching sample. - -@note: -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -import re -import glob -import os -from itertools import islice -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - -BCL2FASTQ_BASECALLSTATS_TYPE = "BCL2FASTQ_BASECALLSTATS" -AGGREGATED_BASECALL_STATS_TYPE = "AGGREGATED_BASECALL_STATS" - -def process(transaction): - aggregated_run = False - incoming = transaction.getIncoming() - incoming_path = incoming.getAbsolutePath() - run_id = incoming.getName() - - thread_property_dict = get_thread_properties(transaction) - absolutePath = os.path.dirname(os.path.realpath(thread_property_dict['script-path'])) - - try: - run_date, sequencer_id, running_number, tray_and_fcId, lane = run_id.split("_") - dataSet = transaction.createNewDataSet(BCL2FASTQ_BASECALLSTATS_TYPE) - model = get_model(run_id.rsplit("_",1)[:-1][0]) - except: - run_date, sequencer_id, running_number, tray_and_fcId = run_id.split("_") - dataSet = transaction.createNewDataSet(AGGREGATED_BASECALL_STATS_TYPE) - aggregated_run = True - model = get_model(run_id) - - print(os.path.basename(absolutePath) + ": Auto-detected Illumina model: " + model) - - tray = tray_and_fcId[0] - if model in [Sequencers.MISEQ]: - fc_id = tray_and_fcId - else: - fc_id = tray_and_fcId[1:] - - if aggregated_run: - sample_code = fc_id - else: - sample_code = fc_id + ":" + lane - found_sample = search_unique_sample(transaction, sample_code) - search_service = transaction.getSearchService() - - dataSet.setMeasuredData(False) - transaction.moveFile(incoming_path, dataSet) - dataSet.setSample(found_sample[0]) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties deleted file mode 100644 index e72bf886b62..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/plugin.properties +++ /dev/null @@ -1,6 +0,0 @@ -incoming-dir = ${incoming-root-dir}/v2_register-trimming -incoming-data-completeness-condition = marker-file -top-level-data-set-handler = ch.systemsx.cisd.etlserver.registrator.api.v2.JythonTopLevelDataSetHandlerV2 -script-path = register-trimming.py -storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor -jython-version=2.7 diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py deleted file mode 100644 index cabc8d9dea0..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/dss/drop-boxes/v2_register-trimming/register-trimming.py +++ /dev/null @@ -1,50 +0,0 @@ -''' -@copyright: -2015 ETH Zuerich, SIS - -@license: -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -@note -print statements go to: <openBIS_HOME>/datastore_server/log/startup_log.txt - -@author: -Manuel Kohler -''' - -# The following module is located in the path defined in the datastore_server.conf -# Look for: -Dpython.path} -from gfb_utils import * - - -def process(transaction): - - incomingPath = transaction.getIncoming().getPath() - incomingFolder = transaction.getIncoming().getName() - - split = incomingFolder.split("_") - - if (len(split) == 2): - flow_cell, flow_lane = incomingFolder.split("_") - elif (len(split) == 3): - flow_cell = "-".join([split[0], split[1]]) - flow_lane = split[-1] - - connected_sample_code = ":".join([flow_cell, flow_lane]) - connected_sample = search_unique_sample(transaction, connected_sample_code) - - dataSet = transaction.createNewDataSet("TRIMMING") - dataSet.setMeasuredData(False) - - dataSet.setSample(connected_sample[0]) - transaction.moveFile(incomingPath, dataSet) diff --git a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py b/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py deleted file mode 100644 index 481b30152ea..00000000000 --- a/deep_sequencing_unit/sourceTest/core-plugins/illumina-qgf/2/jython-lib/gfb_utils.py +++ /dev/null @@ -1,123 +0,0 @@ -import os -import time -import fnmatch -from time import * -from datetime import * -from ch.systemsx.cisd.openbis.generic.shared.api.v1.dto import SearchCriteria - -# HISEQ_DICT = {'HISEQ_4000': 'Illumina HiSeq 4000', -# 'HISEQ_3000': 'Illumina HiSeq 3000', -# 'HISEQ_2500': 'Illumina HiSeq 2500', -# 'HISEQ_2000': 'Illumina HiSeq 2000', -# 'HISEQ_X': 'Illumina HiSeq X' -# } -# NEXTSEQ_DICT = {'NEXTSEQ_500': 'Illumina NextSeq 500'} -# MISEQ_DICT = {'MISEQ': 'Illumina MiSeq'} -# UNIDENTIFIED_DICT = {'UNIDENTIFIED': 'Unidentified'} - -# Instead of using Enum: -class Sequencers: - HISEQ_4000, HISEQ_3000, HISEQ_2500, HISEQ_2000, HISEQ_X, NEXTSEQ_500, MISEQ , UNIDENTIFIED= \ - ('Illumina HiSeq 4000','Illumina HiSeq 3000','Illumina HiSeq 2500','Illumina HiSeq 2000', - 'Illumina HiSeq X', 'Illumina NextSeq 500', 'Illumina MiSeq', 'Unidentified') - -HISEQ_LIST = [Sequencers.HISEQ_2000, Sequencers.HISEQ_2500, Sequencers.HISEQ_3000, Sequencers.HISEQ_4000, Sequencers.HISEQ_X] - - -def get_model(run_id): - """ - Guesses the sequencer model from the run folder name - - Current Naming schema for Illumina run folders, as far as I know, - no documentation found on this, Illumina introduced a field called - <InstrumentID> on the NextSeq runParameters.xml. That might be an - option for the future. Alternatively a combination of the fields - <ApplicationName> and <ApplicationVersion>. - - MiSeq: 150130_M01761_0114_000000000-ACUR0 - NextSeq: 150202_NS500318_0047_AH3KLMBGXX - HiSeq 2000: 130919_SN792_0281_BD2CHRACXX - HiSeq 2500: 150203_D00535_0052_AC66RWANXX - HiSeq 3000: 150724_J00121_0017_AH2VYMBBXX - HiSeq 4000: 150210_K00111_0013_AH2372BBXX - HiSeq X: 141121_ST-E00107_0356_AH00C3CCXX - """ - date, machine_id, run_number, fc_string = os.path.basename(run_id).split("_") - - if machine_id.startswith("NS"): - model = Sequencers.NEXTSEQ_500 - elif machine_id.startswith("M"): - model = Sequencers.MISEQ - elif machine_id.startswith("D"): - model = Sequencers.HISEQ_2500 - elif machine_id.startswith("SN"): - model = Sequencers.HISEQ_2000 - elif machine_id.startswith("J"): - model = Sequencers.HISEQ_3000 - elif machine_id.startswith("K"): - model = Sequencers.HISEQ_4000 - elif machine_id.startswith("ST"): - model = Sequencers.HISEQ_X - else: - model = Sequencers.UNIDENTIFIED - return model - - -def get_thread_properties(transaction): - threadPropertyDict = {} - threadProperties = transaction.getGlobalState().getThreadParameters().getThreadProperties() - for key in threadProperties: - try: - threadPropertyDict[key] = threadProperties.getProperty(key) - except: - pass - return threadPropertyDict - - -def create_openbis_timestamp(file): - ''' - Creates a openBIS compatible time stamp of a file time stamp - ''' - mtime = os.path.getmtime(file) - lt = localtime(mtime) - tz = localtime().tm_hour - gmtime().tm_hour - # doing a modulo 12, as GMT has not more than 12 zones - # Needed if we are around midnight - tz %= 12 - return (strftime("%Y-%m-%d %H:%M:%S GMT" + "%+.2d" % tz + ":00", lt)) - - -def create_openbis_timestamp_now(): - ''' - Create an openBIS conform timestamp - ''' - tz=localtime()[3]-gmtime()[3] - d=datetime.now() - return d.strftime("%Y-%m-%d %H:%M:%S GMT"+"%+.2d" % tz+":00") - - -def search_unique_sample(transaction, sample_code): - - search_service = transaction.getSearchService() - sc = SearchCriteria() - sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.CODE, sample_code)); - found_sample = search_service.searchForSamples(sc) - try: - assert found_sample.size() == 1 - except AssertionError: - print (str(found_sample.size()) + ' samples found which match the criterias: '+ sample_code) - return found_sample - - -def get_file_names(path, pattern): - ''' - Gets all files matching a PATTERN in a path recursively - and returns the result as a list - ''' - matches = [] - for root, dirnames, filenames in os.walk(path): - for filename in fnmatch.filter(filenames, pattern): - matches.append(os.path.join(root, filename)) - matches.sort() - return(matches) - diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java deleted file mode 100644 index 4bce330ab7d..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/DependencyCheckingTest.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2011 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu; - -/** - * @author Franz-Josef Elmer - */ -public class DependencyCheckingTest extends ch.systemsx.cisd.common.test.DependencyCheckingTest -{ - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java deleted file mode 100644 index c14e1ec10f3..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/DataSetInfoExtractorTest.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import java.io.File; -import java.util.List; -import java.util.Properties; - -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty; - -/** - * @author Franz-Josef Elmer - */ -public class DataSetInfoExtractorTest extends AbstractFileSystemTestCase -{ - private BufferedAppender appender; - - @BeforeMethod - public final void beforeMethod() - { - LogInitializer.init(); - appender = new BufferedAppender(); - appender.resetLogContent(); - } - - @Test - public void testWithSingleQuotes() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n <Software Name='RTA' Version='1.4.15.0'/>\n</abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(1, properties.size()); - assertEquals(DataSetInfoExtractor.VERSION_KEY, properties.get(0).getPropertyCode()); - assertEquals("1.4.15.0", properties.get(0).getValue()); - // checks delegation to DefaultDataSetInfoExtractor - assertEquals("DataSetInfoExtractorTest", info.getSampleCode()); - } - - @Test - public void testWithDoubleQuotes() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n <Software Name=\"RTA\" Version=\"1.4.15.0\"/>\n</abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(1, properties.size()); - assertEquals(DataSetInfoExtractor.VERSION_KEY, properties.get(0).getPropertyCode()); - assertEquals("1.4.15.0", properties.get(0).getValue()); - } - - @Test - public void testWithMissingVersion() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - File configFile = new File(workingDirectory, DataSetInfoExtractor.DEFAULT_PATH_TO_CONFIG_FILE); - configFile.getParentFile().mkdirs(); - FileUtilities.writeToFile(configFile, "<abc>\n </abc>\n"); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(0, properties.size()); - String logContent = appender.getLogContent(); - assertEquals("No version found in config file 'Data/Intensities/config.xml'.", logContent); - } - - @Test - public void testWithMissingConfigFile() - { - DataSetInfoExtractor extractor = new DataSetInfoExtractor(new Properties()); - - DataSetInformation info = extractor.getDataSetInformation(workingDirectory, null); - - List<NewProperty> properties = info.getDataSetProperties(); - assertEquals(0, properties.size()); - String logContent = appender.getLogContent(); - assertEquals( - "Config file 'Data/Intensities/config.xml' does not exists or is a directory.", - logContent); - } -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java deleted file mode 100644 index 7a94f578262..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/FlowLaneFeederTest.java +++ /dev/null @@ -1,735 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss; - -import static ch.ethz.bsse.cisd.dsu.dss.FlowLaneDataSetInfoExtractor.FLOW_LANE_NUMBER_SEPARATOR; - -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; - -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.base.utilities.OSUtilities; -import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException; -import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException; -import ch.systemsx.cisd.common.exceptions.UserFailureException; -import ch.systemsx.cisd.common.filesystem.FileConstants; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.LogInitializer; -import ch.systemsx.cisd.common.test.AssertionUtil; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleTypePropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space; -import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - */ -public class FlowLaneFeederTest extends AbstractFileSystemTestCase -{ - private static final String META_DATA_PREFIX = "meta-"; - - private static final String AFFILIATION = "fmi"; - - private static final String EXTERNAL_SAMPLE_NAME = "ext23"; - - private static final String TRANSFER_DROP_BOX = "transfer-drop-box"; - - private static final Sample EXAMPLE_FLOW_CELL_SAMPLE = createFlowCellSample(); - - private static final DataSetInformation EXAMPLE_DATA_SET_INFO = createDataSetInfo(); - - private static final String FLOW_LANE = "ILLUMINA_FLOW_LANE"; - - private static final String SAMPLE_CODE = "fc"; - - private static final String DROP_BOX_PREFIX = "drop-box-"; - - private static DataSetInformation createDataSetInfo() - { - DataSetInformation dataSetInfo = new DataSetInformation(); - dataSetInfo.setSampleCode(SAMPLE_CODE); - return dataSetInfo; - } - - private static Sample createFlowCellSample() - { - Sample sample = new Sample(); - sample.setId(42L); - sample.setCode(SAMPLE_CODE); - return sample; - } - - private FlowLaneFeeder flowLaneFeeder; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private File dropBox1; - - private File dropBox2; - - private File transferDropBox; - - private File srfInfo; - - @BeforeMethod - public void beforeMethod() throws Exception - { - super.setUp(); - LogInitializer.init(); - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - FileUtilities.deleteRecursively(workingDirectory); - dropBox1 = new File(workingDirectory, DROP_BOX_PREFIX + "1"); - assertEquals(true, dropBox1.mkdirs()); - dropBox2 = new File(workingDirectory, DROP_BOX_PREFIX + "2"); - assertEquals(true, dropBox2.mkdirs()); - transferDropBox = new File(workingDirectory, TRANSFER_DROP_BOX); - assertEquals(true, transferDropBox.mkdirs()); - srfInfo = new File(workingDirectory, "srfInfo"); - flowLaneFeeder = createFeeder(null); - } - - @AfterMethod - public void tearDown() - { - // To following line of code should also be called at the end of each test method. - // Otherwise one does not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void testMissingProperty() - { - try - { - new FlowLaneFeeder(new Properties(), service); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - assertEquals("Given key '" + FlowLaneFeeder.FLOW_LANE_DROP_BOX_TEMPLATE - + "' not found in properties '[]'", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - void testUnkownFlowLaneSample() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - FileUtilities.writeToFile(new File(flowCell, "s_3.srf"), "hello flow lane 3"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.<Sample> asList()); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("No flow lane sample for flow lane 3 found.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - void testMissingDropBox() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - FileUtilities.writeToFile(new File(flowCell, "s_3.srf"), "hello flow lane 3"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - Sample fl = createFlowLaneSample(3); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.<Sample> asList(fl)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("ConfigurationFailureException expected"); - } catch (ConfigurationFailureException ex) - { - AssertionUtil.assertContains(DROP_BOX_PREFIX + "3", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testUnkownFlowCell() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - prepareLoadFlowCellSample(null); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Unkown flow cell sample: " + EXAMPLE_DATA_SET_INFO.getSampleIdentifier(), - ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testNotEnoughFlowLaneFiles() - { - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("EnvironmentFailureException expected"); - } catch (EnvironmentFailureException ex) - { - assertEquals("Only 1 flow lane files found instead of 2.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testFlowLaneTwice() - { - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "1.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello second flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(1); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - assertEquals("Flow lane 1 already registered.", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testHappyCase() - { - flowLaneFeeder.setUpdateDataTransferredProperty(true); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - SampleTypePropertyType p1 = createPropertyType("P1"); - SampleTypePropertyType p2 = createPropertyType("P2"); - SampleTypePropertyType p3 = createPropertyType("DATA_TRANSFERRED"); - IEntityProperty fl1p1v = new GenericEntityProperty(); - fl1p1v.setPropertyType(p1.getPropertyType()); - fl1p1v.setValue("v1"); - IEntityProperty fl2p2v = new GenericEntityProperty(); - fl2p2v.setPropertyType(p2.getPropertyType()); - fl2p2v.setValue("v2"); - - Sample fl1 = createFlowLaneSample(1, fl1p1v); - Sample fl2 = createFlowLaneSample(2, fl2p2v); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - prepareGetSampleType(FLOW_LANE, p1, p2, p3); - prepareUpdateSamples(fl1, fl2); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - private void prepareUpdateSamples(final Sample... samples) - { - context.checking(new Expectations() - { - { - allowing(service).updateSample(with(new BaseMatcher<SampleUpdatesDTO>() - { - @Override - public boolean matches(Object item) - { - if (item instanceof SampleUpdatesDTO) - { - SampleUpdatesDTO sampleUpdate = (SampleUpdatesDTO) item; - Long updateId = sampleUpdate.getSampleIdOrNull().getId(); - boolean found = false; - for (Sample s : samples) - { - if (s.getId().equals(updateId)) - { - found = true; - assertEquals(s.getId(), sampleUpdate - .getSampleIdOrNull().getId()); - assertEquals(0, sampleUpdate.getAttachments().size()); - assertEquals(null, - sampleUpdate.getContainerIdentifierOrNull()); - assertEquals(null, - sampleUpdate.getExperimentIdentifierOrNull()); - assertEquals(s.getIdentifier(), sampleUpdate - .getSampleIdentifier().toString()); - List<IEntityProperty> properties = - sampleUpdate.getProperties(); - assertEquals(s.getProperties().size() + 1, - properties.size()); - assertEquals("DATA_TRANSFERRED", - properties.get(properties.size() - 1) - .getPropertyType().getCode()); - break; - } - } - if (found == false) - { - fail("Didn't expect update of sample with id " + updateId); - } - return true; - } - return false; - } - - @Override - public void describeTo(Description description) - { - } - })); - } - }); - } - - private void prepareGetSampleType(final String sampleTypeCode, - final SampleTypePropertyType... sampleTypePropertyTypes) - { - context.checking(new Expectations() - { - { - allowing(service).getSampleType(sampleTypeCode); - SampleType sampleType = new SampleType(); - sampleType.setCode(sampleTypeCode); - sampleType.setSampleTypePropertyTypes(Arrays.asList(sampleTypePropertyTypes)); - will(returnValue(sampleType)); - } - }); - } - - private static SampleTypePropertyType createPropertyType(String key) - { - SampleTypePropertyType stpt = new SampleTypePropertyType(); - stpt.setMandatory(false); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(key); - stpt.setPropertyType(propertyType); - return stpt; - } - - @Test - public void testHappyCaseWithSRFInfo() - { - flowLaneFeeder = createFeeder("echo option: $1\necho file: $2"); - flowLaneFeeder.setUpdateDataTransferredProperty(false); - - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - List<String> metaData = FileUtilities.loadToStringList(metaFile); - String lastLine = metaData.remove(metaData.size() - 1); - assertEquals("[Parent\tnull, Code\tfc:2, Contact Person Email\tab@c.de, " - + "AFFILIATION\tfmi, EXTERNAL_SAMPLE_NAME\text23, , " - + "==== SRF Info ====\t, option: -l1\t]", metaData.toString()); - AssertionUtil.assertContains("file: ", lastLine); - assertEquals(8, metaData.size()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - @Test - public void testHappyCaseWithAdditionalFiles() - { - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File logs = new File(flowCell, "logs"); - assertEquals(true, logs.mkdir()); - FileUtilities.writeToFile(new File(logs, "basic.log"), "hello log"); - File srfFolder = new File(flowCell, "SRF"); - assertEquals(true, srfFolder.mkdir()); - File originalFlowLane1 = new File(srfFolder, "s_1.srf"); - File originalFlowLane1Fastq = new File(srfFolder, "s_1.fastq"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - FileUtilities.writeToFile(originalFlowLane1Fastq, "fastq"); - File originalFlowLane2 = new File(srfFolder, "2.srf"); - File originalFlowLane2Fasta = new File(srfFolder, "2.fasta"); - File originalFlowLane2Pdf = new File(srfFolder, "2_boxplot.pdf"); - File originalFlowLane2Xxx = new File(srfFolder, "2abc.xxx"); - FileUtilities.writeToFile(originalFlowLane2, "hello flow lane 2"); - FileUtilities.writeToFile(originalFlowLane2Fasta, "fasta"); - FileUtilities.writeToFile(originalFlowLane2Pdf, "pdf"); - FileUtilities.writeToFile(originalFlowLane2Xxx, "xxx"); - File originalFlowLane2Dir = new File(srfFolder, "2dir"); - assertEquals(true, originalFlowLane2Dir.mkdir()); - File internalDirFile1 = new File(originalFlowLane2Dir, "file1"); - File internalDirFile2 = new File(originalFlowLane2Dir, "file2"); - FileUtilities.writeToFile(internalDirFile1, "internal 1"); - FileUtilities.writeToFile(internalDirFile2, "internal 2"); - File srf_info_file = new File(srfFolder, "srf_info.txt"); - FileUtilities.writeToFile(srf_info_file, - "Reading archive ETHZ_BSSE_100602_61VVHAAXX_1.srf.\n" - + "Reading srf null index block\n" + "Reads: GOOD : 20712959\n" - + "Reads: BAD : 7270034\n" + "Reads: TOTAL : 27982993"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - Sample fl2 = createFlowLaneSample(2); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1, fl2)); - prepareGetProperties(Arrays.asList(fl1, fl2)); - - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - - checkFlowLaneDataSet(originalFlowLane1, "1"); - checkFlowLaneDataSet(originalFlowLane2, "2"); - - File[] transferedFiles = transferDropBox.listFiles(); - Arrays.sort(transferedFiles); - assertEquals(2, transferedFiles.length); - assertEquals("2.srf", transferedFiles[0].getName()); - File metaFile = transferedFiles[1]; - assertEquals(META_DATA_PREFIX + SAMPLE_CODE + "_2" + FlowLaneFeeder.META_DATA_FILE_TYPE, - metaFile.getName()); - assertHardLinkOnSameFile(originalFlowLane2, transferedFiles[0]); - - context.assertIsSatisfied(); - } - - @Test - public void testInvalidSRFFile() - { - flowLaneFeeder = createFeeder("exit 1"); - flowLaneFeeder.setUpdateDataTransferredProperty(false); - File flowCell = new File(workingDirectory, SAMPLE_CODE); - assertEquals(true, flowCell.mkdir()); - File originalFlowLane1 = new File(flowCell, "s_1.srf"); - FileUtilities.writeToFile(originalFlowLane1, "hello flow lane 1"); - prepareLoadFlowCellSample(EXAMPLE_FLOW_CELL_SAMPLE); - - Sample fl1 = createFlowLaneSample(1); - prepareListFlowLanes(EXAMPLE_FLOW_CELL_SAMPLE, Arrays.asList(fl1)); - - try - { - flowLaneFeeder.handle(flowCell, EXAMPLE_DATA_SET_INFO, null); - fail("UserFailureException expected"); - } catch (UserFailureException ex) - { - AssertionUtil.assertContains("Invalid SRF file", ex.getMessage()); - AssertionUtil.assertContains("s_1.srf", ex.getMessage()); - } - - context.assertIsSatisfied(); - } - - @Test - public void testUndoLastOperation() - { - testHappyCase(); - assertEquals(2, dropBox1.list().length); - assertEquals(2, dropBox2.list().length); - assertEquals(2, transferDropBox.list().length); - - flowLaneFeeder.undoLastOperation(); - - assertEquals(0, dropBox1.list().length); - assertEquals(0, dropBox2.list().length); - assertEquals(0, transferDropBox.list().length); - } - - private void prepareLoadFlowCellSample(final Sample flowCellSample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - EXAMPLE_DATA_SET_INFO.getSampleIdentifier()); - will(returnValue(flowCellSample)); - } - }); - } - - private void prepareListFlowLanes(final Sample flowCellSample, - final List<Sample> flowLaneSamples) - { - context.checking(new Expectations() - { - { - one(service).listSamples(with(new BaseMatcher<ListSampleCriteria>() - { - - @Override - public boolean matches(Object item) - { - if (item instanceof ListSampleCriteria) - { - ListSampleCriteria criteria = (ListSampleCriteria) item; - return criteria.getContainerSampleIds().iterator().next() - .equals(flowCellSample.getId()); - } - return false; - } - - @Override - public void describeTo(Description description) - { - description.appendText("Flow cell with ID " - + flowCellSample.getId()); - } - })); - will(returnValue(flowLaneSamples)); - } - }); - } - - private void prepareGetProperties(final List<Sample> flowLaneSamples) - { - context.checking(new Expectations() - { - { - for (Sample sample : flowLaneSamples) - { - SampleIdentifier identifier = - SampleIdentifierFactory.parse(sample.getIdentifier()); - one(service).tryGetPropertiesOfTopSample(identifier); - if (sample.getSubCode().equals("2")) - { - GenericEntityProperty p1 = - createProperty(FlowLaneFeeder.AFFILIATION_KEY, AFFILIATION); - GenericEntityProperty p2 = - createProperty(FlowLaneFeeder.EXTERNAL_SAMPLE_NAME_KEY, - EXTERNAL_SAMPLE_NAME); - will(returnValue(new GenericEntityProperty[] - { p1, p2 })); - } - } - } - - private GenericEntityProperty createProperty(String key, String value) - { - GenericEntityProperty p = new GenericEntityProperty(); - p.setValue(FlowLaneFeeder.escapeSampleCode(value)); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(FlowLaneFeeder.escapeSampleCode(key)); - propertyType.setLabel(FlowLaneFeeder.escapeSampleCode(key).toLowerCase()); - p.setPropertyType(propertyType); - return p; - } - }); - } - - private void checkFlowLaneDataSet(File originalFlowLane, String flowLaneNumber) - { - File dropBox = - new File(workingDirectory, DROP_BOX_PREFIX - + FlowLaneFeeder.escapeSampleCode(flowLaneNumber)); - String fileName = - "G" + FlowLaneFeeder.escapeSampleCode(flowLaneNumber) - + FlowLaneFeeder.DEFAULT_ENTITY_SEPARATOR + SAMPLE_CODE - + FLOW_LANE_NUMBER_SEPARATOR - + FlowLaneFeeder.escapeSampleCode(flowLaneNumber); - File ds = new File(dropBox, FlowLaneFeeder.escapeSampleCode(fileName)); - assertEquals(true, ds.isDirectory()); - - File flowLane = new File(ds, originalFlowLane.getName()); - assertEquals(true, flowLane.isFile()); - assertEquals(FileUtilities.loadToString(originalFlowLane), - FileUtilities.loadToString(flowLane)); - assertHardLinkOnSameFile(originalFlowLane, flowLane); - String metaDataFileName = - META_DATA_PREFIX - + (SAMPLE_CODE + "_" + FlowLaneFeeder.escapeSampleCode(flowLaneNumber)) - + FlowLaneFeeder.META_DATA_FILE_TYPE; - assertEquals(true, new File(ds, FlowLaneFeeder.escapeSampleCode(metaDataFileName)).exists()); - assertEquals( - true, - new File(dropBox, FileConstants.IS_FINISHED_PREFIX - + FlowLaneFeeder.escapeSampleCode(fileName)).exists()); - } - - private void assertHardLinkOnSameFile(File file1, File file2) - { - // check hard-link copy by changing last-modified date of one file should change - // last-modified date of the other file. - file1.setLastModified(4711000); - assertEquals(4711000, file2.lastModified()); - } - - private Sample createFlowLaneSample(int flowLaneNumber, IEntityProperty... properties) - { - Sample sample = new Sample(); - sample.setId((long) flowLaneNumber); - sample.setCode(SAMPLE_CODE + ":" + flowLaneNumber); - Space space = new Space(); - space.setCode("G" + flowLaneNumber); - sample.setSpace(space); - sample.setSubCode(Integer.toString(flowLaneNumber)); - sample.setGeneratedFrom(EXAMPLE_FLOW_CELL_SAMPLE); - Person registrator = new Person(); - registrator.setEmail("ab@c.de"); - sample.setRegistrator(registrator); - sample.setIdentifier(SAMPLE_CODE + ":" + flowLaneNumber); - SampleType type = new SampleType(); - type.setCode(FLOW_LANE); - sample.setSampleType(type); - sample.setProperties(Arrays.asList(properties)); - return sample; - } - - private FlowLaneFeeder createFeeder(String srfInfoScriptOrNull) - { - Properties properties = new Properties(); - properties.setProperty(FlowLaneFeeder.FLOW_LANE_DROP_BOX_TEMPLATE, new File( - workingDirectory, DROP_BOX_PREFIX).getAbsolutePath() + "{0}"); - properties.setProperty(FlowLaneFeeder.META_DATA_FILE_PREFIX, META_DATA_PREFIX); - properties.setProperty(FlowLaneFeeder.TRANSFER_PREFIX + AFFILIATION, - transferDropBox.getAbsolutePath()); - if (srfInfoScriptOrNull != null) - { - properties.setProperty(FlowLaneFeeder.SRF_INFO_PATH, srfInfo.getAbsolutePath()); - FileUtilities.writeToFile(srfInfo, srfInfoScriptOrNull); - File chmod = OSUtilities.findExecutable("chmod"); - assertNotNull(chmod); - try - { - String cmd = chmod.getAbsolutePath() + " +x " + srfInfo.getAbsolutePath(); - Runtime.getRuntime().exec(cmd).waitFor(); - } catch (Exception ex) - { - throw CheckedExceptionTunnel.wrapIfNecessary(ex); - } - } - return new FlowLaneFeeder(properties, service); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore deleted file mode 100644 index c08e0e25cf3..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/IlluminaSummaryXMLLoaderTestSpeed.java diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java deleted file mode 100644 index 7967dde169c..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFTTest.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Properties; - -import javax.activation.DataHandler; -import javax.activation.DataSource; - -import org.apache.commons.io.IOUtils; -import org.apache.log4j.Level; -import org.hamcrest.core.IsNull; -import org.jmock.Expectations; -import org.jmock.Mockery; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.rinn.restrictions.Friend; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.logging.BufferedAppender; -import ch.systemsx.cisd.common.mail.EMailAddress; -import ch.systemsx.cisd.common.mail.IMailClient; -import ch.systemsx.cisd.common.string.Template; -import ch.systemsx.cisd.common.test.RecordingMatcher; -import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.MockDataSetDirectoryProvider; -import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext; -import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService; -import ch.systemsx.cisd.openbis.dss.generic.shared.IProcessingPluginTask; -import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - * @param <workingDirectory> - */ -@Friend(toClasses = DataSetToSOFT.class) -public class DataSetToSOFTTest<workingDirectory> extends AbstractFileSystemTestCase -{ - private static final String SHARE_ID = "42"; - - private static final String USER_EMAIL = "user@ho.me"; - - private static final String USER_ID = "test-user"; - - private static final String SRF_FILE_NAME = "sample.srf"; - - private static final String SRF_FILE_CONTENT = "hello world!"; - - private static final String DATASET_CODE = "ds-1"; - - private static final String FLOW_LANE_SAMPLE_CODE = "flow-lane:1"; - - private BufferedAppender logRecorder; - - private Mockery context; - - private IEncapsulatedOpenBISService service; - - private IMailClient mailClient; - - private DataSetProcessingContext dataSetProcessingContext; - - private IProcessingPluginTask processingPlugin; - - @BeforeMethod - public void beforeMethod() - { - logRecorder = new BufferedAppender("%-5p %c - %m%n", Level.DEBUG); - context = new Mockery(); - service = context.mock(IEncapsulatedOpenBISService.class); - mailClient = context.mock(IMailClient.class); - dataSetProcessingContext = - new DataSetProcessingContext(null, new MockDataSetDirectoryProvider( - workingDirectory, SHARE_ID), new HashMap<String, String>(), mailClient, - USER_ID, USER_EMAIL); - File testFolder = new File(new File(workingDirectory, SHARE_ID), "test"); - testFolder.mkdirs(); - File sampleSrfFile = new File(testFolder, SRF_FILE_NAME); - FileUtilities.writeToFile(sampleSrfFile, SRF_FILE_CONTENT); - processingPlugin = createProcessingPlugin(workingDirectory, service); - } - - private static IProcessingPluginTask createProcessingPlugin(File workingDirectory, - IEncapsulatedOpenBISService service) - { - DataSetToSOFT plugin = new DataSetToSOFT(new Properties(), workingDirectory); - plugin.setService(service); - return plugin; - } - - @AfterMethod - public void afterMethod() - { - logRecorder.reset(); - // To following line of code should also be called at the end of each test method. - // Otherwise one do not known which test failed. - context.assertIsSatisfied(); - } - - @Test - public void test() throws IOException - { - DatasetDescription datasetDescription = new DatasetDescription(); - datasetDescription.setDataSetCode(DATASET_CODE); - datasetDescription.setDataSetLocation("."); - List<DatasetDescription> dataSets = Arrays.asList(datasetDescription); - final Sample flowLaneSample = sample(42, FLOW_LANE_SAMPLE_CODE); - flowLaneSample.setCode(FLOW_LANE_SAMPLE_CODE); - prepareGetDataSet(DATASET_CODE, flowLaneSample); - Sample flowCellSample = sample(43, "flow-cell"); - addProperty(flowCellSample, "GENOME_ANALYZER", "my-analyzer"); - final Sample sequencingSample = sample(44, "sequencing"); - addProperty(sequencingSample, DataSetToSOFT.EXTERNAL_SAMPLE_NAME_PROPERTY, "my sample"); - addProperty(sequencingSample, "SAMPLE_SOURCE_NAME", "source"); - addProperty(sequencingSample, "NCBI_ORGANISM_TAXONOMY", "organism"); - addProperty(sequencingSample, "CONTACT_PERSON_NAME", "person"); - addProperty(sequencingSample, "SAMPLE_MOLECULE", "total_rna"); - addProperty(sequencingSample, "SEQUENCING_APPLICATION", "application"); - addProperty(sequencingSample, "SAMPLE_EXTRACT_PROTOCOL", "protocol"); - addProperty(sequencingSample, "SAMPLE_DATA_PROCESSING", "processing"); - addProperty(sequencingSample, "SAMPLE_LIBRARY_SELECTION", "cDNA"); - addProperty(sequencingSample, "SAMPLE_LIBRARY_STRATEGY", "RNA-Seq"); - addProperty(sequencingSample, "SAMPLE_KIND", "CHIP"); - flowLaneSample.setContainer(flowCellSample); - prepareGetSample(flowLaneSample); - prepareGetSample(flowCellSample); - final RecordingMatcher<ListSampleCriteria> listSampleCriteriaMatcher = - new RecordingMatcher<ListSampleCriteria>(); - final RecordingMatcher<String> subjectMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> contentMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<String> fileNameMatcher = new RecordingMatcher<String>(); - final RecordingMatcher<DataHandler> attachmentMatcher = new RecordingMatcher<DataHandler>(); - final RecordingMatcher<EMailAddress[]> addressesMatcher = - new RecordingMatcher<EMailAddress[]>(); - context.checking(new Expectations() - { - { - one(service).listSamples(with(listSampleCriteriaMatcher)); - will(returnValue(Arrays.asList(sequencingSample))); - - one(mailClient).sendEmailMessageWithAttachment(with(subjectMatcher), - with(contentMatcher), with(fileNameMatcher), with(attachmentMatcher), - with(new IsNull<EMailAddress>()), with(new IsNull<EMailAddress>()), - with(addressesMatcher)); - } - }); - - ProcessingStatus status = processingPlugin.process(dataSets, dataSetProcessingContext); - - assertEquals(0, status.getErrorStatuses().size()); - assertEquals(flowLaneSample.getId(), listSampleCriteriaMatcher.recordedObject() - .getChildSampleId().getId()); - Template template = initTemplate(DataSetToSOFT.E_MAIL_SUBJECT_TEMPLATE); - assertEquals(template.createText(), subjectMatcher.recordedObject()); - Template content = initTemplate(DataSetToSOFT.E_MAIL_CONTENT_TEMPLATE); - content.bind("flow-lane", flowLaneSample.getCode()); - content.bind("data-set", DATASET_CODE); - assertEquals(content.createText(), contentMatcher.recordedObject()); - Template fileNameTemplate = DataSetToSOFT.SOFT_FILE_NAME_TEMPLATE.createFreshCopy(); - fileNameTemplate.bind("external-sample-name", "my_sample"); - fileNameTemplate.bind("flow-lane", flowLaneSample.getCode().replace(':', '-')); - assertEquals(fileNameTemplate.createText(), fileNameMatcher.recordedObject()); - assertEquals(USER_EMAIL, addressesMatcher.recordedObject()[0].tryGetEmailAddress()); - DataSource dataSource = attachmentMatcher.recordedObject().getDataSource(); - String attachmentContent = getContent(dataSource); - assertEquals("^SAMPLE = my sample\n" + "!Sample_type = SRA\n" - + "!Sample_title = my sample\n" + "!Sample_source_name = source\n" - + "!Sample_organism = organism\n" - + "!Sample_characteristics = <<<NEED_TO_BE_FILLED>>>\n" - + "!Sample_biomaterial_provider = person\n" + "!Sample_molecule = total_rna\n" - + "!Sample_extract_protocol = protocol\n" - + "!Sample_data_processing = processing\n" + "!Sample_library_strategy = RNA-Seq\n" - + "!Sample_library_source = genomic\n" + "!Sample_library_selection = cDNA\n" - + "!Sample_instrument_model = my-analyzer\n" + "!Sample_raw_file_1 = sample.srf\n" - + "!Sample_raw_file_type_1 = srf\n" - + "!Sample_file_checksum_1 = fc3ff98e8c6a0d3087d515c0473f8677\n", attachmentContent); - context.assertIsSatisfied(); - } - - String getContent(DataSource dataSource) throws IOException - { - StringBuilder builder = new StringBuilder(); - @SuppressWarnings("rawtypes") - List fileLines = IOUtils.readLines(dataSource.getInputStream()); - for (Object object : fileLines) - { - builder.append(object).append('\n'); - } - return builder.toString(); - } - - Template initTemplate(Template originalTemplate) - { - Template template = originalTemplate.createFreshCopy(); - template.bind("external-sample-name", "my sample"); - return template; - } - - private void prepareGetDataSet(final String dataSetCode, final Sample flowLaneSample) - { - context.checking(new Expectations() - { - { - one(service).tryGetDataSet(dataSetCode); - PhysicalDataSet dataSet = new PhysicalDataSet(); - dataSet.setCode(dataSetCode); - dataSet.setSample(flowLaneSample); - will(returnValue(dataSet)); - } - }); - } - - private void prepareGetSample(final Sample sample) - { - context.checking(new Expectations() - { - { - one(service).tryGetSampleWithExperiment( - SampleIdentifierFactory.parse(sample.getIdentifier())); - will(returnValue(sample)); - } - }); - } - - private void addProperty(Sample sample, String propertyTypeCode, String value) - { - List<IEntityProperty> properties = sample.getProperties(); - if (properties == null) - { - properties = new ArrayList<IEntityProperty>(); - sample.setProperties(properties); - } - EntityProperty property = new EntityProperty(); - PropertyType propertyType = new PropertyType(); - propertyType.setCode(propertyTypeCode); - property.setPropertyType(propertyType); - property.setValue(value); - properties.add(property); - } - - private Sample sample(long id, String identifier) - { - Sample sample = new Sample(); - sample.setId(id); - sample.setIdentifier(identifier); - return sample; - } -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java deleted file mode 100644 index 7624171f0a9..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/plugins/IlluminaSummaryXMLLoaderTest.java +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.plugins; - -import java.io.File; - -import org.testng.annotations.Test; - -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; - -/** - * @author Franz-Josef Elmer - */ -public class IlluminaSummaryXMLLoaderTest extends AbstractFileSystemTestCase -{ - @Test - public void test() - { - File file = new File(workingDirectory, "test.xml"); - FileUtilities.writeToFile(file, EXAMPLE); - IlluminaSummary summary = - IlluminaSummaryReportingPlugin.IlluminaSummaryXMLLoader.readSummaryXML(file); - - ChipResultsSummary chipResultsSummary = summary.getChipResultsSummary(); - LaneResultsSummary laneResultsSummary = summary.getLaneResultsSummary(); - assertEquals(Long.valueOf(98792458L), chipResultsSummary.getClusterCountPF()); - assertEquals(Long.valueOf(158466917L), chipResultsSummary.getClusterCountRaw()); - assertEquals(Long.valueOf(3556528488L), chipResultsSummary.getYield()); - // if not there yhen take the init value - assertEquals(Double.valueOf(0.0), chipResultsSummary.getDensityRatio()); - - assertEquals(Long.valueOf(381287L), laneResultsSummary.getRead().getLanes().get(0) - .getClusterCountRaw().getMean()); - assertEquals(Long.valueOf(277736L), laneResultsSummary.getRead().getLanes().get(0) - .getClusterCountPF().getMean()); - assertEquals(Long.valueOf(1199819L), laneResultsSummary.getRead().getLanes().get(0) - .getLaneYield()); - assertEquals(Double.valueOf(79.37), laneResultsSummary.getRead().getLanes().get(0) - .getPercentUniquelyAlignedPF().getMean()); - - if (summary.getSoftware() == "") - { - assertEquals("", summary.getSoftware()); - } else - { - assertEquals("CASAVA-1.6.0", summary.getSoftware()); - } - } - - /** - * - */ - protected static final String EXAMPLE = "<?xml version='1.0' ?>\n " - + "<?xml-stylesheet type='text/xsl' href='Summary.xsl' ?>\n " - + "<Summary> " - + " <ChipResultsSummary> " - + " <clusterCountPF>98792458</clusterCountPF> " - + " <clusterCountRaw>158466917</clusterCountRaw> " - + " <yield>3556528488</yield> " - + " </ChipResultsSummary> " - + " <ChipSummary> " - + " <ChipID>unknown</ChipID> " - + " <Machine>HWI-EAS264</Machine> " - + " <RunFolder>090916_42R0CAAXX</RunFolder> " - + " </ChipSummary> " - + " <Date>Tue Oct 20 18:15:43 2009</Date> " - + " <ExpandedLaneSummary> " - + " <Read> " - + " <readNumber>1</readNumber> " - + " <Lane> " - + " <laneNumber>1</laneNumber> " - + " <clusterCountRaw> " - + " <mean>381286.80</mean> " - + " <stdev>28613.35</stdev> " - + " <sumsq>98246880000.00</sumsq> " - + " </clusterCountRaw> " - + " <errorPF> " - + " <mean>0.72</mean> " - + " <stdev>0.49</stdev> " - + " <sumsq>90.37</sumsq> " - + " </errorPF> " - + " <errorRaw> " - + " <mean>0.83</mean> " - + " <stdev>0.48</stdev> " - + " <sumsq>110.63</sumsq> " - + " </errorRaw> " - + " <infoContentPF> " - + " <mean>213494</mean> " - + " <stdev>9929</stdev> " - + " <sumsq>5481321756576</sumsq> " - + " </infoContentPF> " - + " <infoContentRaw> " - + " <mean>229532</mean> " - + " <stdev>11786</stdev> " - + " <sumsq>6338734406410</sumsq> " - + " </infoContentRaw> " - + " <percentClustersPF> " - + " <mean>73.03</mean> " - + " <stdev>2.72</stdev> " - + " <sumsq>890.49</sumsq> " - + " </percentClustersPF> " - + " <percentUniquelyAlignedPF> " - + " <mean>79.37</mean> " - + " <stdev>0.86</stdev> " - + " <sumsq>755955.73</sumsq> " - + " </percentUniquelyAlignedPF> " - + " <phasingApplied>0.8203</phasingApplied> " - + " <prephasingApplied>0.3881</prephasingApplied> " - + " <signalAverage1to3> " - + " <mean>526.07</mean> " - + " <stdev>43.17</stdev> " - + " <sumsq>223675.10</sumsq> " - + " </signalAverage1to3> " - + " <signalAverage2to4> " - + " <mean>519.91</mean> " - + " <stdev>41.72</stdev> " - + " <sumsq>208871.60</sumsq> " - + " </signalAverage2to4> " - + " <signalLoss10to20> " - + " <mean>1.01</mean> " - + " <stdev>0.40</stdev> " - + " <sumsq>19.25</sumsq> " - + " </signalLoss10to20> " - + " <signalLoss2to10> " - + " <mean>0.45</mean> " - + " <stdev>0.53</stdev> " - + " <sumsq>33.94</sumsq> " - + " </signalLoss2to10> " - + " </Lane> " - + " </Read> " - + " </ExpandedLaneSummary> " - + " <LaneParameterSummary/> " - + " <LaneResultsSummary> " - + " <Read> " - + " <readNumber>1</readNumber> " - + " <Lane> " - + " <laneNumber>1</laneNumber> " - + " <averageAlignScorePF> " - + " <mean>94.25</mean> " - + " <stdev>3.64</stdev> " - + " <sumsq>1067460.47</sumsq> " - + " </averageAlignScorePF> " - + " <clusterCountPF> " - + " <mean>277736</mean> " - + " <stdev>11981</stdev> " - + " <sumsq>17224950000</sumsq> " - + " </clusterCountPF> " - + " <clusterCountRaw> " - + " <mean>381287</mean> " - + " <stdev>28613</stdev> " - + " <sumsq>98246880000</sumsq> " - + " </clusterCountRaw> " - + "<errorPF> " - + "<mean>0.72</mean> " - + "<stdev>0.49</stdev> " - + "<sumsq>90.37</sumsq> " - + "</errorPF> " - + "<laneYield>1199819</laneYield> " - + "<oneSig> " - + "<mean>536</mean> " - + "<stdev>46</stdev> " - + "<sumsq>256164</sumsq> " - + "</oneSig> " - + "<percentClustersPF> " - + "<mean>73.03</mean> " - + "<stdev>2.72</stdev> " - + "<sumsq>890.49</sumsq> " - + "</percentClustersPF> " - + "<percentUniquelyAlignedPF> " - + "<mean>79.37</mean> " - + "<stdev>0.86</stdev> " - + "<sumsq>755955.73</sumsq> " - + "</percentUniquelyAlignedPF> " - + "<signal20AsPctOf1> " - + "<mean>82.19</mean> " - + "<stdev>5.09</stdev> " - + "<sumsq>3103.16</sumsq> " - + "</signal20AsPctOf1> " - + " </Lane> " - + " </Read> " - + " </LaneResultsSummary> " - + " <TileErrorsByLane/> " - + " <Software>CASAVA-1.6.0</Software> " - + "</Summary>"; -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java deleted file mode 100644 index 93acd2960e2..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUDropboxSystemTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import org.testng.annotations.BeforeSuite; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.GenericDropboxSystemTest; -import ch.systemsx.cisd.openbis.generic.shared.ICommonServer; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType; - -/** - * @author pkupczyk - */ -public abstract class DSUDropboxSystemTest extends GenericDropboxSystemTest -{ - - @Override - @BeforeSuite - public void beforeSuite() throws Exception - { - initializePythonImportPath(); - DSUTestInitializer.init(); - super.beforeSuite(); - initializeMasterData(); - } - - @Override - protected String getDropboxIncomingDirectoryName() - { - return getDropboxName(); - } - - private void initializePythonImportPath() - { - System.setProperty("python.path", "sourceTest/core-plugins/illumina-qgf/1/jython-lib"); - } - - private void initializeMasterData() - { - String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("kohleman", "password"); - ICommonServer commonServer = getBean("common-server"); - PropertyType propertyType = new PropertyType(); - propertyType.setCode("CONTROL_SOFTWARE_VERSION"); - propertyType.setDataType(new DataType(DataTypeCode.VARCHAR)); - propertyType.setLabel("Control Software Version"); - propertyType.setDescription(propertyType.getLabel()); - NewETPTAssignment assignment = new NewETPTAssignment(); - assignment.setPropertyTypeCode(propertyType.getCode()); - assignment.setEntityTypeCode("ILLUMINA_FLOW_CELL"); - assignment.setEntityKind(EntityKind.SAMPLE); - assignment.setOrdinal(1000L); - commonServer.registerAndAssignPropertyType(sessionToken, propertyType, assignment); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java deleted file mode 100644 index b3a7fad8fc7..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUSystemTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import org.testng.annotations.BeforeSuite; - -import ch.systemsx.cisd.openbis.datastoreserver.systemtests.GenericSystemTest; - -/** - * @author pkupczyk - */ -public abstract class DSUSystemTest extends GenericSystemTest -{ - - @Override - @BeforeSuite - public void beforeSuite() throws Exception - { - DSUTestInitializer.init(); - super.beforeSuite(); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java deleted file mode 100644 index 169b95dc6e0..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DSUTestInitializer.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import java.io.File; - -import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer; -import ch.systemsx.cisd.openbis.test.server.TestDatabase; - -/** - * @author pkupczyk - */ -public class DSUTestInitializer -{ - - private static String dbKind = "test_qgf"; - - public static void setDbKind(String dbKind) - { - DSUTestInitializer.dbKind = dbKind; - } - - private static String getDBKind() - { - return dbKind; - } - - private static String getDBName() - { - return "openbis_" + getDBKind(); - } - - public static void init() - { - File sqlDumpFile = new File("resource/test-db/" + getDBName() + ".sql"); - File binaryDumpFile = new File("resource/test-db/" + getDBName() + ".dmp"); - - File dumpFile = null; - if (sqlDumpFile.exists()) - { - dumpFile = sqlDumpFile; - } else if (binaryDumpFile.exists()) - { - dumpFile = binaryDumpFile; - } else - { - throw new IllegalArgumentException("No dump file found."); - } - - TestDatabase.restoreDump(dumpFile, getDBName()); - - TestInitializer.setScriptFolderForEmptyDB("../openbis/source"); - TestInitializer.setScriptFolderForTestDB("../openbis/source"); - TestInitializer.setDBKind(getDBKind()); - TestInitializer.setCreateDBFromScratch(false); - } - -} diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java deleted file mode 100644 index a2ef1fc3307..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/dss/systemtests/DemoDropboxTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2014 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.dss.systemtests; - -import java.util.List; - -import org.testng.Assert; -import org.testng.annotations.Test; - -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause; -import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute; - -/** - * @author pkupczyk - */ -public class DemoDropboxTest extends DSUDropboxSystemTest -{ - - @Override - protected String getDropboxName() - { - return "demo-dropbox"; - } - - @Override - protected String getDropboxIncomingDirectoryName() - { - return "incoming-demo-dropbox"; - } - - @Test - public void testDropbox() throws Exception - { - importData("demo-data"); - waitUntilDataImported(); - waitUntilIndexUpdaterIsIdle(); - - String sessionToken = getGeneralInformationService().tryToAuthenticateForAllServices("kohleman", "password"); - - // check that the new created experiments are there - SearchCriteria criteria = new SearchCriteria(); - criteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE, "DEMO-EXPERIMENT*")); - - List<Experiment> experiments = getGeneralInformationService().searchForExperiments(sessionToken, criteria); - Assert.assertEquals(experiments.size(), 2); - } - -} \ No newline at end of file diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java deleted file mode 100644 index a6d3851332a..00000000000 --- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dsu.tracking.main; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.TreeSet; - -import org.apache.commons.lang3.StringUtils; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities; -import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackingStateDTO; -import ch.ethz.bsse.cisd.dsu.tracking.main.TrackingBO.TrackingStateUpdateHelper; -import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase; -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; - -/** - * @author Piotr Buczek - * @author Manuel Kohler - */ -public class FileBasedTrackingDAOTest extends AbstractFileSystemTestCase -{ - private static final String DATABASE_FILE = "tracking-local-database"; - - private static final String DATABASE_FILE_DATA_SETS = "tracking-sample-database"; - - private TreeMap<String, Long> changedTrackingMap = new TreeMap<String, Long>(); - - @BeforeMethod - public void beforeMethod() throws Exception - { - super.setUp(); - FileUtilities.deleteRecursively(workingDirectory); - } - - @Test - public void testGetTrackingState() - { - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2 3 4 5"; - String processed = "1 2 3"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO state = trackingDAO.getTrackingState(); - assertEquals(changedTrackingMap, state.getLastSeenDataSetIdMap()); - assertEquals(toBeProcessed, StringUtils.join(state - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals(processed, StringUtils.join(state.getAlreadyTrackedSampleIdsProcessed(), " ")); - } - - @Test - public void testCalcNewTrackingState() - { - TreeMap<String, Long> changedTrackingMap = new TreeMap<String, Long>(); - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2 3 4 5"; - String processed = "1 2 3"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO state = trackingDAO.getTrackingState(); - - HashMap<String, ArrayList<Long>> tmpTrackingMap = new HashMap<String, ArrayList<Long>>(); - ArrayList<Long> techIds = new ArrayList<Long>(); - techIds.add(32000L); - techIds.add(33000L); - techIds.add(29877L); - tmpTrackingMap.put("20150213144812415-60450886", techIds); - - techIds = new ArrayList<Long>(); - techIds.add(32001L); - techIds.add(33001L); - tmpTrackingMap.put("20150226134806587-60452073", techIds); - - techIds = new ArrayList<Long>(); - techIds.add(31000L); - techIds.add(34000L); - tmpTrackingMap.put("20150226134806587-90000000", techIds); - - TrackedEntities changedEntities = - new TrackedEntities(createSamplesWithIds(6, 7), createSamplesWithIds(4), - createDataSetsWithIds(33000L), tmpTrackingMap); - TrackingStateDTO newState = - TrackingStateUpdateHelper.calcNewTrackingState(state, changedEntities); - - TreeMap<String, Long> expectedTrackingMap = new TreeMap<String, Long>(); - - expectedTrackingMap.put("20150213144812415-60450886", 33000L); - expectedTrackingMap.put("20150226134806587-60452073", 33001L); - expectedTrackingMap.put("20150226134806587-90000000", 34000L); - - assertEquals(expectedTrackingMap, newState.getLastSeenDataSetIdMap()); - - assertEquals("1 2 3 4 5 6 7", StringUtils.join(newState - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals("1 2 3 4", StringUtils.join(newState.getAlreadyTrackedSampleIdsProcessed(), - " ")); - } - - @Test - public void testSaveTrackingState() - { - changedTrackingMap.put("20150213144812415-60450886", 29877L); - changedTrackingMap.put("20150226134806587-60452073", 30293L); - String toBeProcessed = "1 2"; - String processed = "1"; - prepareDatabaseFile(changedTrackingMap, toBeProcessed, processed); - - ITrackingDAO trackingDAO = new FileBasedTrackingDAO(DATABASE_FILE, DATABASE_FILE_DATA_SETS); - TrackingStateDTO newState = new TrackingStateDTO(); - - changedTrackingMap.put("20150226134806587-60452099", 31296L); - newState.setLastSeenDataSetIdMap(changedTrackingMap); - newState.setAlreadyTrackedSampleIdsToBeProcessed(new TreeSet<Long>(Arrays.asList(new Long[] - { 1L, 2L, 3L, 4L }))); - newState.setAlreadyTrackedSampleIdsProcessed(new TreeSet<Long>(Arrays.asList(new Long[] - { 1L, 2L, 3L }))); - trackingDAO.saveTrackingState(newState); - - TrackingStateDTO loadesState = trackingDAO.getTrackingState(); - assertEquals(changedTrackingMap, loadesState.getLastSeenDataSetIdMap()); - assertEquals("1 2 3 4", StringUtils.join(loadesState - .getAlreadyTrackedSampleIdsToBeProcessed(), " ")); - assertEquals("1 2 3", StringUtils.join(loadesState.getAlreadyTrackedSampleIdsProcessed(), - " ")); - } - - private static List<Sample> createSamplesWithIds(long... ids) - { - List<Sample> result = new ArrayList<Sample>(); - for (long id : ids) - { - result.add(createSampleWithId(id)); - } - return result; - } - - private static Sample createSampleWithId(long id) - { - Sample result = new Sample(); - result.setId(id); - return result; - } - - private static List<AbstractExternalData> createDataSetsWithIds(long... ids) - { - List<AbstractExternalData> result = new ArrayList<AbstractExternalData>(); - for (long id : ids) - { - result.add(createDataSetWithId(id)); - } - return result; - } - - private static PhysicalDataSet createDataSetWithId(long id) - { - PhysicalDataSet result = new PhysicalDataSet(); - result.setId(id); - return result; - } - - private void prepareDatabaseFile(TreeMap<String, Long> changedTrackingMap, String samplesToBeProcessed, - String processedSamples) - { - StringBuilder sb = new StringBuilder(); - - for (Map.Entry<String, Long> entry : changedTrackingMap.entrySet()) - { - sb.append(entry.getKey() + FileBasedTrackingDAO.EQUAL + entry.getValue() + "\n"); - } - System.out.println(sb.toString()); - FileUtilities.writeToFile(new File(DATABASE_FILE_DATA_SETS), sb.toString()); - - sb = new StringBuilder(); - sb.append(FileBasedTrackingDAO.TO_BE_PROCESSED); - sb.append(FileBasedTrackingDAO.SEPARATOR); - sb.append(samplesToBeProcessed); - sb.append("\n"); - sb.append(FileBasedTrackingDAO.PROCESSED); - sb.append(FileBasedTrackingDAO.SEPARATOR); - sb.append(processedSamples); - sb.append("\n"); - - FileUtilities.writeToFile(new File(DATABASE_FILE), sb.toString()); - } -} diff --git a/deep_sequencing_unit/sourceTest/java/tests.xml b/deep_sequencing_unit/sourceTest/java/tests.xml deleted file mode 100644 index 26e13dd48d9..00000000000 --- a/deep_sequencing_unit/sourceTest/java/tests.xml +++ /dev/null @@ -1,14 +0,0 @@ -<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd" > - -<suite name="All" verbose="1"> - <test name="All"> - <groups> - <run> - <exclude name="broken" /> - </run> - </groups> - <packages> - <package name="ch.ethz.bsse.cisd.dsu.*" /> - </packages> - </test> -</suite> diff --git a/deep_sequencing_unit/tracking/dist/etc/email-template.txt b/deep_sequencing_unit/tracking/dist/etc/email-template.txt deleted file mode 100644 index f105bff09d4..00000000000 --- a/deep_sequencing_unit/tracking/dist/etc/email-template.txt +++ /dev/null @@ -1,10 +0,0 @@ -Dear Mrs./Mr. -This email has been sent to you automatically by the openBIS system because -you have been registered as a contact person or principal investigator. - -There is progress considering your sequencing order. Below you will find all the details. - -{generated-content} - -Kind regards, -Quantitative Genomics Facility Team \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/log.xml b/deep_sequencing_unit/tracking/dist/etc/log.xml deleted file mode 100644 index 25581b0f2e2..00000000000 --- a/deep_sequencing_unit/tracking/dist/etc/log.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="DEFAULT" class="org.apache.log4j.DailyRollingFileAppender"> - - <param name="File" value="log/tracking_log.txt"/> - <param name="DatePattern" value="'.'yyyy-MM-dd"/> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - </appender> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <appender name="EMAIL" class="org.apache.log4j.net.SMTPAppender"> - - <param name="BufferSize" value="512" /> - <param name="SMTPHost" value="localhost" /> - <param name="From" value="dsu@localhost" /> - <param name="To" value="root@localhost" /> - <param name="Subject" value="ATTENTION: DSU Progress Tracking" /> - <param name="EvaluatorClass" value="ch.systemsx.cisd.common.logging.AlwaysTrueTriggeringEventEvaluator" /> - - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - - <!--filter class="org.apache.log4j.varia.LevelRangeFilter"> - <param name="LevelMin" value="ERROR"/> - <param name="LevelMax" value="FATAL"/> - </filter--> - - </appender> - - <category name="NOTIFY"> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - <appender-ref ref="EMAIL" /> - </category> - - <root> - <priority value="info" /> - <appender-ref ref="DEFAULT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/tracking/dist/etc/service.properties b/deep_sequencing_unit/tracking/dist/etc/service.properties deleted file mode 100644 index a8639434a53..00000000000 --- a/deep_sequencing_unit/tracking/dist/etc/service.properties +++ /dev/null @@ -1,57 +0,0 @@ -openbis-user=<login> -openbis-password=<password> -openbis-server-url = https://<openbis-server-url>:8443/openbis/openbis -permlink-url = https://<openbis-server-url>:8443/openbis - -# SMTP properties. -# To test the system and save emails as files instead of sending them, -# set the smtp host to file://path-to-directory -mail.smtp.host = smtp0.ethz.ch -mail.smtp.user = -mail.smtp.password = - -# all emails will be sent from this address -mail.from = openbis-noreply@bsse.ethz.ch -# all emails will have this address in the reply-to field -notification-email-reply-to = manuel.kohler@bsse.ethz.ch -# subject of all the notification emails -notification-email-subject = BSSE DSU: Status report of your deep sequencing order - -# if the tracking client fails an email will be sent out to these recipients -tracking-admin-email = kohleman@ethz.ch, gpawel@ethz.ch - -# Recipients that will receive notifications when entity connected with sequencing sample -# with certain AFFILIATION value. Property key should contain affiliation vocabulary term code -# with '-affiliation-notification-email-contact' suffix, e.g. for 'FMI' affiliation: -FMI-affiliation-notification-email-contact = - -jython-version=2.7 - -# if a sample is part of this space list then it will be transferred to an extra folder -space-whitelist = SPACE1, SPACE2 - -# All DBM spaces start with this string and will be copied to an extra folder -dbm-space-prefix = DBM_ - -# boolean flag used to make a developer life easier -debug = true - -# go back up to this number when searching for older data sets, used to speed up the request. -# The lower this number the faster, but you might miss older data sets -old-data-set-backlog-number = 1000 - -# List of DataSet Types which should be copied into an extra folder -dataset-type-list = FASTQ_GZ, FASTQC - -# folder where the data should be copied to -FASTQ_GZ-destination-folder = /Users/kohleman/dest/fastq_gz -FASTQC-destination-folder = /Users/kohleman/dest/fastqc - -# rsync binary -rsync-binary = /opt/local/bin/rsync - -# rsync flags -rsync-flags = -v - -# DSS root -dss-root-dir = /dss-root-dir \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/tracking-local-database b/deep_sequencing_unit/tracking/dist/etc/tracking-local-database deleted file mode 100644 index cf0c217beb4..00000000000 --- a/deep_sequencing_unit/tracking/dist/etc/tracking-local-database +++ /dev/null @@ -1,2 +0,0 @@ -trackedSamplesToBeProcessed -trackedSamplesProcessedSuccessfully \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database b/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database deleted file mode 100644 index 2fa072094d7..00000000000 --- a/deep_sequencing_unit/tracking/dist/etc/tracking-sample-database +++ /dev/null @@ -1,2511 +0,0 @@ -20090901100144407-102 = 192 -20090901100217527-106 = 190 -20091027093052413-400 = 24 -20091027093128193-401 = 22 -20091027093856950-403 = 26 -20091027093953542-404 = 28 -20091027094025001-405 = 29 -20091027094057471-406 = 25 -20091027094142512-407 = 23 -20091030173345738-419 = 37 -20091030173359059-420 = 33 -20091030173412170-421 = 38 -20091030173629007-422 = 32 -20091030173758779-423 = 35 -20091030173812208-424 = 39 -20091030173821889-425 = 36 -20091030173929101-426 = 34 -20091106124300586-474 = 47 -20091106124329764-475 = 42 -20091106124715426-476 = 46 -20091106125151081-477 = 43 -20091106125206291-478 = 45 -20091106125226353-479 = 48 -20091106125241093-480 = 44 -20091106125314193-481 = 41 -20091106141205669-490 = 56 -20091106141507158-492 = 55 -20091106141519899-493 = 57 -20091106141533859-494 = 52 -20091106141609081-495 = 54 -20091106141925253-496 = 50 -20091106141943652-497 = 53 -20091106141956163-498 = 51 -20091117170701771-551 = 62 -20091120175945615-578 = 69 -20091125111543169-606 = 89 -20091125111614749-607 = 87 -20091126153258774-618 = 77 -20091126153355153-619 = 82 -20091126153400307-620 = 83 -20091126153406591-621 = 84 -20091126153414760-622 = 80 -20091126153420414-623 = 78 -20091126153426200-624 = 81 -20091126153517520-625 = 79 -20091201173404712-670 = 101 -20091201173416814-671 = 97 -20091201173424109-672 = 100 -20091201173433419-673 = 96 -20091201173457607-674 = 95 -20091201173530550-675 = 102 -20091201173541572-676 = 98 -20091201173548422-677 = 99 -20091202163914008-686 = 106 -20091202163923548-687 = 111 -20091202163932761-688 = 108 -20091202163941188-689 = 109 -20091202164005130-690 = 104 -20091202164042639-691 = 107 -20091202164056909-692 = 105 -20091202164105920-693 = 110 -20091211135800080-746 = 366 -20091211135810349-747 = 370 -20091211135821139-748 = 371 -20091211135829933-749 = 373 -20091211135844754-750 = 367 -20091211135939945-751 = 369 -20091211154447334-763 = 125 -20091211155300296-768 = 123 -20091211155346575-769 = 124 -20091211155355043-770 = 128 -20091217160108986-815 = 134 -20091217160121027-816 = 141 -20091217160131947-817 = 136 -20091217160140856-818 = 137 -20091217160158137-819 = 135 -20091217160208497-820 = 138 -20091217160217679-821 = 133 -20091217160249608-822 = 140 -20100104141359261-851 = 146 -20100104141934510-852 = 145 -20100104141943538-853 = 142 -20100104141951799-854 = 143 -20100104142117972-855 = 147 -20100104142129577-856 = 150 -20100104142139257-857 = 148 -20100104142258199-858 = 144 -20100104150210283-868 = 155 -20100104150219889-869 = 152 -20100104150229391-870 = 153 -20100104150239401-871 = 154 -20100104150251770-872 = 157 -20100104150300874-873 = 156 -20100104150307950-874 = 159 -20100104150437301-875 = 151 -20100115162144587-984 = 174 -20100115162158927-985 = 172 -20100115162209499-986 = 171 -20100115162230528-987 = 169 -20100115162240790-988 = 176 -20100115162251887-989 = 170 -20100115162257999-990 = 175 -20100115162920255-992 = 168 -20100119174708577-1055 = 222 -20100119174715737-1056 = 224 -20100119174725169-1057 = 228 -20100119174735848-1058 = 221 -20100119174759150-1059 = 223 -20100119174810691-1060 = 227 -20100119174818898-1061 = 226 -20100119174930379-1062 = 225 -20100121160330216-1087 = 238 -20100121160346656-1088 = 234 -20100121160354685-1089 = 232 -20100121160431666-1090 = 231 -20100121160449219-1091 = 237 -20100121160522918-1093 = 239 -20100121160538448-1094 = 236 -20100121160728938-1095 = 233 -20100129163141498-1168 = 293 -20100129163151377-1169 = 299 -20100129163200946-1170 = 296 -20100129163210811-1171 = 295 -20100129163221077-1172 = 294 -20100129163229167-1173 = 298 -20100129163238850-1174 = 300 -20100129163343935-1175 = 297 -20100208181210213-1185 = 249 -20100208181221310-1186 = 257 -20100208181232443-1187 = 251 -20100208181241387-1188 = 256 -20100208181253995-1189 = 252 -20100208181305496-1190 = 253 -20100208181314316-1191 = 250 -20100208181418721-1192 = 255 -20100209093213783-1209 = 246 -20100209093223865-1210 = 241 -20100209093326782-1211 = 248 -20100210162255901-1238 = 340 -20100210162310327-1239 = 345 -20100210164455879-1253 = 347 -20100210164548000-1254 = 339 -20100217155418927-1330 = 331 -20100217155431380-1331 = 332 -20100217155440044-1332 = 336 -20100217155450929-1333 = 334 -20100217155510362-1334 = 328 -20100217155520621-1335 = 330 -20100217155550413-1336 = 333 -20100217155711716-1337 = 329 -20100223160428841-1361 = 351 -20100223160535294-1362 = 348 -20100223160552432-1364 = 349 -20100223160605401-1365 = 353 -20100223160620757-1366 = 356 -20100223160649269-1367 = 354 -20100223160808647-1368 = 350 -20100325110248757-1445 = 376 -20100325110330448-1446 = 380 -20100331150601755-1457 = 387 -20100331150610446-1458 = 388 -20100331150621576-1459 = 392 -20100331150636095-1460 = 390 -20100331150656717-1461 = 386 -20100331150756870-1462 = 389 -20100331150843166-1463 = 384 -20100331151007916-1465 = 385 -20100414165531241-1489 = 404 -20100414165541421-1490 = 408 -20100414165551276-1491 = 407 -20100414165604896-1492 = 406 -20100414165621711-1493 = 403 -20100414165629893-1494 = 405 -20100414165636217-1495 = 402 -20100414165740555-1496 = 410 -20100415095708958-1508 = 395 -20100415095721854-1509 = 398 -20100415095815657-1510 = 399 -20100415095838144-1511 = 401 -20100415095925208-1512 = 397 -20100415100107678-1514 = 393 -20100415100126104-1515 = 394 -20100420115836518-1559 = 413 -20100426124153251-1614 = 426 -20100428172740332-1623 = 430 -20100428172749470-1624 = 437 -20100428172800370-1625 = 433 -20100428172807501-1626 = 434 -20100428172822397-1627 = 431 -20100428172832020-1628 = 432 -20100428172841926-1629 = 429 -20100428172929820-1630 = 435 -20100505171018192-1659 = 439 -20100505171053482-1660 = 443 -20100505171109861-1661 = 444 -20100505171123152-1662 = 446 -20100505171437816-1663 = 442 -20100518180146300-1712 = 450 -20100518180156496-1713 = 454 -20100518180318645-1714 = 453 -20100518180330251-1715 = 452 -20100518180421992-1716 = 456 -20100518180620583-1718 = 451 -20100521173324880-1767 = 459 -20100521173337260-1768 = 462 -20100521173344869-1769 = 463 -20100521173355340-1770 = 465 -20100521173405794-1771 = 460 -20100521173412150-1772 = 457 -20100521173420493-1773 = 458 -20100521173504043-1774 = 461 -20100603142651278-1796 = 473 -20100603142804268-1797 = 472 -20100603142819793-1798 = 471 -20100603143248696-1799 = 468 -20100610095251052-1819 = 483 -20100610095351558-1820 = 476 -20100610095407343-1821 = 477 -20100610095416347-1822 = 478 -20100610095525224-1823 = 475 -20100610095853430-1827 = 479 -20100610095942262-1828 = 480 -20100622150006599-1858 = 490 -20100622150148840-1860 = 484 -20100706181515832-1912 = 495 -20100706181527377-1913 = 499 -20100706181537637-1914 = 498 -20100706181550267-1915 = 497 -20100706181605078-1916 = 494 -20100706181648289-1917 = 501 -20100706181846733-1920 = 493 -20100720173022595-1939 = 509 -20100720173033148-1940 = 506 -20100720173041895-1941 = 508 -20100720173051383-1942 = 503 -20100720173101132-1943 = 507 -20100720173108446-1944 = 510 -20100720173116612-1945 = 504 -20100720173632374-1947 = 505 -20100726124125003-1978 = 519 -20100729105913994-1994 = 526 -20100729105932276-1995 = 520 -20100729105944744-1996 = 523 -20100729110245137-2001 = 521 -20100730162022569-2017 = 529 -20100730162040004-2018 = 537 -20100730162155775-2021 = 535 -20100803171705868-2037 = 541 -20100803171716976-2038 = 542 -20100803171724636-2039 = 546 -20100803171732418-2040 = 544 -20100803171740431-2041 = 540 -20100803171750576-2042 = 538 -20100803171757602-2043 = 539 -20100803171837890-2044 = 543 -20100806144225552-2080 = 547 -20100811173558229-2100 = 558 -20100811173606359-2101 = 561 -20100811173614622-2102 = 562 -20100811173623435-2103 = 564 -20100811173748044-2104 = 560 -20100811173926469-2106 = 556 -20100811173938671-2107 = 557 -20100817180139608-2133 = 571 -20100817180707390-2135 = 566 -20100817180718131-2136 = 568 -20100902095427172-2168 = 587 -20100902095438108-2169 = 586 -20100902095626618-2171 = 589 -20100902095709387-2172 = 591 -20100902095722518-2173 = 594 -20100902095730764-2174 = 590 -20100910152208286-2231 = 601 -20100910152230447-2232 = 595 -20100910152246998-2233 = 598 -20100910152300691-2234 = 597 -20100910153859252-2235 = 596 -20100910154000986-2236 = 600 -20100910154015044-2237 = 599 -20100910154028448-2238 = 603 -20100916173443063-2275 = 607 -20100916173454336-2276 = 608 -20100916173503882-2277 = 612 -20100916173513256-2278 = 610 -20100916173521915-2279 = 606 -20100916173536668-2280 = 604 -20100916173544330-2281 = 605 -20100916173634754-2282 = 609 -20100922172618682-2314 = 621 -20100922172628495-2315 = 613 -20100922172637236-2316 = 616 -20100922172646098-2317 = 615 -20100922172726141-2318 = 614 -20100922172922512-2321 = 618 -20101006142458732-2343 = 624 -20101006142512761-2344 = 626 -20101006142522402-2345 = 630 -20101006142531789-2346 = 628 -20101006142552071-2347 = 623 -20101006142601230-2348 = 622 -20101006142705813-2349 = 627 -20101015202054777-2367 = 650 -20101015202204705-2368 = 651 -20101102140357156-2386 = 636 -20101102142525628-2390 = 633 -20101102142728963-2392 = 637 -20101102142743734-2393 = 639 -20101102142755621-2394 = 635 -20101108145638659-2419 = 644 -20101108145729493-2420 = 642 -20101116111121742-2457 = 652 -20101116111125257-2458 = 654 -20101116111130325-2459 = 653 -20101116111132822-2460 = 655 -20101116122432170-2472 = 656 -20101118165547913-2478 = 657 -20101119101026821-2483 = 658 -20101129145554042-2502 = 661 -20101129145610758-2503 = 664 -20101129145815342-2506 = 663 -20101129150122953-2509 = 660 -20101208180442780-2538 = 669 -20101208180512642-2539 = 673 -20101208180524877-2540 = 674 -20101208180535858-2541 = 676 -20101208180618449-2542 = 672 -20101208180741451-2544 = 670 -20101208180754738-2545 = 668 -20101208180802950-2546 = 671 -20101216160104564-2573 = 683 -20101216161556607-2574 = 679 -20101216161706668-2575 = 678 -20101216161842951-2576 = 682 -20101223131915300-2596 = 689 -20101223131934864-2597 = 693 -20101223131958575-2598 = 692 -20101223142020038-2599 = 691 -20101223142044320-2600 = 688 -20101223142137484-2601 = 695 -20101223145935775-2602 = 690 -20101223150112169-2603 = 687 -20110106172426022-2628 = 702 -20110106172623134-2631 = 696 -20110111133728698-2648 = 735 -20110111133741184-2649 = 731 -20110111133750259-2650 = 730 -20110111133800463-2651 = 729 -20110111133819858-2652 = 734 -20110111133833232-2653 = 737 -20110111133925478-2654 = 733 -20110111134512151-2656 = 732 -20110119144810858-2677 = 720 -20110119144824649-2678 = 715 -20110119144840280-2679 = 716 -20110119144908074-2680 = 722 -20110119144922057-2681 = 718 -20110119144932489-2682 = 719 -20110119145030224-2683 = 714 -20110119172858214-2684 = 717 -20110124165223963-2717 = 744 -20110124165239005-2718 = 738 -20110124165249350-2719 = 741 -20110124165300845-2720 = 740 -20110124165309809-2721 = 743 -20110124165319690-2722 = 742 -20110124165330021-2723 = 746 -20110124165417938-2724 = 739 -20110126170744784-2739 = 753 -20110126170757586-2740 = 748 -20110126170812874-2741 = 752 -20110126170904496-2742 = 749 -20110126170913781-2743 = 750 -20110126170924920-2744 = 755 -20110126170934940-2745 = 751 -20110126171017427-2746 = 747 -20110128173910875-2771 = 757 -20110128173948892-2772 = 761 -20110128174054442-2773 = 760 -20110128174102935-2774 = 764 -20110204175731219-2802 = 771 -20110204180026381-2806 = 1007 -20110204180111411-2807 = 768 -20110204180203891-2808 = 765 -20110216170951405-2835 = 776 -20110216171003565-2836 = 780 -20110216171016533-2837 = 774 -20110216171109597-2838 = 779 -20110216171119442-2839 = 778 -20110216171131158-2840 = 775 -20110216171139752-2841 = 777 -20110216171245854-2842 = 782 -20110225153927329-2861 = 787 -20110225153937373-2862 = 786 -20110225154229367-2868 = 785 -20110304161341497-2909 = 798 -20110304161354616-2910 = 793 -20110304161404678-2911 = 794 -20110304161416425-2912 = 795 -20110304161511996-2913 = 792 -20110304161558708-2914 = 800 -20110304161610219-2915 = 796 -20110304161619017-2916 = 797 -20110308152354091-2935 = 802 -20110308164745004-2936 = 806 -20110308165016533-2937 = 807 -20110308165031895-2938 = 809 -20110308165046032-2939 = 803 -20110308165058859-2940 = 801 -20110308165111155-2941 = 804 -20110308165207411-2942 = 805 -20110311165541070-2955 = 811 -20110311165618997-2956 = 815 -20110311165627903-2957 = 816 -20110311165641847-2958 = 818 -20110311165652155-2959 = 812 -20110311165702497-2960 = 810 -20110311165710565-2961 = 813 -20110311165751597-2962 = 814 -20110322174735590-2987 = 819 -20110322174744276-2988 = 827 -20110322174752176-2989 = 823 -20110322174804928-2990 = 824 -20110322174816513-2991 = 820 -20110322174854810-2992 = 825 -20110322174930179-2993 = 822 -20110328173520192-3005 = 832 -20110330172304098-3062 = 837 -20110330172320609-3063 = 845 -20110330172353996-3064 = 841 -20110330172449014-3065 = 842 -20110330172532594-3066 = 843 -20110401123647447-3086 = 854 -20110401123747747-3087 = 846 -20110401123756497-3088 = 849 -20110401123837379-3089 = 848 -20110408161507733-3144 = 861 -20110408161603628-3145 = 857 -20110408161613018-3146 = 856 -20110408161710832-3147 = 859 -20110415145206837-3162 = 868 -20110415145224958-3163 = 869 -20110415145234625-3164 = 873 -20110415145243947-3165 = 871 -20110415145254052-3166 = 867 -20110415145300442-3167 = 865 -20110415145310779-3168 = 866 -20110415145352673-3169 = 870 -20110429193420576-3201 = 1008 -20110429193512326-3202 = 878 -20110429193619818-3203 = 882 -20110429193631236-3204 = 880 -20110429193710132-3205 = 879 -20110506112228291-3238 = 884 -20110506112238037-3239 = 889 -20110506112345088-3240 = 888 -20110506112906454-3241 = 887 -20110506112928768-3242 = 883 -20110506112939522-3243 = 886 -20110506113034807-3244 = 885 -20110506113120272-3245 = 891 -20110518171554996-3334 = 907 -20110530100049402-3380 = 909 -20110530104418529-3390 = 981 -20110530104435608-3391 = 980 -20110530104445594-3392 = 982 -20110530104454302-3393 = 983 -20110530104536396-3394 = 984 -20110530104553755-3395 = 985 -20110530104610535-3396 = 986 -20110530105258256-3398 = 935 -20110530110700441-3400 = 950 -20110530110748437-3401 = 948 -20110530110854700-3402 = 946 -20110530111114947-3404 = 989 -20110530111156037-3405 = 987 -20110530111206334-3406 = 949 -20110530111309468-3407 = 988 -20110530111723730-3408 = 1091 -20110531163103070-3423 = 923 -20110603163952299-3444 = 932 -20110603164002251-3445 = 928 -20110603164236760-3448 = 929 -20110614115224929-3492 = 955 -20110614115236209-3493 = 958 -20110614115244123-3494 = 959 -20110614115252407-3495 = 961 -20110614115335826-3496 = 957 -20110614115427900-3497 = 956 -20110614115444550-3498 = 953 -20110614115453404-3499 = 954 -20110614120857985-3502 = 970 -20110614120908780-3503 = 966 -20110614120917006-3504 = 967 -20110614120930409-3505 = 968 -20110614120939524-3506 = 971 -20110614120951782-3507 = 969 -20110614121000380-3508 = 973 -20110614121044764-3509 = 965 -20110623171800595-3593 = 992 -20110623171809317-3594 = 997 -20110623171816627-3595 = 996 -20110623171824682-3596 = 995 -20110623171908093-3597 = 999 -20110623171942736-3598 = 991 -20110623171950035-3599 = 994 -20110627163827291-3645 = 1014 -20110627163834920-3646 = 1012 -20110627163843782-3647 = 1009 -20110627163851583-3648 = 1010 -20110627163900854-3649 = 1015 -20110627163911662-3650 = 1017 -20110627163920227-3651 = 1013 -20110627163959498-3652 = 1011 -20110701124735783-3673 = 1022 -20110701124840475-3674 = 1026 -20110701124911387-3675 = 1023 -20110701124925097-3676 = 1021 -20110701124940206-3677 = 1024 -20110701124949784-3678 = 1020 -20110701125048746-3679 = 1025 -20110701125848642-3681 = 1028 -20110712162052068-3727 = 1116 -20110712162142262-3728 = 1114 -20110712162158337-3729 = 1109 -20110712162959239-3732 = 1112 -20110712163802950-3734 = 1111 -20110712163816557-3735 = 1113 -20110722150931082-3778 = 1092 -20110722151001724-3779 = 1102 -20110722151015036-3780 = 1095 -20110722151027357-3781 = 1094 -20110722151053225-3782 = 1093 -20110722151107789-3783 = 1103 -20110722151255593-3784 = 1104 -20110802113225135-3837 = 1101 -20110812164104243-3922 = 1118 -20110812164124334-3923 = 1119 -20110812164140933-3924 = 1120 -20110812164618385-3926 = 1122 -20110816140502278-3937 = 1164 -20110816140513770-3938 = 1162 -20110816140523061-3939 = 1159 -20110816140534466-3940 = 1158 -20110816140548634-3941 = 1165 -20110816140557507-3942 = 1160 -20110816140834271-3943 = 1163 -20110816140956071-3944 = 1161 -20110819114620176-3981 = 1172 -20110819115408426-3985 = 1429 -20110826150921259-4275 = 1356 -20110826150933501-4276 = 1355 -20110826151344944-4279 = 1368 -20110826151422790-4280 = 1428 -20110907162319805-4569 = 1761 -20110907162516619-4570 = 1768 -20110907162826858-4573 = 1701 -20110907162839829-4574 = 1702 -20110907162852467-4575 = 1700 -20110907162902139-4576 = 1699 -20110916123944405-4954 = 1520 -20110916123958887-4955 = 1517 -20110916124033126-4956 = 1515 -20110916124043200-4957 = 1514 -20110916124118500-4958 = 1521 -20110916124128257-4959 = 1516 -20110916124138311-4960 = 1518 -20110916124224567-4961 = 1519 -20110916150155542-4971 = 1697 -20110916150203159-4972 = 1695 -20110916150216306-4973 = 1692 -20110916150307781-4974 = 1704 -20110916150353166-4975 = 1696 -20110916150448111-4976 = 2484 -20110916150456853-4977 = 2483 -20110916150557692-4978 = 1694 -20110922125513940-5037 = 1734 -20110922125513952-5038 = 1729 -20110922125513958-5039 = 1730 -20110922125513963-5040 = 1731 -20110922125513968-5041 = 1727 -20110922125513975-5042 = 1591 -20110922125513980-5043 = 1732 -20110922125513986-5044 = 1728 -20110926171509059-5128 = 1739 -20110926171509067-5129 = 1742 -20110926171509073-5130 = 1736 -20110926171509079-5131 = 1737 -20110926171509084-5132 = 1740 -20110926171509089-5133 = 1738 -20110926171509094-5134 = 1735 -20110926171509099-5135 = 1741 -20110930173048771-5200 = 1679 -20110930173048780-5201 = 1628 -20110930173048787-5202 = 1682 -20110930173048794-5203 = 1686 -20110930173048799-5204 = 1627 -20110930173048805-5205 = 1684 -20110930173048811-5206 = 1668 -20110930173048817-5207 = 1656 -20111013113013967-5332 = 1723 -20111013113013976-5333 = 1721 -20111013113013982-5334 = 1724 -20111013113013987-5335 = 1725 -20111013113013991-5336 = 1719 -20111013113013997-5337 = 1722 -20111013113014001-5338 = 2486 -20111013113014005-5339 = 2485 -20111027100116548-30919 = 1862 -20111027100116554-30920 = 1858 -20111027100116559-30921 = 1845 -20111027100116564-30922 = 1840 -20111027100116570-30923 = 1859 -20111027100116576-30924 = 1870 -20111027100116583-30925 = 1876 -20111027100116588-30926 = 1853 -20111031152022276-6886845 = 1888 -20111031152022283-6886846 = 1886 -20111031152022288-6886847 = 1881 -20111031152022294-6886848 = 1883 -20111031152022299-6886849 = 2339 -20111031152022305-6886850 = 1887 -20111031152022310-6886851 = 1884 -20111031152022316-6886852 = 1905 -20111109124517141-8007681 = 1918 -20111109124528501-8007682 = 1919 -20111109124538202-8007683 = 1912 -20111109124547350-8007684 = 1917 -20111109124556811-8007685 = 1915 -20111109124700955-8007686 = 1914 -20111115152506714-19519160 = 2149 -20111116170443345-19519187 = 2151 -20111116170649427-19519188 = 2152 -20111116170836661-19519189 = 2096 -20111116170949414-19519190 = 1966 -20111116171035686-19519191 = 2148 -20111116171044764-19519192 = 2147 -20111116171054225-19519193 = 2150 -20111124093717346-30845008 = 2161 -20111124093753125-30845009 = 2159 -20111124093805945-30845010 = 2156 -20111124093823893-30845011 = 2155 -20111124093838453-30845012 = 2162 -20111124093849455-30845013 = 2157 -20111124093859676-30845014 = 2158 -20111124093949998-30845015 = 2160 -20111125162630368-31094263 = 2172 -20111125162639758-31094264 = 2170 -20111125162648132-31094265 = 2165 -20111125162659163-31094266 = 2166 -20111125162708561-31094267 = 2171 -20111125162717330-31094268 = 2167 -20111125162728600-31094269 = 2169 -20111125162820338-31094270 = 2168 -20111202165037320-31094311 = 2194 -20111202165037329-31094312 = 2196 -20111202165037338-31094313 = 2199 -20111202165037345-31094314 = 2200 -20111202165037352-31094315 = 2195 -20111202165037360-31094316 = 2193 -20111202165037368-31094317 = 2198 -20111202165037375-31094318 = 2197 -20111202173036363-31094324 = 2280 -20111206153216085-32933074 = 2275 -20111206153216090-32933075 = 2272 -20111206153216095-32933076 = 2268 -20111206153216100-32933077 = 2269 -20111206153216105-32933078 = 2271 -20111206153216109-32933079 = 2274 -20111206153216113-32933080 = 2270 -20111206153216121-32933082 = 2273 -20111213153012524-46581714 = 2298 -20111213153012529-46581715 = 2301 -20111213153012534-46581716 = 2291 -20111213153012538-46581717 = 2292 -20111213153012545-46581719 = 2299 -20111213153012548-46581720 = 2297 -20111213153012553-46581721 = 2290 -20111213153012557-46581722 = 2300 -20111213162012966-46680667 = 2389 -20111213162012971-46680668 = 2388 -20111213162012977-46680669 = 2385 -20111213162012984-46680671 = 2386 -20111213162012989-46680672 = 2387 -20111220163023723-56006597 = 2405 -20111220163023731-56006598 = 2402 -20111220163023738-56006599 = 2406 -20111220163023744-56006600 = 2407 -20111220163023751-56006601 = 2401 -20111220163023757-56006602 = 2404 -20111220163023762-56006603 = 2408 -20111220163023768-56006604 = 2403 -20111220170021890-56006606 = 2421 -20111220170021896-56006607 = 2418 -20111220170021902-56006608 = 2424 -20111220170021907-56006609 = 2423 -20111220170021912-56006610 = 2420 -20111220170021918-56006611 = 2422 -20111220170021924-56006612 = 2425 -20111220170021931-56006613 = 2419 -20120105163504805-56010550 = 3041 -20120105163504811-56010551 = 3036 -20120105163504817-56010552 = 3039 -20120105163504822-56010553 = 3040 -20120105163504830-56010554 = 3035 -20120105163504838-56010555 = 3016 -20120105163504843-56010556 = 3038 -20120105163504848-56010557 = 3037 -20120105170038905-56010559 = 3076 -20120105170038912-56010560 = 3078 -20120105170038919-56010561 = 3075 -20120105170038925-56010562 = 3074 -20120105170038931-56010563 = 3080 -20120105170038937-56010564 = 3077 -20120105170038943-56010565 = 3073 -20120105170038948-56010566 = 3079 -20120113102828303-58395829 = 3006 -20120113102840860-58395830 = 3003 -20120113102852873-58395831 = 2999 -20120113102902474-58395832 = 3000 -20120113102915043-58395833 = 3005 -20120113102926653-58395834 = 3001 -20120113103050906-58395835 = 3004 -20120113103136726-58395836 = 3002 -20120113174211710-58395888 = 3102 -20120113174211716-58395889 = 3104 -20120113174211721-58395890 = 3099 -20120113174211726-58395891 = 3100 -20120113174211731-58395892 = 3103 -20120113174211736-58395893 = 3101 -20120113174211742-58395894 = 3098 -20120113174211747-58395895 = 3105 -20120113175144487-58395897 = 3007 -20120113175144498-58395898 = 3010 -20120113175144505-58395899 = 3014 -20120113175144510-58395900 = 3013 -20120113175144517-58395901 = 3011 -20120113175144524-58395902 = 3008 -20120113175144529-58395903 = 3012 -20120113175144534-58395904 = 3009 -20120119144309285-60397187 = 2591 -20120119144309292-60397188 = 2588 -20120119144309297-60397189 = 2594 -20120119144309304-60397190 = 2593 -20120119144309310-60397191 = 2529 -20120119144309315-60397192 = 2592 -20120119144309321-60397193 = 2595 -20120119144309326-60397194 = 2589 -20120126112933908-60397756 = 3126 -20120126112933915-60397757 = 3129 -20120126112933921-60397758 = 3131 -20120126112933926-60397759 = 3132 -20120126112933932-60397760 = 3127 -20120126112933938-60397761 = 3125 -20120126112933945-60397762 = 3130 -20120126112933950-60397763 = 3128 -20120127152728774-60397877 = 3148 -20120127152743722-60397878 = 3146 -20120127152814026-60397879 = 3143 -20120127152826763-60397880 = 3142 -20120127152857313-60397881 = 3149 -20120127152907513-60397882 = 3144 -20120127153027663-60397883 = 3145 -20120127153114700-60397884 = 3147 -20120209155957200-60398012 = 3245 -20120209155957206-60398013 = 3242 -20120209155957211-60398014 = 3238 -20120209155957217-60398015 = 3239 -20120209155957223-60398016 = 3241 -20120209155957228-60398017 = 3244 -20120209155957236-60398018 = 3240 -20120209155957242-60398019 = 3243 -20120215144011662-60398118 = 3268 -20120215144011670-60398119 = 3265 -20120215144011677-60398120 = 3271 -20120215144011684-60398121 = 3274 -20120215144011690-60398122 = 3267 -20120215144011698-60398123 = 3269 -20120215144011705-60398124 = 3273 -20120215144011712-60398125 = 3266 -20120217124053431-60398146 = 3257 -20120217124113643-60398147 = 3259 -20120217124124306-60398148 = 3262 -20120217124136020-60398149 = 3263 -20120217124145802-60398150 = 3256 -20120217124154317-60398151 = 3261 -20120217124201986-60398152 = 3260 -20120217124245321-60398153 = 3258 -20120224150007051-60398208 = 3457 -20120224150007061-60398209 = 3382 -20120224150007080-60398211 = 3276 -20120224150007087-60398212 = 3329 -20120224150007093-60398213 = 3431 -20120224150007100-60398214 = 3456 -20120224150007106-60398215 = 3378 -20120306152009283-60398636 = 3495 -20120306152009289-60398637 = 3492 -20120306152009296-60398638 = 3488 -20120306152009302-60398639 = 3489 -20120306152009308-60398640 = 3491 -20120306152009314-60398641 = 3494 -20120306152009319-60398642 = 3490 -20120306152009324-60398643 = 3493 -20120306162009227-60398645 = 3522 -20120306162009234-60398646 = 3524 -20120306162009241-60398647 = 3521 -20120306162009247-60398648 = 3520 -20120306162009253-60398649 = 3526 -20120306162009259-60398650 = 3523 -20120306162009265-60398651 = 3805 -20120306162009271-60398652 = 3525 -20120313123229824-60398842 = 3666 -20120313123347844-60398843 = 3669 -20120313123400417-60398844 = 3663 -20120313123504856-60398845 = 3664 -20120313123549079-60398846 = 3667 -20120313123655509-60398847 = 3665 -20120313123706173-60398848 = 3662 -20120313123813502-60398849 = 3668 -20120315155009442-60398967 = 3728 -20120315155009450-60398968 = 3725 -20120315155009458-60398969 = 3721 -20120315155009465-60398970 = 3722 -20120315155009472-60398971 = 3724 -20120315155009479-60398972 = 3727 -20120315155009486-60398973 = 3723 -20120315155009495-60398974 = 3726 -20120327111019853-60399075 = 3749 -20120327111019860-60399076 = 3754 -20120327111019866-60399077 = 3764 -20120327111019872-60399078 = 3769 -20120327111019878-60399079 = 3750 -20120327111019885-60399080 = 3760 -20120327111019891-60399081 = 3771 -20120327111019897-60399082 = 3744 -20120404143842979-60399184 = 3799 -20120404143857664-60399185 = 3796 -20120404143908551-60399186 = 3802 -20120404143924639-60399187 = 3801 -20120404144043061-60399188 = 3800 -20120404144226270-60399189 = 3803 -20120404144237325-60399190 = 3797 -20120404144344378-60399191 = 3798 -20120412124011430-60399233 = 3896 -20120412124011435-60399234 = 3898 -20120412124011440-60399235 = 3897 -20120412124011445-60399236 = 4292 -20120412124011449-60399237 = 3895 -20120412124011453-60399238 = 3899 -20120412124011458-60399239 = 3893 -20120412124011462-60399240 = 3894 -20120416140613669-60399279 = 3836 -20120416140613677-60399280 = 3834 -20120416140613683-60399281 = 3833 -20120416140613689-60399282 = 3835 -20120416140613695-60399283 = 3837 -20120416140613700-60399284 = 3839 -20120416140613706-60399285 = 3838 -20120416140613711-60399286 = 3840 -20120420104805614-60399425 = 3965 -20120420104805619-60399426 = 3962 -20120420104805624-60399427 = 3960 -20120420104805631-60399428 = 3959 -20120420104805636-60399429 = 3964 -20120420104805643-60399430 = 4010 -20120420104805648-60399431 = 3961 -20120420104805654-60399432 = 3963 -20120427125614128-60399646 = 4280 -20120427125614134-60399647 = 4277 -20120427125614141-60399648 = 4281 -20120427125614146-60399649 = 4278 -20120427125614153-60399650 = 4274 -20120427125614158-60399651 = 4275 -20120427125614164-60399652 = 4276 -20120427125614170-60399653 = 4279 -20120504110615536-60399799 = 4104 -20120504110615544-60399800 = 4106 -20120504110615551-60399801 = 4111 -20120504110615558-60399802 = 4110 -20120504110615564-60399803 = 4108 -20120504110615570-60399804 = 4105 -20120504110615576-60399805 = 4109 -20120504110615582-60399806 = 4107 -20120511113620386-60399887 = 4136 -20120511113620396-60399888 = 4138 -20120511113620405-60399889 = 4135 -20120511113620414-60399890 = 4134 -20120511113620423-60399891 = 4140 -20120511113620430-60399892 = 4137 -20120511113620437-60399893 = 4133 -20120511113620444-60399894 = 4139 -20120525114328674-60400382 = 4403 -20120525114328682-60400383 = 4401 -20120525114328691-60400384 = 4404 -20120525114328699-60400385 = 4405 -20120525114328706-60400386 = 4399 -20120525114328714-60400387 = 4402 -20120525114328723-60400388 = 4406 -20120525114328731-60400389 = 4400 -20120525114423248-60400391 = 4415 -20120525114423257-60400392 = 4319 -20120525114423264-60400393 = 4433 -20120525114423271-60400394 = 4435 -20120525114423279-60400395 = 4429 -20120525114423289-60400396 = 4427 -20120525114423300-60400397 = 4436 -20120525114423307-60400398 = 4431 -20120606115418775-60400564 = 4479 -20120606115418783-60400565 = 4477 -20120606115418789-60400566 = 4473 -20120606115418795-60400567 = 4474 -20120606115418801-60400568 = 4475 -20120606115418808-60400569 = 4478 -20120606115418815-60400570 = 4465 -20120606115418821-60400571 = 4476 -20120606120812962-60400573 = 4537 -20120606120812967-60400574 = 4539 -20120606120812972-60400575 = 4540 -20120606120812977-60400576 = 4534 -20120606120812983-60400577 = 4538 -20120606120812988-60400578 = 4535 -20120606120812992-60400579 = 4536 -20120606120812997-60400580 = 4541 -20120612103612900-60400700 = 4606 -20120612103612908-60400701 = 4622 -20120612103612916-60400702 = 4624 -20120612103612923-60400703 = 4608 -20120612103612931-60400704 = 4605 -20120612103612939-60400705 = 4607 -20120612103612948-60400706 = 4610 -20120612103612956-60400707 = 4604 -20120618162411407-60401924 = 4692 -20120618162411414-60401925 = 4694 -20120618162411419-60401926 = 4697 -20120618162411425-60401927 = 4698 -20120618162411431-60401928 = 4693 -20120618162411437-60401929 = 4691 -20120618162411443-60401930 = 4696 -20120618162411448-60401931 = 4695 -20120625112207079-60401997 = 4649 -20120625112207088-60401998 = 4652 -20120625112207095-60401999 = 4648 -20120625112207102-60402000 = 4647 -20120625112207110-60402001 = 4653 -20120625112207117-60402002 = 4650 -20120625112207125-60402003 = 4646 -20120625112207132-60402004 = 4651 -20120702153422414-60402091 = 4940 -20120702153422422-60402092 = 4942 -20120702153422429-60402093 = 4937 -20120702153422436-60402094 = 4938 -20120702153422445-60402095 = 4941 -20120702153422453-60402096 = 5159 -20120702153422461-60402097 = 4936 -20120702153422468-60402098 = 4943 -20120705111214714-60402221 = 4847 -20120705111214721-60402222 = 4849 -20120705111214727-60402223 = 4853 -20120705111214733-60402224 = 4852 -20120705111214739-60402225 = 4850 -20120705111214746-60402226 = 4848 -20120705111214752-60402227 = 4851 -20120705111214758-60402228 = 4840 -20120710111010138-60402391 = 4993 -20120710111010144-60402392 = 4990 -20120710111010150-60402393 = 4988 -20120710111010155-60402394 = 4987 -20120710111010161-60402395 = 4992 -20120710111010167-60402396 = 4994 -20120710111010172-60402397 = 4989 -20120710111010177-60402398 = 4991 -20120717115016575-60402508 = 5023 -20120717115016583-60402509 = 5018 -20120717115016591-60402510 = 5015 -20120717115016598-60402511 = 5021 -20120717115016606-60402512 = 5020 -20120717115016613-60402513 = 5024 -20120717115016621-60402514 = 5022 -20120717115016628-60402515 = 5019 -20120717124611961-60402517 = 5041 -20120717124611969-60402518 = 5045 -20120717124611978-60402519 = 5044 -20120717124611985-60402520 = 5035 -20120717124611992-60402521 = 5046 -20120717124612001-60402522 = 5047 -20120717124612009-60402523 = 5043 -20120717124612017-60402524 = 5039 -20120725144841917-60402818 = 5659 -20120727113414183-60402832 = 5217 -20120727113414191-60402833 = 5219 -20120727113414198-60402834 = 5222 -20120727113414206-60402835 = 5223 -20120727113414212-60402836 = 5218 -20120727113414219-60402837 = 5216 -20120727113414229-60402838 = 5221 -20120727113414236-60402839 = 5220 -20120727122030657-60402842 = 5654 -20120727122030666-60402843 = 5653 -20120727122030675-60402844 = 5650 -20120727122030683-60402845 = 5649 -20120727122030693-60402846 = 5657 -20120727122030702-60402847 = 5655 -20120727122030711-60402848 = 5651 -20120727122030718-60402849 = 5652 -20120808095418813-60403532 = 5712 -20120808095418821-60403533 = 5715 -20120808095418830-60403534 = 5709 -20120808095418837-60403535 = 5710 -20120808095418845-60403536 = 5713 -20120808095418852-60403537 = 5711 -20120808095418860-60403538 = 5708 -20120808095418868-60403539 = 5714 -20120817123015190-60403697 = 5753 -20120817123015196-60403698 = 5750 -20120817123015202-60403699 = 5756 -20120817123015206-60403700 = 5755 -20120817123015211-60403701 = 5752 -20120817123015216-60403702 = 5754 -20120817123015221-60403703 = 5757 -20120817123015226-60403704 = 5751 -20120821111407265-60403749 = 5815 -20120821111407270-60403750 = 5812 -20120821111407277-60403751 = 5808 -20120821111407284-60403752 = 5809 -20120821111407290-60403753 = 5811 -20120821111407296-60403754 = 5814 -20120821111407302-60403755 = 5810 -20120821111407308-60403756 = 5813 -20120827152950859-60403941 = 5940 -20120830123814716-60403947 = 5932 -20120830123814724-60403948 = 5935 -20120830123814732-60403949 = 5939 -20120830123814740-60403950 = 5938 -20120830123814750-60403951 = 5936 -20120830123814758-60403952 = 5933 -20120830123814766-60403953 = 5937 -20120830123814773-60403954 = 5934 -20120911102013785-60404194 = 6085 -20120911102013792-60404195 = 6088 -20120911102013799-60404196 = 6090 -20120911102013806-60404197 = 6091 -20120911102013813-60404198 = 6086 -20120911102013821-60404199 = 6084 -20120911102013828-60404200 = 6089 -20120911102013836-60404201 = 6087 -20120917113811498-60404914 = 6095 -20120917113811506-60404915 = 6098 -20120917113811517-60404916 = 6094 -20120917113811524-60404917 = 26929 -20120917113811530-60404918 = 6099 -20120917113811538-60404919 = 6096 -20120917113811546-60404920 = 6092 -20120917113811552-60404921 = 6097 -20120925172436757-60405088 = 6614 -20120925172436766-60405089 = 6611 -20120925172436774-60405090 = 6636 -20120925172436783-60405091 = 6616 -20120925172436791-60405092 = 6610 -20120925172436799-60405093 = 6613 -20120925172436808-60405094 = 6635 -20120925172436816-60405095 = 6612 -20120928114612853-60405097 = 6169 -20120928114612859-60405098 = 6167 -20120928114612866-60405099 = 6178 -20120928114612873-60405100 = 6171 -20120928114612881-60405101 = 6168 -20120928114612889-60405102 = 6170 -20120928114612897-60405103 = 6173 -20120928114612904-60405104 = 6166 -20121003114009009-60405221 = 7181 -20121003114009017-60405222 = 7182 -20121003114009023-60405223 = 7187 -20121003114009029-60405224 = 7186 -20121003114009035-60405225 = 7184 -20121003114009041-60405226 = 7185 -20121003114009047-60405227 = 7188 -20121003114009053-60405228 = 7183 -20121013120615890-60405286 = 6632 -20121013120615900-60405287 = 6630 -20121013120615907-60405288 = 6627 -20121013120615913-60405289 = 6626 -20121013120615921-60405290 = 6631 -20121013120615928-60405291 = 6633 -20121013120615936-60405292 = 6628 -20121013120615942-60405293 = 6629 -20121019102214857-60405797 = 6700 -20121019102214865-60405798 = 6697 -20121019102214872-60405799 = 6703 -20121019102214878-60405800 = 6702 -20121019102214884-60405801 = 6716 -20121019102214891-60405802 = 6701 -20121019102214896-60405803 = 6704 -20121019102214903-60405804 = 6698 -20121026142410765-60406542 = 7544 -20121026142410773-60406543 = 7545 -20121026142410780-60406544 = 7546 -20121026142410785-60406545 = 7547 -20121026142410791-60406546 = 8103 -20121026142410798-60406547 = 7549 -20121026142410806-60406548 = 7550 -20121026142410811-60406549 = 7551 -20121029181607907-60406587 = 7255 -20121029181607912-60406588 = 7253 -20121029181607919-60406589 = 7251 -20121029181607924-60406590 = 7250 -20121029181607929-60406591 = 7254 -20121029181607936-60406592 = 7256 -20121029181607942-60406593 = 7252 -20121029181607947-60406594 = 7298 -20121030115624887-60406607 = 7208 -20121030115631586-60406608 = 7207 -20121102154200905-60407020 = 7724 -20121102154204647-60407021 = 7869 -20121103091208986-60407047 = 7581 -20121103091208994-60407048 = 7579 -20121103091209001-60407049 = 7576 -20121103091209008-60407050 = 7575 -20121103091209015-60407051 = 7580 -20121103091209022-60407052 = 7582 -20121103091209030-60407053 = 7577 -20121103091209037-60407054 = 7578 -20121113111609476-60407345 = 7740 -20121113111609484-60407346 = 7736 -20121113111609491-60407347 = 7737 -20121113111609498-60407348 = 7734 -20121113111609505-60407349 = 7739 -20121113111609511-60407350 = 7738 -20121113111609518-60407351 = 7733 -20121113111609523-60407352 = 7735 -20121113130406843-60407354 = 7713 -20121113130406850-60407355 = 7710 -20121113130406856-60407356 = 7708 -20121113130406862-60407357 = 7707 -20121113130406868-60407358 = 7712 -20121113130406875-60407359 = 7714 -20121113130406883-60407360 = 7709 -20121113130406889-60407361 = 7711 -20121120105624562-60407557 = 7804 -20121120105624571-60407558 = 7802 -20121120105624578-60407559 = 7809 -20121120105624585-60407560 = 7808 -20121120105624593-60407561 = 7803 -20121120105624600-60407562 = 7806 -20121120105624607-60407563 = 7805 -20121120105624614-60407564 = 7807 -20121123122418416-60407651 = 8122 -20121123122418422-60407652 = 8128 -20121123122418428-60407653 = 8123 -20121123122418434-60407654 = 8124 -20121123122418439-60407655 = 8126 -20121123122418446-60407656 = 8129 -20121123122418452-60407657 = 8125 -20121123122418457-60407658 = 8127 -20121127112813823-60407720 = 8046 -20121127112813830-60407721 = 8043 -20121127112813837-60407722 = 8047 -20121127112813844-60407723 = 8757 -20121127112813851-60407724 = 8042 -20121127112813857-60407725 = 8766 -20121127112813864-60407726 = 8774 -20121127112813869-60407727 = 8784 -20121129112014286-60407868 = 8368 -20121129112014292-60407869 = 8365 -20121129112014297-60407870 = 8369 -20121129112014304-60407871 = 8370 -20121129112014309-60407872 = 8364 -20121129112014315-60407873 = 8367 -20121129112014319-60407874 = 8371 -20121129112014325-60407875 = 8366 -20121130160813307-60408030 = 8177 -20121130160813315-60408031 = 8182 -20121130160813322-60408032 = 8180 -20121130160813327-60408033 = 8179 -20121130160813332-60408034 = 8184 -20121130160813338-60408035 = 8181 -20121130160813344-60408036 = 8178 -20121130160813351-60408037 = 8183 -20121207170558909-60408468 = 8378 -20121207170558924-60408469 = 8375 -20121207170558939-60408470 = 8373 -20121207170558953-60408471 = 8372 -20121207170558966-60408472 = 8377 -20121207170558988-60408473 = 8746 -20121207170559006-60408474 = 8374 -20121207170559019-60408475 = 8376 -20121212111609369-60408661 = 8421 -20121212111609377-60408662 = 8423 -20121212111609383-60408663 = 8419 -20121212111609390-60408664 = 8424 -20121212111609396-60408665 = 8425 -20121212111609402-60408666 = 8422 -20121212111609409-60408667 = 8420 -20121212111609415-60408668 = 8426 -20121218104202329-60408793 = 8478 -20121218110412741-60408795 = 8462 -20121218110412760-60408796 = 8465 -20121218110412767-60408797 = 8460 -20121218110412774-60408798 = 8467 -20121218110412781-60408799 = 8463 -20121218110412787-60408800 = 8464 -20121218110412794-60408801 = 8461 -20121218110412800-60408802 = 8466 -20130104112813769-60409072 = 8522 -20130104112813778-60409073 = 8524 -20130104112813786-60409074 = 8519 -20130104112813794-60409075 = 8520 -20130104112813802-60409076 = 8523 -20130104112813808-60409077 = 8521 -20130104112813815-60409078 = 8518 -20130104112813821-60409079 = 8525 -20130111133549473-60409201 = 8586 -20130115102816314-60409230 = 8682 -20130115112412967-60409238 = 8576 -20130115112412973-60409239 = 8578 -20130115112412980-60409240 = 8573 -20130115112412987-60409241 = 8574 -20130115112412994-60409242 = 8577 -20130115112413002-60409243 = 8575 -20130115112413008-60409244 = 8572 -20130115112413014-60409245 = 8579 -20130118105206318-60409278 = 8967 -20130118105206324-60409279 = 8965 -20130118105206331-60409280 = 8960 -20130118105206337-60409281 = 8961 -20130118105206342-60409282 = 8963 -20130118105206347-60409283 = 8966 -20130118105206354-60409284 = 8962 -20130118105206360-60409285 = 8964 -20130118110405781-60409287 = 8732 -20130118110405799-60409288 = 8735 -20130118110405806-60409289 = 8739 -20130118110405814-60409290 = 8738 -20130118110405820-60409291 = 8736 -20130118110405827-60409292 = 8733 -20130118110405834-60409293 = 8737 -20130118110405840-60409294 = 8734 -20130124104010537-60409594 = 8837 -20130124104010545-60409595 = 8817 -20130124104010552-60409596 = 8801 -20130124104010559-60409597 = 8808 -20130124104010566-60409598 = 8843 -20130124104010573-60409599 = 8840 -20130124104010579-60409600 = 8842 -20130124104010586-60409601 = 8841 -20130201104415424-60409857 = 9054 -20130201104415432-60409858 = 9051 -20130201104415438-60409859 = 9055 -20130201104415444-60409860 = 9056 -20130201104415450-60409861 = 9050 -20130201104415458-60409862 = 9053 -20130201104415464-60409863 = 9057 -20130201104415471-60409864 = 9052 -20130206162625876-60409974 = 9070 -20130206162713329-60409975 = 9079 -20130208122012573-60410015 = 9141 -20130208122012670-60410016 = 9143 -20130208122012678-60410017 = 9140 -20130208122012686-60410018 = 9139 -20130208122012693-60410019 = 9145 -20130208122012701-60410020 = 9142 -20130208122012708-60410021 = 9138 -20130208122012717-60410022 = 9144 -20130208153209913-60410024 = 9241 -20130208153209922-60410025 = 9238 -20130208153209929-60410026 = 9244 -20130208153209935-60410027 = 9243 -20130208153209941-60410028 = 9317 -20130208153209948-60410029 = 9242 -20130208153209954-60410030 = 9245 -20130208153209961-60410031 = 9239 -20130214105609636-60410104 = 9180 -20130214105609642-60410105 = 9182 -20130214105609647-60410106 = 9185 -20130214105609652-60410107 = 9186 -20130214105609659-60410108 = 9181 -20130214105609668-60410109 = 9179 -20130214105609675-60410110 = 9184 -20130214105609682-60410111 = 9183 -20130220121112375-60410143 = 9157 -20130220121209377-60410144 = 9148 -20130221110411926-60410212 = 9314 -20130221110411935-60410213 = 9312 -20130221110411943-60410214 = 9309 -20130221110411950-60410215 = 9308 -20130221110411959-60410216 = 9313 -20130221110411968-60410217 = 9315 -20130221110411976-60410218 = 9310 -20130221110411984-60410219 = 9311 -20130227114414125-60410375 = 9417 -20130227114414137-60410376 = 9420 -20130227114414149-60410377 = 9422 -20130227114414162-60410378 = 9423 -20130227114414177-60410379 = 9418 -20130227114414194-60410380 = 9424 -20130227114414206-60410381 = 9425 -20130227114414216-60410382 = 9426 -20130227115613221-60410384 = 9375 -20130227115613232-60410385 = 9377 -20130227115613243-60410386 = 9380 -20130227115613252-60410387 = 9381 -20130227115613262-60410388 = 9376 -20130227115613274-60410389 = 9374 -20130227115613284-60410390 = 9379 -20130227115613295-60410391 = 9378 -20130304141030443-60410476 = 9393 -20130312093624504-60410573 = 9438 -20130312100010331-60410586 = 9522 -20130312100010342-60410587 = 9520 -20130312100010353-60410588 = 9523 -20130312100010363-60410589 = 9524 -20130312100010373-60410590 = 9518 -20130312100010383-60410591 = 9521 -20130312100010393-60410592 = 9525 -20130312100010403-60410593 = 9529 -20130315123609176-60410776 = 9541 -20130315123609184-60410777 = 9543 -20130315123609191-60410778 = 9542 -20130315123609198-60410779 = 9547 -20130315123609206-60410780 = 9622 -20130315123609213-60410781 = 9540 -20130315123609219-60410782 = 9545 -20130315123609225-60410783 = 9544 -20130315125932485-60410785 = 9579 -20130315125932502-60410786 = 9601 -20130315125932515-60410787 = 9570 -20130315125932526-60410788 = 9564 -20130315125932542-60410789 = 9602 -20130315125932561-60410790 = 9583 -20130315125932581-60410791 = 9558 -20130315125932600-60410792 = 9592 -20130321104037354-60410985 = 9739 -20130321110812651-60410993 = 9914 -20130321110812681-60410994 = 9912 -20130321110812688-60410995 = 9909 -20130321110812696-60410996 = 9908 -20130321110812703-60410997 = 9913 -20130321110812710-60410998 = 9915 -20130321110812718-60410999 = 9910 -20130321110812726-60411000 = 9911 -20130321112012637-60411002 = 9880 -20130321112012661-60411003 = 9882 -20130321112012669-60411004 = 10085 -20130321112012675-60411005 = 9874 -20130321112012683-60411006 = 9892 -20130321112012694-60411007 = 9881 -20130321112012703-60411008 = 9873 -20130321112012712-60411009 = 9885 -20130322095006903-60411140 = 9751 -20130328104007833-60411427 = 10034 -20130328104007843-60411428 = 10037 -20130328104007852-60411429 = 10031 -20130328104007861-60411430 = 10032 -20130328104007871-60411431 = 10035 -20130328104007880-60411432 = 10033 -20130328104007888-60411433 = 10030 -20130328104007898-60411434 = 10036 -20130404103207720-60411581 = 10129 -20130404103207729-60411582 = 10131 -20130404103207738-60411583 = 10136 -20130404103207747-60411584 = 10135 -20130404103207756-60411585 = 10133 -20130404103207765-60411586 = 10130 -20130404103207773-60411587 = 10134 -20130404103207782-60411588 = 10132 -20130416105209833-60411715 = 10179 -20130416105209840-60411716 = 10182 -20130416105209849-60411717 = 10178 -20130416105209857-60411718 = 10177 -20130416105209865-60411719 = 10183 -20130416105209872-60411720 = 10180 -20130416105209881-60411721 = 10176 -20130416105209890-60411722 = 10181 -20130418110019695-60411749 = 10203 -20130418110019708-60411750 = 10206 -20130418110019721-60411751 = 10208 -20130418110019733-60411752 = 10209 -20130418110019746-60411753 = 10204 -20130418110019757-60411754 = 10202 -20130418110019769-60411755 = 10207 -20130418110019780-60411756 = 10205 -20130424110814698-60411984 = 10355 -20130424110814710-60411985 = 10353 -20130424110814721-60411986 = 10350 -20130424110814732-60411987 = 10349 -20130424110814742-60411988 = 10354 -20130424110814760-60411989 = 10356 -20130424110814773-60411990 = 10351 -20130424110814783-60411991 = 10352 -20130424115104435-60411993 = 10268 -20130424115104445-60411994 = 10270 -20130424115104456-60411995 = 10273 -20130424115104466-60411996 = 10274 -20130424115104476-60411997 = 10269 -20130424115104486-60411998 = 10267 -20130424115104496-60411999 = 10272 -20130424115104507-60412000 = 10271 -20130501110813877-60412150 = 10411 -20130501110813887-60412151 = 10409 -20130501110813896-60412152 = 10414 -20130501110813905-60412153 = 10413 -20130501110813913-60412154 = 10410 -20130501110813921-60412155 = 10412 -20130501110813930-60412156 = 10415 -20130501110813940-60412157 = 10408 -20130508143446619-60412282 = 10423 -20130514121214397-60412340 = 10451 -20130516112808409-60412347 = 10557 -20130516112808418-60412348 = 10555 -20130516112808428-60412349 = 10560 -20130516112808437-60412350 = 10559 -20130516112808446-60412351 = 10556 -20130516112808455-60412352 = 10558 -20130516112808464-60412353 = 10561 -20130516112808474-60412354 = 10554 -20130516114008448-60412358 = 10562 -20130516114008457-60412359 = 10565 -20130516114008467-60412360 = 10569 -20130516114008481-60412361 = 10568 -20130516114008496-60412362 = 10566 -20130516114008505-60412363 = 10563 -20130516114008513-60412364 = 10567 -20130516114008521-60412365 = 10658 -20130522154211227-60412585 = 10581 -20130524120807629-60412745 = 10858 -20130524120807637-60412746 = 10860 -20130524120807648-60412747 = 10855 -20130524120807657-60412748 = 10856 -20130524120807668-60412749 = 10859 -20130524120807677-60412750 = 10857 -20130524120807689-60412751 = 10854 -20130524120807699-60412752 = 10861 -20130524122006836-60412754 = 10657 -20130524122006844-60412755 = 10654 -20130524122006851-60412756 = 10650 -20130524122006858-60412757 = 10651 -20130524122006871-60412758 = 10653 -20130524122006879-60412759 = 10656 -20130524122006887-60412760 = 10652 -20130524122006898-60412761 = 10655 -20130530161331750-60412888 = 10853 -20130606125208381-60413194 = 10901 -20130606161207286-60413217 = 10951 -20130606161207305-60413218 = 10954 -20130606161207320-60413219 = 10958 -20130606161207338-60413220 = 10957 -20130606161207355-60413221 = 10964 -20130606161207375-60413222 = 10952 -20130606161207393-60413223 = 10956 -20130606161207411-60413224 = 10953 -20130611112823059-60413342 = 10976 -20130613114014501-60413396 = 11237 -20130613114014517-60413397 = 11239 -20130613114014532-60413398 = 11242 -20130613114014547-60413399 = 11243 -20130613114014559-60413400 = 11238 -20130613114014569-60413401 = 11236 -20130613114014580-60413402 = 11241 -20130613114014592-60413403 = 11240 -20130613115213549-60413405 = 11034 -20130613115213564-60413406 = 11036 -20130613115213579-60413407 = 11041 -20130613115213596-60413408 = 11040 -20130613115213612-60413409 = 11038 -20130613115213628-60413410 = 11035 -20130613115213641-60413411 = 11039 -20130613115213653-60413412 = 11037 -20130614112909080-60413417 = 11043 -20130618174007738-60413554 = 11119 -20130618174007750-60413555 = 11116 -20130618174007761-60413556 = 11120 -20130618174007775-60413557 = 11121 -20130618174007789-60413558 = 11115 -20130618174007803-60413559 = 11118 -20130618174007814-60413560 = 11122 -20130618174007825-60413561 = 11117 -20130620110018465-60413603 = 11154 -20130624120616760-60414290 = 11287 -20130625104414308-60414400 = 11651 -20130625104414323-60414401 = 11649 -20130625104414340-60414402 = 11647 -20130625104414353-60414403 = 11646 -20130625104414363-60414404 = 11650 -20130625104414376-60414405 = 11652 -20130625104414388-60414406 = 11648 -20130625141901291-60414449 = 11670 -20130625141916731-60414450 = 11669 -20130625142000668-60414451 = 11671 -20130626102411175-60414476 = 11360 -20130626102411186-60414477 = 11358 -20130626102411196-60414478 = 11353 -20130626102411207-60414479 = 11354 -20130626102411220-60414480 = 11356 -20130626102411231-60414481 = 11359 -20130626102411242-60414482 = 11355 -20130626102411254-60414483 = 11357 -20130626105611184-60414485 = 11308 -20130628174412428-60414617 = 11376 -20130701110607663-60414725 = 11428 -20130701113214336-60414727 = 11477 -20130701113214354-60414728 = 11474 -20130701113214370-60414729 = 11478 -20130701113214383-60414730 = 11479 -20130701113214394-60414731 = 11473 -20130701113214409-60414732 = 11476 -20130701113214422-60414733 = 11480 -20130701113214437-60414734 = 11475 -20130705112414430-60414934 = 11730 -20130705112414449-60414935 = 11727 -20130705112414466-60414936 = 11725 -20130705112414483-60414937 = 11724 -20130705112414497-60414938 = 11729 -20130705112414512-60414939 = 11731 -20130705112414523-60414940 = 11726 -20130705112414532-60414941 = 11728 -20130708103257720-60415116 = 11763 -20130708103327927-60415117 = 11663 -20130710113610200-60415209 = 11852 -20130710113610226-60415210 = 11854 -20130710113610248-60415211 = 11851 -20130710113610263-60415212 = 11850 -20130710113610280-60415213 = 11856 -20130710113610305-60415214 = 11853 -20130710113610325-60415215 = 11849 -20130710113610341-60415216 = 11855 -20130710123609070-60415218 = 11864 -20130710123609085-60415219 = 11861 -20130710123609100-60415220 = 11857 -20130710123609114-60415221 = 11858 -20130710123609124-60415222 = 11860 -20130710123609137-60415223 = 11863 -20130710123609147-60415224 = 11859 -20130710123609159-60415225 = 11862 -20130710154612100-60415305 = 12147 -20130715094805853-60415443 = 11889 -20130715094805859-60415444 = 11893 -20130715094805865-60415445 = 11969 -20130715094805871-60415446 = 11881 -20130715094805877-60415447 = 11894 -20130715094805882-60415448 = 11899 -20130715094805888-60415449 = 11905 -20130715094805894-60415450 = 11902 -20130717104808501-60415560 = 12114 -20130717104808507-60415561 = 12116 -20130717104808513-60415562 = 12121 -20130717104808518-60415563 = 12120 -20130717104808524-60415564 = 12157 -20130717104808530-60415565 = 12166 -20130717104808535-60415566 = 12119 -20130717104808540-60415567 = 12117 -20130718112408108-60415658 = 11961 -20130718112408114-60415659 = 11963 -20130718112408120-60415660 = 11968 -20130718112408124-60415661 = 11967 -20130718112408128-60415662 = 11965 -20130718112408133-60415663 = 11962 -20130718112408138-60415664 = 11966 -20130718112408143-60415665 = 11964 -20130724161609584-60415760 = 12039 -20130724161609588-60415761 = 12037 -20130724161609593-60415762 = 12032 -20130724161609598-60415763 = 12033 -20130724161609604-60415764 = 12035 -20130724161609610-60415765 = 12038 -20130724161609614-60415766 = 12034 -20130724161609619-60415767 = 12036 -20130725154017379-60415771 = 11989 -20130805124221737-60416105 = 12203 -20130807112811862-60416132 = 12378 -20130807112811870-60416133 = 12381 -20130807112811878-60416134 = 12383 -20130807112811887-60416135 = 12384 -20130807112811895-60416136 = 12379 -20130807112811903-60416137 = 12377 -20130807112811911-60416138 = 12382 -20130807112811919-60416139 = 12380 -20130807113441652-60416141 = 12372 -20130807113441657-60416142 = 13150 -20130807113441662-60416143 = 12375 -20130807113441667-60416144 = 12374 -20130807113441672-60416145 = 12371 -20130807113441677-60416146 = 12373 -20130807113441682-60416147 = 12376 -20130807113441688-60416148 = 12369 -20130807142813334-60416167 = 12210 -20130813161813287-60416441 = 12392 -20130814120813041-60416443 = 12525 -20130814120813048-60416444 = 12531 -20130814120813055-60416445 = 12526 -20130814120813063-60416446 = 12527 -20130814120813071-60416447 = 12529 -20130814120813078-60416448 = 12524 -20130814120813086-60416449 = 12528 -20130814120813094-60416450 = 12530 -20130814123211938-60416452 = 12519 -20130814123211944-60416453 = 12522 -20130814123211948-60416454 = 12518 -20130814123211954-60416455 = 12517 -20130814123211958-60416456 = 12523 -20130814123211963-60416457 = 12520 -20130814123211968-60416458 = 12516 -20130814123211973-60416459 = 12521 -20130821162606120-60416725 = 12817 -20130821163607577-60416727 = 12637 -20130821163607585-60416728 = 12634 -20130821163607593-60416729 = 12630 -20130821163607601-60416730 = 12631 -20130821163607608-60416731 = 12633 -20130821163607616-60416732 = 12636 -20130821163607623-60416733 = 12632 -20130821163607630-60416734 = 12635 -20130821164806568-60416736 = 12699 -20130821164806574-60416737 = 12697 -20130821164806579-60416738 = 12694 -20130821164806584-60416739 = 12693 -20130821164806590-60416740 = 12698 -20130821164806595-60416741 = 12700 -20130821164806600-60416742 = 12662 -20130821164806606-60416743 = 12661 -20130823175205935-60416760 = 12656 -20130826173805228-60416906 = 12712 -20130827144845643-60416944 = 13062 -20130827144845649-60416945 = 13065 -20130827144845662-60416947 = 13060 -20130827144845668-60416948 = 13066 -20130827144845674-60416949 = 13063 -20130827144845680-60416950 = 13059 -20130827144845686-60416951 = 13064 -20130829134413141-60417057 = 12788 -20130829134413150-60417058 = 12791 -20130829134413158-60417059 = 12787 -20130829134413166-60417060 = 12786 -20130829134413174-60417061 = 12792 -20130829134413181-60417062 = 12789 -20130829134413189-60417063 = 12785 -20130829134413197-60417064 = 12790 -20130830121406372-60417117 = 12815 -20130902143517608-60417285 = 12799 -20130902143537949-60417286 = 12816 -20130902160940923-60417294 = 12834 -20130904104807932-60417326 = 12879 -20130904104807938-60417327 = 12882 -20130904104807944-60417328 = 12886 -20130904104807950-60417329 = 12885 -20130904104807956-60417330 = 12883 -20130904104807961-60417331 = 12880 -20130904104807966-60417332 = 12884 -20130904104807972-60417333 = 12881 -20130904134409267-60417335 = 12841 -20130906090602099-60417387 = 13141 -20130906090620484-60417388 = 13132 -20130906115405137-60417401 = 12914 -20130912174135997-60417716 = 13139 -20130913152721165-60417727 = 13125 -20130913152721173-60417728 = 13123 -20130913152721181-60417729 = 13128 -20130913152721189-60417730 = 13127 -20130913152721197-60417731 = 13124 -20130913152721205-60417732 = 13126 -20130913152721212-60417733 = 13129 -20130913152721220-60417734 = 13122 -20130918145007903-60417846 = 13178 -20130919112811629-60417858 = 13219 -20130919112811637-60417859 = 13221 -20130919112811646-60417860 = 13224 -20130919112811654-60417861 = 13225 -20130919112811662-60417862 = 13220 -20130919112811670-60417863 = 13218 -20130919112811678-60417864 = 13223 -20130919112811686-60417865 = 13222 -20130920172618898-60417901 = 13253 -20130927104812194-60418051 = 13311 -20130927104812195-60418052 = 13308 -20130927104812208-60418053 = 13319 -20130927104812209-60418054 = 13305 -20130927104812210-60418055 = 13310 -20130927104812211-60418056 = 13318 -20130927104812223-60418057 = 13307 -20130927104812224-60418058 = 13309 -20130927134811435-60418067 = 13265 -20131002120013797-60418202 = 13348 -20131004110009724-60418246 = 13411 -20131004110009725-60418247 = 13412 -20131004110009730-60418248 = 13413 -20131004110009731-60418249 = 13415 -20131004110009731-60418250 = 13414 -20131004110009731-60418251 = 13416 -20131004110009737-60418252 = 13418 -20131004110009737-60418253 = 13417 -20131004111008726-60418261 = 13363 -20131007162010426-60418383 = 13442 -20131011114017120-60418474 = 13497 -20131011114017120-60418475 = 13496 -20131011114017127-60418476 = 13498 -20131011114017128-60418477 = 13499 -20131011114017128-60418478 = 13500 -20131011114017128-60418479 = 13501 -20131011114017136-60418480 = 13601 -20131011114017137-60418481 = 13602 -20131011130006700-60418489 = 13519 -20131015110007223-60418674 = 13591 -20131015110007224-60418675 = 13593 -20131015110007230-60418676 = 13592 -20131015110007230-60418677 = 13594 -20131015110007230-60418678 = 13595 -20131015110007231-60418679 = 13597 -20131015110007237-60418680 = 13596 -20131015110007237-60418681 = 13598 -20131015172009634-60418706 = 13537 -20131018165212760-60418842 = 13649 -20131018165212761-60418843 = 13651 -20131018165212761-60418844 = 13650 -20131018165212762-60418845 = 13652 -20131018165212768-60418846 = 13656 -20131018165212768-60418847 = 13657 -20131023102405433-60418950 = 13894 -20131023102405433-60418951 = 13895 -20131023102405439-60418952 = 13896 -20131023102405440-60418953 = 13897 -20131023102405440-60418954 = 13898 -20131023102405440-60418955 = 13899 -20131023102405446-60418956 = 13900 -20131023102405447-60418957 = 13901 -20131025095203804-60419085 = 13768 -20131025095203805-60419086 = 13769 -20131025095203810-60419087 = 13770 -20131025095203811-60419088 = 13772 -20131025095203811-60419089 = 13771 -20131025095203812-60419090 = 13773 -20131025095203817-60419091 = 13774 -20131025095203817-60419092 = 13775 -20131025202837639-60419119 = 13776 -20131101165406593-60419352 = 13792 -20131105142030566-60419529 = 13061 -20131105142100973-60419530 = 13017 -20131108142030412-60419588 = 14162 -20131108142104759-60419589 = 14003 -20131111155008335-60419637 = 13969 -20131114110010184-60419739 = 14130 -20131114110010185-60419740 = 14129 -20131114110010192-60419741 = 14131 -20131114110010192-60419742 = 14133 -20131114110010192-60419743 = 14132 -20131114110010193-60419744 = 14134 -20131114110010199-60419745 = 14135 -20131114110010199-60419746 = 14136 -20131114111210300-60419754 = 14268 -20131114111210301-60419755 = 14274 -20131114111210310-60419756 = 14101 -20131114111210311-60419757 = 14102 -20131114111210312-60419758 = 14104 -20131114111210313-60419759 = 14109 -20131114111210324-60419760 = 14114 -20131114111210325-60419761 = 14115 -20131115163412618-60419839 = 14021 -20131118164008350-60420015 = 14415 -20131119121606842-60420018 = 14265 -20131119121606843-60420019 = 14266 -20131119121606852-60420020 = 14267 -20131119121606853-60420021 = 14270 -20131119121606854-60420022 = 14269 -20131119121606854-60420023 = 14271 -20131119121606873-60420024 = 14272 -20131119121606873-60420025 = 14273 -20131121114413383-60420074 = 14794 -20131121114413384-60420075 = 14791 -20131121114413395-60420076 = 14789 -20131121114413396-60420077 = 14788 -20131121114413397-60420078 = 14793 -20131121114413398-60420079 = 14795 -20131121114413411-60420080 = 14790 -20131121114413412-60420081 = 14792 -20131121163507727-60420154 = 14182 -20131122142806949-60420313 = 14327 -20131122142806949-60420314 = 14328 -20131122142806966-60420315 = 14329 -20131122142806968-60420316 = 14330 -20131122142806969-60420317 = 14331 -20131122142806971-60420318 = 14332 -20131122142806989-60420319 = 14333 -20131122142806990-60420320 = 14334 -20131122162206517-60420328 = 14295 -20131126140408758-60420451 = 14408 -20131126140408758-60420452 = 14409 -20131126140408769-60420453 = 14410 -20131126140408770-60420454 = 14411 -20131126140408770-60420455 = 15089 -20131126140408771-60420456 = 14412 -20131126140408781-60420457 = 14413 -20131126140408782-60420458 = 14414 -20131202092013861-60420547 = 14391 -20131202154006378-60420696 = 14518 -20131202154006379-60420697 = 14519 -20131202154006385-60420698 = 14520 -20131202154006386-60420699 = 14521 -20131202154006386-60420700 = 14522 -20131202154006386-60420701 = 14523 -20131202154006392-60420702 = 14524 -20131202154006392-60420703 = 14525 -20131204171005384-60420763 = 14536 -20131206125614455-60420950 = 14621 -20131206125614456-60420951 = 14623 -20131206125614463-60420952 = 14622 -20131206125614463-60420953 = 14624 -20131206125614464-60420954 = 15076 -20131206125614464-60420955 = 14626 -20131206125614470-60420956 = 14627 -20131206125614471-60420957 = 14628 -20131212112413284-60421230 = 14947 -20131212112413284-60421231 = 14948 -20131212112413290-60421232 = 14949 -20131212112413290-60421233 = 14950 -20131212112413291-60421234 = 14951 -20131212112413291-60421235 = 14952 -20131212112413296-60421236 = 14953 -20131212112413296-60421237 = 14954 -20131212113603087-60421245 = 14939 -20131212113603087-60421246 = 14940 -20131212113603093-60421247 = 14941 -20131212113603093-60421248 = 14942 -20131212113603093-60421249 = 14943 -20131212113603094-60421250 = 14944 -20131212113603099-60421251 = 14945 -20131212113603100-60421252 = 14946 -20131220120710186-60421442 = 14818 -20140110142404260-60422610 = 15078 -20140110142404467-60422611 = 15079 -20140110142404468-60422612 = 15080 -20140110142404468-60422613 = 15082 -20140110142404468-60422614 = 15081 -20140110142404475-60422615 = 15083 -20140110142404475-60422616 = 15084 -20140110142404475-60422617 = 15087 -20140110142803884-60422625 = 15330 -20140110142803884-60422626 = 15331 -20140110142803894-60422627 = 15332 -20140110142803894-60422628 = 15333 -20140110142803894-60422629 = 15334 -20140110142803894-60422630 = 15335 -20140110142803902-60422631 = 15336 -20140110142803902-60422632 = 15337 -20140110151504471-60422670 = 14987 -20140114144409179-60422847 = 15153 -20140114144409179-60422848 = 15154 -20140114144409184-60422849 = 15155 -20140114144409185-60422850 = 15157 -20140114144409185-60422851 = 15156 -20140114144409185-60422852 = 15158 -20140114144409190-60422853 = 15159 -20140114144409191-60422854 = 15160 -20140117162308688-60423026 = 15171 -20140120143606073-60423047 = 15394 -20140120143606074-60423048 = 15395 -20140120143606079-60423049 = 15396 -20140120143606079-60423050 = 15407 -20140120143606080-60423051 = 15398 -20140120143606080-60423052 = 15408 -20140120143606085-60423053 = 15697 -20140120143606085-60423054 = 15400 -20140120170306862-60423064 = 15353 -20140124114016050-60423426 = 15487 -20140124114016050-60423427 = 15488 -20140124114016056-60423428 = 15489 -20140124114016056-60423429 = 15499 -20140124114016057-60423430 = 15491 -20140124114016057-60423431 = 15493 -20140124114016069-60423432 = 15492 -20140124114016069-60423433 = 15494 -20140124152112477-60423441 = 15425 -20140127131612178-60423555 = 15521 -20140127131612179-60423556 = 15522 -20140127131612183-60423557 = 15524 -20140127131612184-60423558 = 15523 -20140127131612184-60423559 = 15525 -20140127131612184-60423560 = 15526 -20140127131612189-60423561 = 15528 -20140127131612190-60423562 = 15527 -20140129104028864-60423588 = 15680 -20140129104028865-60423589 = 15681 -20140129104028873-60423590 = 15682 -20140129104028873-60423591 = 15683 -20140129104028874-60423592 = 15684 -20140129104028874-60423593 = 15685 -20140129104028883-60423594 = 15686 -20140129104028883-60423595 = 15687 -20140205135610551-60423658 = 15860 -20140205135610639-60423659 = 15861 -20140205135610639-60423660 = 15862 -20140205135610640-60423661 = 15863 -20140205135610640-60423662 = 16019 -20140205135610646-60423663 = 15865 -20140205135610646-60423664 = 15866 -20140205135610647-60423665 = 15867 -20140213142813006-60424044 = 15772 -20140213142813006-60424045 = 15773 -20140213142813013-60424046 = 15774 -20140213142813014-60424047 = 15775 -20140213142813014-60424048 = 15776 -20140213142813014-60424049 = 15777 -20140213142813021-60424050 = 15778 -20140213142813021-60424051 = 15779 -20140217145510801-60424219 = 15893 -20140218103205245-60424329 = 16009 -20140218103205246-60424330 = 16010 -20140218103205261-60424331 = 16011 -20140218103205261-60424332 = 16012 -20140218103205262-60424333 = 16013 -20140218103205263-60424334 = 16014 -20140218103205273-60424335 = 16015 -20140218103205274-60424336 = 16016 -20140219111604836-60424374 = 15942 -20140219111604837-60424375 = 15943 -20140219111604845-60424376 = 15944 -20140219111604846-60424377 = 15945 -20140219111604846-60424378 = 15946 -20140219111604847-60424379 = 15947 -20140219111604855-60424380 = 15948 -20140219111604856-60424381 = 15949 -20140219141510503-60424393 = 15917 -20140221170112019-60424409 = 15929 -20140227141608673-60424469 = 16210 -20140227141608673-60424470 = 16211 -20140227141608682-60424471 = 16212 -20140227141608682-60424472 = 16482 -20140227141608683-60424473 = 16214 -20140227141608683-60424474 = 16215 -20140227141608691-60424475 = 16216 -20140227141608691-60424476 = 16484 -20140304150510853-60424623 = 16036 -20140305145210354-60424625 = 16438 -20140305145210355-60424626 = 16439 -20140305145210362-60424627 = 16440 -20140305145210362-60424628 = 16441 -20140305145210362-60424629 = 16442 -20140305145210363-60424630 = 16443 -20140305145210370-60424631 = 16444 -20140305145210370-60424632 = 16445 -20140306115512333-60424664 = 16437 -20140313145211262-60425055 = 16327 -20140313145211263-60425056 = 16326 -20140313145211278-60425057 = 16328 -20140313145211279-60425058 = 16329 -20140313145211280-60425059 = 16330 -20140313145211281-60425060 = 16333 -20140313145211290-60425061 = 16331 -20140313145211291-60425062 = 16332 -20140314161519895-60425087 = 16436 -20140321174107914-60425292 = 16565 -20140328111212420-60425552 = 16751 -20140328111212421-60425553 = 16752 -20140328111212428-60425554 = 16753 -20140328111212429-60425555 = 16754 -20140328111212429-60425556 = 16763 -20140328111212430-60425557 = 16759 -20140328111212438-60425558 = 16760 -20140328111212439-60425559 = 16761 -20140328113731678-60425570 = 16581 -20140402112012490-60425661 = 16648 -20140402112012933-60425662 = 16649 -20140402112012934-60425663 = 16650 -20140402112012934-60425664 = 16651 -20140402112012935-60425665 = 16652 -20140402112012947-60425666 = 16653 -20140402112012948-60425667 = 16654 -20140402112012948-60425668 = 16655 -20140415105212228-60426262 = 17052 -20140415105212229-60426263 = 17069 -20140415105212239-60426264 = 17035 -20140415105212240-60426265 = 17018 -20140415105212241-60426266 = 16890 -20140415105212241-60426267 = 16870 -20140415105212254-60426268 = 16871 -20140415105212255-60426269 = 16872 -20140416172503952-60426283 = 16779 -20140422143708070-60426516 = 17000 -20140422155048794-60426528 = 16983 -20140422155048795-60426529 = 16984 -20140424104805884-60426824 = 17327 -20140424104805885-60426825 = 17328 -20140424104805893-60426826 = 17329 -20140424104805894-60426827 = 17388 -20140424104805895-60426828 = 17390 -20140424104805895-60426829 = 17392 -20140424104805904-60426830 = 17333 -20140424104805905-60426831 = 17334 -20140424110005802-60426839 = 17153 -20140424110005802-60426840 = 17154 -20140424110005810-60426841 = 17351 -20140424110005810-60426842 = 17368 -20140424110005811-60426843 = 17156 -20140424110005812-60426844 = 17158 -20140424110005821-60426845 = 17159 -20140424110005821-60426846 = 17160 -20140430110109414-60427134 = 17177 -20140430150410645-60427139 = 17230 -20140430150410645-60427140 = 17231 -20140430150410649-60427141 = 17232 -20140430150410649-60427142 = 17233 -20140430150410649-60427143 = 17234 -20140430150410650-60427144 = 17235 -20140430150410654-60427145 = 17321 -20140430150410654-60427146 = 17237 -20140506110609691-60427435 = 17386 -20140509113005970-60427555 = 17468 -20140509113005971-60427556 = 17469 -20140509113005978-60427557 = 17470 -20140509113005978-60427558 = 17471 -20140509113005979-60427559 = 17472 -20140509113005979-60427560 = 17473 -20140509113005987-60427561 = 17474 -20140509113005987-60427562 = 17475 -20140509113606735-60427571 = 17467 -20140512175108185-60427796 = 17490 -20140513111008692-60427850 = 17596 -20140513111008692-60427851 = 17675 -20140513111008700-60427852 = 17681 -20140513111008700-60427853 = 17669 -20140513111008701-60427854 = 17699 -20140513111008701-60427855 = 17717 -20140513111008708-60427856 = 17740 -20140513111008709-60427857 = 17763 -20140514144611529-60427884 = 17507 -20140516132112391-60427905 = 17523 -20140523172009416-60428050 = 17829 -20140523172009417-60428051 = 17830 -20140523172009422-60428052 = 17831 -20140523172009422-60428053 = 17832 -20140523172009422-60428054 = 17870 -20140523172009423-60428055 = 17852 -20140523172009427-60428056 = 17867 -20140523172009428-60428057 = 17836 -20140529135113917-60428571 = 17883 -20140605105012665-60428619 = 17972 -20140605105012764-60428620 = 17993 -20140605105012764-60428621 = 17974 -20140605105012765-60428622 = 17975 -20140605105012766-60428623 = 17976 -20140605105012775-60428624 = 17977 -20140605105012776-60428625 = 17978 -20140605105012777-60428626 = 18011 -20140613104007999-60428953 = 18104 -20140613104007999-60428954 = 18105 -20140613104008007-60428955 = 18106 -20140613104008007-60428956 = 18107 -20140613104008008-60428957 = 18108 -20140613104008008-60428958 = 18109 -20140613104008016-60428959 = 18110 -20140613104008016-60428960 = 18111 -20140620143018384-60429220 = 18164 -20140620143018384-60429221 = 18174 -20140620143018392-60429222 = 18184 -20140620143018393-60429223 = 18194 -20140620143018393-60429224 = 18197 -20140620143018394-60429225 = 18209 -20140620143018402-60429226 = 18217 -20140620143018403-60429227 = 18225 -20140620143106333-60429235 = 18143 -20140624143606562-60429292 = 18236 -20140624151006324-60429295 = 18769 -20140624151006324-60429296 = 18770 -20140624151006329-60429297 = 18771 -20140624151006329-60429298 = 18772 -20140624151006329-60429299 = 18773 -20140624151006330-60429300 = 18774 -20140624151006336-60429301 = 18775 -20140624151006336-60429302 = 18776 -20140627132335012-60429440 = 18324 -20140627132335012-60429441 = 18325 -20140627132335018-60429442 = 18326 -20140627132335018-60429443 = 18327 -20140627132335018-60429444 = 18328 -20140627132335019-60429445 = 18329 -20140627132335024-60429446 = 18330 -20140627132335024-60429447 = 18331 -20140627155108193-60429559 = 18246 -20140630141602041-60429677 = 18342 -20140702125014596-60429692 = 18474 -20140702125014644-60429693 = 18475 -20140702125014645-60429694 = 18625 -20140702125014645-60429695 = 18626 -20140702125014645-60429696 = 18627 -20140702125014651-60429697 = 18628 -20140702125014651-60429698 = 18629 -20140702125014651-60429699 = 18630 -20140704100601563-60430085 = 18786 -20140707165557451-60430698 = 18796 -20140708114017423-60430701 = 18861 -20140708114017424-60430702 = 18862 -20140708114017431-60430703 = 18863 -20140708114017432-60430704 = 18864 -20140708114017432-60430705 = 18865 -20140708114017433-60430706 = 18866 -20140708114017440-60430707 = 18867 -20140708114017441-60430708 = 18868 -20140710145057605-60430747 = 18885 -20140714141548837-60430876 = 18896 -20140717174541634-60430895 = 18915 -20140718104020398-60430905 = 19086 -20140718104020399-60430906 = 19093 -20140718104020407-60430907 = 19094 -20140718104020407-60430908 = 19095 -20140718104020407-60430909 = 19096 -20140718104020408-60430910 = 19102 -20140718104020417-60430911 = 19105 -20140718104020418-60430912 = 19106 -20140718104023349-60430920 = 18993 -20140718104023349-60430921 = 19045 -20140718104023356-60430922 = 19001 -20140718104023357-60430923 = 19040 -20140718104023357-60430924 = 19009 -20140718104023358-60430925 = 19017 -20140718104023365-60430926 = 19025 -20140718104023366-60430927 = 19039 -20140721160556661-60431065 = 19193 -20140724160558620-60431314 = 19194 -20140729175550270-60431401 = 19299 -20140729175550270-60431402 = 19301 -20140730154007668-60431471 = 19458 -20140730154007668-60431472 = 19460 -20140730154007674-60431473 = 19517 -20140730154007674-60431474 = 19544 -20140730154007674-60431475 = 19547 -20140730154007675-60431476 = 19550 -20140730154007680-60431477 = 19554 -20140730154007681-60431478 = 19556 -20140730154010407-60431486 = 19392 -20140730154010408-60431487 = 19393 -20140730154010418-60431488 = 19394 -20140730154010419-60431489 = 19395 -20140730154010420-60431490 = 19396 -20140730154010420-60431491 = 19397 -20140730154010429-60431492 = 19398 -20140730154010429-60431493 = 19399 -20140730160819590-60431501 = 20014 -20140731111600088-60431657 = 19305 -20140805155555874-60431970 = 19410 -20140807132014902-60431981 = 19545 -20140807132014903-60431982 = 19546 -20140807132014911-60431983 = 19548 -20140807132014911-60431984 = 19549 -20140807132014912-60431985 = 19551 -20140807132014912-60431986 = 19552 -20140807132014919-60431987 = 19553 -20140807132014920-60431988 = 19555 -20140808152414016-60432007 = 19688 -20140808152414017-60432008 = 19689 -20140808152414029-60432009 = 19690 -20140808152414030-60432010 = 19691 -20140808152414031-60432011 = 19692 -20140808152414032-60432012 = 19693 -20140808152414037-60432013 = 19812 -20140808152414038-60432014 = 19695 -20140811164056097-60432513 = 19724 -20140811191926392-60432519 = 19950 -20140812171543248-60432577 = 19803 -20140814104008736-60432583 = 20582 -20140814104008736-60432584 = 20619 -20140814104009043-60432585 = 20633 -20140814104009043-60432586 = 20635 -20140814104009044-60432587 = 20636 -20140814104009045-60432588 = 20638 -20140814104009063-60432589 = 20640 -20140814104009064-60432590 = 20643 -20140814104013004-60432598 = 20634 -20140814104013004-60432599 = 20637 -20140814104013033-60432600 = 20639 -20140814104013034-60432601 = 20641 -20140814104013034-60432602 = 20642 -20140814104013034-60432603 = 20644 -20140814104013049-60432604 = 20645 -20140814104013050-60432605 = 20646 -20140814141847739-60432623 = 19932 -20140818162702633-60432764 = 20223 -20140818162702633-60432765 = 20224 -20140818162702638-60432766 = 20225 -20140818162702639-60432767 = 20226 -20140818162702639-60432768 = 20227 -20140818162702640-60432769 = 20228 -20140818162702647-60432770 = 20292 -20140818162702647-60432771 = 20293 -20140819111555148-60432826 = 19962 -20140819143650772-60432831 = 19882 -20140819143650773-60432832 = 19883 -20140819143650782-60432833 = 19884 -20140819143650782-60432834 = 19885 -20140819143650783-60432835 = 19886 -20140819143650783-60432836 = 19887 -20140819143650793-60432837 = 20817 -20140819143650793-60432838 = 19890 -20140819143651000-60432846 = 19902 -20140822160653006-60433231 = 20239 -20140825142452246-60433514 = 20494 -20140827122044098-60434216 = 20769 -20140827145435986-60434219 = 20748 -20140903140639280-60434380 = 20773 -20140904140042238-60434387 = 20777 -20140919182158742-60434432 = 20812 -20140923113013853-60434782 = 21629 -20140923113013853-60434783 = 21630 -20140923113013858-60434784 = 21631 -20140923113013858-60434785 = 21632 -20140923113013858-60434786 = 21633 -20140923113013858-60434787 = 21634 -20140923113013863-60434788 = 21635 -20140923113013863-60434789 = 21636 -20140923135616632-60434801 = 21341 -20140923135616633-60434802 = 21342 -20140923135616638-60434803 = 21343 -20140923135616638-60434804 = 21344 -20140923135616639-60434805 = 21345 -20140923135616639-60434806 = 21346 -20140923135616645-60434807 = 21347 -20140923135616645-60434808 = 21348 -20140923143646999-60434816 = 21017 -20140923171102253-60434829 = 20856 -20140924142512654-60435113 = 21051 -20140925102442861-60435390 = 21151 -20140926131051939-60435801 = 21453 -20140926155612679-60435881 = 21425 -20140926155612679-60435882 = 21438 -20140926155612685-60435883 = 21427 -20140926155612685-60435884 = 21428 -20140926155612685-60435885 = 21429 -20140926155612686-60435886 = 21430 -20140926155612692-60435887 = 21431 -20140926155612693-60435888 = 21432 -20140926190040148-60435900 = 21401 -20140929171059197-60436286 = 21463 -20141002134330903-60436331 = 21475 -20141002141112392-60436333 = 21485 -20141006120222313-60436368 = 21628 -20141009160009792-60436577 = 21728 -20141009160009792-60436578 = 21729 -20141009160009797-60436579 = 21730 -20141009160009798-60436580 = 21731 -20141009160009798-60436581 = 21732 -20141009160009799-60436582 = 21733 -20141009160009804-60436583 = 21734 -20141009160009805-60436584 = 21735 -20141010155651744-60436599 = 21649 -20141010164013595-60436601 = 21774 -20141010164013596-60436602 = 21775 -20141010164013602-60436603 = 21776 -20141010164013602-60436604 = 21777 -20141010164013603-60436605 = 21778 -20141010164013604-60436606 = 21779 -20141010164013611-60436607 = 21780 -20141010164013612-60436608 = 21781 -20141015151047371-60436916 = 21818 -20141016180637883-60437256 = 21806 -20141017134839107-60437290 = 21830 -20141017141607122-60437293 = 22196 -20141017141607122-60437294 = 22199 -20141017151042654-60437297 = 22047 -20141020152457176-60437348 = 22093 -20141027110822794-60437421 = 22707 -20141027110822795-60437422 = 22799 -20141027110822801-60437423 = 22709 -20141027110822801-60437424 = 22711 -20141027110822802-60437425 = 22712 -20141027110822803-60437426 = 22714 -20141027110822809-60437427 = 22715 -20141027110822809-60437428 = 22717 -20141027110826201-60437436 = 22706 -20141027110826201-60437437 = 22710 -20141027110826206-60437438 = 22713 -20141027110826206-60437439 = 22716 -20141027110826206-60437440 = 22718 -20141027110826207-60437441 = 22719 -20141027110826212-60437442 = 22720 -20141027110826212-60437443 = 22789 -20141027111048941-60437451 = 21992 -20141027111048942-60437452 = 22094 -20141027111048948-60437453 = 22194 -20141027111048949-60437454 = 22195 -20141027111048949-60437455 = 22197 -20141027111048950-60437456 = 22198 -20141027111048961-60437457 = 22200 -20141027111048962-60437458 = 22201 -20141027111159189-60437466 = 22827 -20141027124728791-60437491 = 22840 -20141028170150992-60438459 = 22790 -20141029161045722-60438957 = 22855 -20141030161047748-60439004 = 22880 -20141031110527749-60439022 = 22901 -20141031110527749-60439023 = 22902 -20141031110527756-60439024 = 22903 -20141031110527757-60439025 = 24628 -20141031110527757-60439026 = 22904 -20141031110527758-60439027 = 24629 -20141031110527764-60439028 = 22905 -20141031110527765-60439029 = 22906 -20141031164811019-60439037 = 23195 -20141031164811020-60439038 = 23196 -20141031164811026-60439039 = 23197 -20141031164811027-60439040 = 23198 -20141031164811028-60439041 = 23199 -20141031164811029-60439042 = 23200 -20141031164811037-60439043 = 23201 -20141031164811037-60439044 = 23202 -20141104171047374-60439240 = 25953 -20141104172015021-60439243 = 23007 -20141106102020238-60439280 = 24107 -20141106102020239-60439281 = 24108 -20141106102020245-60439282 = 24109 -20141106102020245-60439283 = 24110 -20141106102020246-60439284 = 24111 -20141106102020246-60439285 = 24127 -20141106102020254-60439286 = 24128 -20141106102020254-60439287 = 24129 -20141106165613994-60439423 = 23423 -20141106165613994-60439424 = 23424 -20141110160637787-60439802 = 23890 -20141112092310133-60440551 = 23943 -20141114141838916-60440819 = 24130 -20141118144815685-60441078 = 24442 -20141118144815686-60441079 = 24434 -20141118144815703-60441080 = 24456 -20141118144815703-60441081 = 24470 -20141118144815704-60441082 = 24484 -20141118144815705-60441083 = 24498 -20141118144815717-60441084 = 24508 -20141118144815719-60441085 = 24518 -20141118174858623-60441167 = 24630 -20141125162445037-60441623 = 24587 -20141127171042300-60441668 = 24627 -20141128174815756-60441671 = 24919 -20141128174815756-60441672 = 24920 -20141128174815764-60441673 = 24921 -20141128174815765-60441674 = 24971 -20141128174815766-60441675 = 24923 -20141128174815766-60441676 = 24924 -20141128174815775-60441677 = 24925 -20141128174815776-60441678 = 24926 -20141201151036410-60441746 = 24947 -20141204122958560-60442407 = 25006 -20141204123057780-60442408 = 25005 -20141204123124315-60442409 = 25004 -20141204123237308-60442410 = 25003 -20141204123308629-60442411 = 25002 -20141204144842975-60442474 = 25202 -20141204153227792-60442477 = 25303 -20141204153227793-60442478 = 25327 -20141204153227801-60442479 = 25328 -20141204153227801-60442480 = 25329 -20141204153227802-60442481 = 25495 -20141204153227803-60442482 = 25331 -20141204153227809-60442483 = 25332 -20141204153227810-60442484 = 25496 -20141205132533103-60442949 = 25434 -20141208153049627-60443223 = 25442 -20141209141052407-60443243 = 27141 -20141209154907816-60443246 = 25508 -20141210165321840-60443373 = 25547 -20141212080302177-60443593 = 26042 -20141212093855654-60443611 = 25558 -20141212094000169-60443612 = 27253 -20141212094034526-60443613 = 25560 -20141212140006907-60443652 = 25814 -20141212140006907-60443653 = 25864 -20141212140006911-60443654 = 25890 -20141212140006911-60443655 = 25892 -20141212140006912-60443656 = 25894 -20141212140006912-60443657 = 25897 -20141212140006916-60443658 = 25899 -20141212140006916-60443659 = 25901 -20141212140008327-60443667 = 25891 -20141212140008328-60443668 = 25893 -20141212140008332-60443669 = 25895 -20141212140008333-60443670 = 25896 -20141212140008333-60443671 = 25898 -20141212140008333-60443672 = 25900 -20141212140008337-60443673 = 25902 -20141212140008337-60443674 = 25903 -20141212141037031-60443682 = 25927 -20141217140043269-60444854 = 26419 -20141217150011795-60444860 = 26572 -20141217150011795-60444861 = 26573 -20141217150011800-60444862 = 26574 -20141217150011800-60444863 = 26871 -20141217150011801-60444864 = 26576 -20141217150011805-60444866 = 26577 -20141217150011806-60444867 = 26578 -20141217153213800-60444875 = 26770 -20141217153213800-60444876 = 26771 -20141217153213807-60444877 = 26772 -20141217153213808-60444878 = 26773 -20141217153213808-60444879 = 26774 -20141217153213809-60444880 = 26775 -20141219111057430-60445308 = 26471 -20141219134243854-60445311 = 26446 -20150106122936809-60445847 = 26908 -20150106123145774-60445848 = 26907 -20150107142414241-60446074 = 27130 -20150107142414343-60446075 = 27134 -20150107151040832-60446082 = 27216 -20150109182612046-60446614 = 27218 -20150112164844156-60446694 = 27217 -20150113135059402-60446720 = 27254 -20150113181038196-60446726 = 27255 -20150114145610761-60446773 = 27709 -20150114145610761-60446774 = 27710 -20150114145610769-60446775 = 27711 -20150114145610770-60446776 = 27712 -20150114145610771-60446777 = 27713 -20150114145610771-60446778 = 27714 -20150114145610779-60446779 = 27715 -20150114145610780-60446780 = 27716 -20150114151040461-60446788 = 27576 -20150114174841821-60446851 = 27548 -20150115151611369-60447576 = 27733 -20150115161035851-60447578 = 27762 -20150116155430381-60447855 = 27775 -20150119154846406-60447872 = 28069 -20150120114859703-60448169 = 28084 -20150120140809720-60448171 = 28223 -20150120140809721-60448172 = 28224 -20150120140809728-60448173 = 28225 -20150120140809729-60448174 = 28226 -20150120140809729-60448175 = 28227 -20150120140809730-60448176 = 28228 -20150120140809734-60448177 = 28229 -20150120140809734-60448178 = 28230 -20150120141040639-60448186 = 28275 -20150121183648199-60448463 = 28246 -20150122132017672-60448496 = 28272 -20150123112101211-60448526 = 28256 -20150123112316771-60448528 = 28253 -20150123144814364-60448533 = 28515 -20150123144814365-60448534 = 28541 -20150123144814372-60448535 = 28599 -20150123144814373-60448536 = 28558 -20150123144814373-60448537 = 28560 -20150123144814374-60448538 = 28577 -20150123144814380-60448539 = 28578 -20150123144814380-60448540 = 28580 -20150123144818261-60448548 = 28579 -20150123144818262-60448549 = 28581 -20150123144818266-60448550 = 28582 -20150123144818266-60448551 = 28583 -20150123144818267-60448552 = 28584 -20150123144818267-60448553 = 28585 -20150123144818271-60448554 = 28586 -20150123144818271-60448555 = 28587 -20150129162423877-60449146 = 29009 -20150129162423878-60449147 = 29010 -20150129162435864-60449149 = 29029 -20150129162435864-60449150 = 29031 -20150130141816705-60449255 = 29033 -20150130164611981-60449290 = 28809 -20150202161247001-60449982 = 29115 -20150203153205865-60450067 = 29277 -20150203153205866-60450068 = 29278 -20150203153205871-60450069 = 29279 -20150203153205872-60450070 = 29280 -20150203153205873-60450071 = 29281 -20150203153205873-60450072 = 29282 -20150203153205880-60450073 = 29283 -20150203153205884-60450074 = 29284 -20150203153208776-60450082 = 29612 -20150203153208776-60450083 = 29613 -20150203153208782-60450084 = 29614 -20150203153208782-60450085 = 29615 -20150203153208783-60450086 = 29616 -20150203153208783-60450087 = 29617 -20150203153208791-60450088 = 29618 -20150203153208792-60450089 = 29619 -20150204174817644-60450130 = 29126 -20150205174243591-60450346 = 29300 -20150206143332727-60450366 = 29317 -20150209152943307-60450432 = 29399 -20150210144011059-60450516 = 29534 -20150210144011060-60450517 = 29535 -20150210144011075-60450518 = 29536 -20150210144011075-60450519 = 29537 -20150210144011076-60450520 = 29538 -20150210144011077-60450521 = 29539 -20150210144011087-60450522 = 29540 -20150210144011088-60450523 = 29541 -20150210161843154-60450531 = 29416 -20150213144812415-60450886 = 29937 -20150213144812416-60450887 = 29938 -20150213144812426-60450888 = 29939 -20150213144812426-60450889 = 29940 -20150213144812427-60450890 = 29941 -20150213144812428-60450891 = 29942 -20150213144812435-60450892 = 29943 -20150213144812435-60450893 = 29944 -20150213144815962-60450901 = 29973 -20150213144815962-60450902 = 29974 -20150213144815970-60450903 = 29975 -20150213144815972-60450904 = 29976 -20150213144815973-60450905 = 29977 -20150213144815973-60450906 = 29978 -20150213144815983-60450907 = 29979 -20150213144815984-60450908 = 29980 -20150216174841182-60450950 = 29630 -20150217142446922-60451046 = 29715 -20150218154906604-60451332 = 30004 -20150219121044340-60451481 = 30188 -20150219140019875-60451484 = 30136 -20150219140019876-60451485 = 30137 -20150219140019890-60451486 = 30138 -20150219140019891-60451487 = 30139 -20150219140019892-60451488 = 30140 -20150219140019892-60451489 = 30141 -20150219140019900-60451490 = 30142 -20150219140019901-60451491 = 30143 -20150219164548240-60451552 = 30035 -20150220171839966-60451594 = 30064 -20150224140541688-60451942 = 30246 -20150224161618336-60451945 = 30216 -20150225132544491-60452020 = 30284 diff --git a/deep_sequencing_unit/tracking/dist/tracking.sh b/deep_sequencing_unit/tracking/dist/tracking.sh deleted file mode 100755 index cc3e81f70ee..00000000000 --- a/deep_sequencing_unit/tracking/dist/tracking.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash -# -# Launch script for CISD openBIS Tracking system for Deep Sequencing Unit. -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JAR_FILE=lib/openbis-tracking-qgf-client.jar - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -[[ -d log ]] || mkdir log - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" -${JAVA_BIN} ${ALL_JAVA_OPTS} -jar $JAR_FILE "$@" \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/etc/email-template.txt b/deep_sequencing_unit/tracking/etc/email-template.txt deleted file mode 100644 index 38ead1310b9..00000000000 --- a/deep_sequencing_unit/tracking/etc/email-template.txt +++ /dev/null @@ -1,26 +0,0 @@ -Dear Mrs./Mr. -This email has been sent to you automatically by the openBIS system because -you have been registered as a contact person or principal investigator. - -There is progress considering your sequencing order. Below you will find all -the details. - -Alternatively for an easier download of FASTQ files use this little webapp: -https://openbis-dsu.ethz.ch/openbis/webapp/downloader/ - -For batch downloading FASTQ file via SFTP please have a look at the -documentation here: -https://wiki-bsse.ethz.ch/x/MBEkBg#InstallationandAdministratorsGuideoftheopenBISDataStoreServer-ExampleFTPSclientconfiguration - -Some documentation about FASTQ and openBIS is available here: -https://wiki-bsse.ethz.ch/display/DBSSEQGF/Home -http://www.bsse.ethz.ch/qgf/faq - -Kind regards, -Quantitative Genomics Facility Team -http://www.bsse.ethz.ch/qgf/ - -{generated-content} - -------------------------------------------------------------------------------- -http://www.bsse.ethz.ch/qgf/ \ No newline at end of file diff --git a/deep_sequencing_unit/tracking/etc/log.xml b/deep_sequencing_unit/tracking/etc/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/deep_sequencing_unit/tracking/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/deep_sequencing_unit/tracking/etc/openBIS.keystore b/deep_sequencing_unit/tracking/etc/openBIS.keystore deleted file mode 100644 index 28d6c1945533908c76f28785953cbed4004c4555..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98036 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 GrT!mNl@~Jr diff --git a/deep_sequencing_unit/tracking/etc/service.properties b/deep_sequencing_unit/tracking/etc/service.properties deleted file mode 100644 index 6a5b0497ed8..00000000000 --- a/deep_sequencing_unit/tracking/etc/service.properties +++ /dev/null @@ -1,21 +0,0 @@ -openbis-user=tracker -openbis-password=jadfs8r3jahu12 -openbis-server-url = http://openbis-dsu.bsse.ethz.ch:8080/openbis/openbis -permlink-url = https://openbis-dsu.bsse.ethz.ch/openbis - -mail.smtp.host = file://../targets/playground -mail.smtp.user = -mail.smtp.password = - -FMI-affiliation-notification-email-contact = fmi@bsse.ethz.ch - -# all emails will be sent from this address -mail.from = openbis-noreply@bsse.ethz.ch -# all emails will have this address in the reply-to field -notification-email-reply-to = manuel.kohler@bsse.ethz.ch -# subject of all the notification emails -notification-email-subject = BSSE DSU (LOCAL TEST): Status report of your deep sequencing order - -# if the tracking client fails an email will be sent out to these recipients -tracking-admin-email = kohleman@ethz.ch, gpawel@ethz.ch -jython-version=2.7 diff --git a/deep_sequencing_unit/tracking/etc/tracking-local-database b/deep_sequencing_unit/tracking/etc/tracking-local-database deleted file mode 100644 index af910cae04a..00000000000 --- a/deep_sequencing_unit/tracking/etc/tracking-local-database +++ /dev/null @@ -1,2 +0,0 @@ -trackedSamplesToBeProcessed 1 2 3 4 5 -trackedSamplesProcessedSuccessfully 1 2 3 diff --git a/deep_sequencing_unit/tracking/etc/tracking-sample-database b/deep_sequencing_unit/tracking/etc/tracking-sample-database deleted file mode 100644 index dac98d90e94..00000000000 --- a/deep_sequencing_unit/tracking/etc/tracking-sample-database +++ /dev/null @@ -1 +0,0 @@ -20090901100144407-102 = 192 \ No newline at end of file diff --git a/gradle/build.gradle b/gradle/build.gradle index 1d1474dfa18..049eac5fa73 100644 --- a/gradle/build.gradle +++ b/gradle/build.gradle @@ -7,7 +7,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':openbis_standard_technologies') evaluationDependsOn(':installation') evaluationDependsOn(':ui-test') diff --git a/gradle/settings.gradle b/gradle/settings.gradle index 3635441b121..d29899caeb4 100644 --- a/gradle/settings.gradle +++ b/gradle/settings.gradle @@ -1,5 +1,5 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', + 'datastore_server', 'screening', 'openbis_standard_technologies', 'installation', 'image_readers', 'ui-test', 'js-test', 'datamover', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template', 'openbis_statistics_server', 'openbis_benchmark' \ No newline at end of file diff --git a/installation/build.gradle b/installation/build.gradle index beb60bdc40f..4396fa02cc4 100644 --- a/installation/build.gradle +++ b/installation/build.gradle @@ -7,7 +7,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':openbis_standard_technologies') apply from: '../gradle/javaproject.gradle' diff --git a/installation/settings.gradle b/installation/settings.gradle index 69a2bcdd162..e16c48dae45 100644 --- a/installation/settings.gradle +++ b/installation/settings.gradle @@ -1,4 +1,4 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', - 'openbis_standard_technologies', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' + 'datastore_server', 'screening', 'openbis_standard_technologies', 'big_data_link_server', + 'openbis_ng_ui', 'microservice_server_template' diff --git a/js-test/settings.gradle b/js-test/settings.gradle index 4895536be0b..5da3f86d633 100644 --- a/js-test/settings.gradle +++ b/js-test/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'openbis_standard_technologies', + 'datastore_server', 'screening', 'openbis_standard_technologies', 'ui-test','screening' diff --git a/openbis_all/build/build.xml b/openbis_all/build/build.xml index c8cad33497a..ef36ef8af76 100644 --- a/openbis_all/build/build.xml +++ b/openbis_all/build/build.xml @@ -16,10 +16,6 @@ <param name="project" value="datastore_server" /> <param name="pattern" value="*"/> </antcall> - <antcall target="_dist"> - <param name="project" value="deep_sequencing_unit" /> - <param name="pattern" value="*"/> - </antcall> <antcall target="_dist"> <param name="project" value="screening" /> <param name="pattern" value="*"/> @@ -76,9 +72,6 @@ <antcall target="_clean"> <param name="project" value="datastore_server"/> </antcall> - <antcall target="_clean"> - <param name="project" value="deep_sequencing_unit"/> - </antcall> <antcall target="_clean"> <param name="project" value="screening"/> </antcall> diff --git a/openbis_all/source/bash/build/branch.sh b/openbis_all/source/bash/build/branch.sh index 019ae645e4e..faacce162b5 100755 --- a/openbis_all/source/bash/build/branch.sh +++ b/openbis_all/source/bash/build/branch.sh @@ -31,7 +31,6 @@ common \ datamover \ datastore_server \ dbmigration \ -deep_sequencing_unit \ installation \ js-test \ openbis \ diff --git a/openbis_contrib/.classpath b/openbis_contrib/.classpath deleted file mode 100644 index 78c5c4b761a..00000000000 --- a/openbis_contrib/.classpath +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="src" path="source/java"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/> - <classpathentry kind="lib" path="/libraries/eodsql/eodsql.jar"/> - <classpathentry kind="lib" path="/libraries/postgresql/postgresql.jar"/> - <classpathentry kind="lib" path="/libraries/testng/testng-jdk15.jar"/> - <classpathentry combineaccessrules="false" kind="src" path="/common"/> - <classpathentry combineaccessrules="false" kind="src" path="/datastore_server"/> - <classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-codec/commons-codec.jar" sourcepath="/libraries/commons-codec/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-httpclient/commons-httpclient.jar" sourcepath="/libraries/commons-httpclient/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-io/commons-io.jar" sourcepath="/libraries/commons-io/src.zip"/> - <classpathentry kind="lib" path="/libraries/commons-logging/commons-logging.jar" sourcepath="/libraries/commons-logging/src.zip"/> - <classpathentry kind="lib" path="/libraries/jline/jline.jar" sourcepath="/libraries/jline/src.zip"/> - <classpathentry kind="lib" path="/libraries/log4j/log4j.jar" sourcepath="/libraries/log4j/src.zip"/> - <classpathentry kind="lib" path="/libraries/spring/spring.jar" sourcepath="/libraries/spring/src.jar"/> - <classpathentry kind="lib" path="/libraries/spring/third-party/stream-supporting-httpinvoker.jar" sourcepath="/libraries/spring/third-party/stream-supporting-httpinvoker-src.zip"/> - <classpathentry kind="output" path="targets/classes"/> -</classpath> diff --git a/openbis_contrib/.project b/openbis_contrib/.project deleted file mode 100644 index 19c52fa17a7..00000000000 --- a/openbis_contrib/.project +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>openbis_contrib</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/openbis_contrib/.settings/org.eclipse.jdt.core.prefs b/openbis_contrib/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index db8ce66004c..00000000000 --- a/openbis_contrib/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Tue Jul 27 16:10:00 CEST 2010 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 diff --git a/openbis_contrib/build/build.xml b/openbis_contrib/build/build.xml deleted file mode 100644 index f582ea8cb19..00000000000 --- a/openbis_contrib/build/build.xml +++ /dev/null @@ -1,72 +0,0 @@ -<project name="GetSampleProperties" default="GetSampleProperties-jar" basedir=".."> - <import file="../../datastore_server/build/build.xml" /> - <project-classpath name="ecp" classes="${classes}" /> - - <property name="original.dist" value="dist" /> - <property name="mainfolder" value="GetSampleProperties" /> - - <property name="dist.properties" value="${dist}/properties" /> - <property name="dist.properties.lib" value="${dist.properties}/lib" /> - <property name="properties-jar.file" value="${dist.properties.lib}/openbis-properties-client.jar" /> - <property name="properties.original.dist" value="properties/dist" /> - - <target name="compile" depends="build-common.compile, clean" /> - - <target name="run-tests"> - <antcall target="build-common.run-tests"> - <param name="test.suite" value="tests.xml" /> - </antcall> - </target> - - <target name="GetSampleProperties-jar" depends="compile"> - <mkdir dir="${dist.properties.lib}" /> - <recursive-jar destfile="${properties-jar.file}"> - <fileset dir="${classes}"> - <include name="ch/ethz/bsse/cisd/dsu/properties/*.class" /> - <include name="${build.info.filename}" /> - </fileset> - <manifest> - <attribute name="Main-Class" value="ch.ethz.bsse.cisd.dsu.properties.GetSampleProperties" /> - <attribute name="Class-Path" value="cisd-base.jar log4j.jar activation.jar mail.jar gwt-isserializable.jar - commons-io.jar commons-lang.jar commons-logging.jar commons-httpclient.jar commons-codec.jar - spring.jar stream-supporting-httpinvoker.jar" /> - </manifest> - </recursive-jar> - </target> - - <target name="properties-dist" depends="GetSampleProperties-jar"> - <copy file="${properties-jar.file}" todir="${dist.properties.lib}" /> - <copy file="${lib}/cisd-base/cisd-base.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/activation/activation.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/mail/mail.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/log4j/log4j.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/gwt2.4/gwt-isserializable.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-logging/commons-logging.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-io/commons-io.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-lang/commons-lang.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-httpclient/commons-httpclient.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/commons-codec/commons-codec.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/spring/spring.jar" todir="${dist.properties.lib}" /> - <copy file="${lib}/spring/third-party/stream-supporting-httpinvoker.jar" todir="${dist.properties.lib}" /> - - <property name="properties-dist.file" value="openbis-properties-client.zip" /> - <mkdir dir="${dist.properties}" /> - <zip basedir="${dist.properties}" destfile="${dist.properties}/${properties-dist.file}" excludes="*.zip *.jar"> - <zipfileset dir="${properties.original.dist}" excludes="**/*.sh"/> - <zipfileset file="${properties.original.dist}/properties.sh" filemode="755" /> - </zip> - - </target> - - <!-- - // Task for creating distributions - --> - <target name="dist" depends="datastore_server.make-dist, properties-dist" /> - - <!-- - // Task for continuous integration server. - --> - <target name="ci" depends="build-common.ci, dist, check-dependencies" /> - - -</project> \ No newline at end of file diff --git a/openbis_contrib/dist/.gitignore b/openbis_contrib/dist/.gitignore deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/openbis_contrib/etc/log.xml b/openbis_contrib/etc/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/openbis_contrib/etc/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/openbis_contrib/etc/service.properties b/openbis_contrib/etc/service.properties deleted file mode 100644 index 24f46a4097b..00000000000 --- a/openbis_contrib/etc/service.properties +++ /dev/null @@ -1,22 +0,0 @@ -# The username to use when contacting the openBIS server -username = etlserver_bsse -# The password to use when contacting the openBIS server -password = twcTEe9j -# default flow cell space: -default_flow_cell_space = CISD:/BSSE_FLOWCELLS/ - -eland_config_file = config.txt - -bowtie_config_file = bowtie.txt - -bcl2fastq_config_file = SampleSheet.csv - -bcl2fastq_separator = , - -phix_name = phiX - -operator = ETHZ_BSSE_DSU - -mail = manuel.kohler@bsse.ethz.ch - -header = FCID,Lane,SampleID,SampleRef,Index,Description,Control,Recipe,Operator,SampleProject diff --git a/openbis_contrib/properties/dist/properties.sh b/openbis_contrib/properties/dist/properties.sh deleted file mode 100644 index 00b56389c8b..00000000000 --- a/openbis_contrib/properties/dist/properties.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# -# Runs on Unix / Linux systems. -# ------------------------------------------------------------------------- - -JAR_FILE=lib/openbis-properties-client.jar - -# -# change to installation directory -# -bin=$0 -if [ -L $bin ]; then - bin=`dirname $bin`/`readlink $bin` -fi -WD=`dirname $bin` -cd $WD -SCRIPT=./`basename $0` - -if [ "$JAVA_HOME" != "" ]; then - JAVA_BIN="$JAVA_HOME/bin/java" -else - JAVA_BIN="java" -fi - -ALL_JAVA_OPTS="-Djavax.net.ssl.trustStore=etc/openBIS.keystore $JAVA_OPTS" -echo "Starting..." -${JAVA_BIN} ${ALL_JAVA_OPTS} -jar $JAR_FILE "$@" diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java deleted file mode 100644 index 88adfcc8175..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ControlledVocabulariesDTO.java +++ /dev/null @@ -1,36 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class ControlledVocabulariesDTO extends AbstractHashable -{ - @ResultColumn("controlledVocabularies") - private String controlledVocabularies; - - ControlledVocabulariesDTO() - { - // All Data-Object classes must have a default constructor. - } - - public ControlledVocabulariesDTO(String controlledVocabularies) - { - super(); - this.controlledVocabularies = controlledVocabularies; - } - - public String getControlledVocabularies() - { - return controlledVocabularies; - } - - public void setControlledVocabularies(String controlledVocabularies) - { - this.controlledVocabularies = controlledVocabularies; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java deleted file mode 100644 index 03881291f6e..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DataSetPropertyAssignmentsDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class DataSetPropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("dataSet") - private String dataSet; - - @ResultColumn("propertyType") - private String propertyType; - - DataSetPropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public DataSetPropertyAssignmentsDTO(String dataSet, String propertyType) - { - super(); - this.dataSet = dataSet; - this.propertyType = propertyType; - } - - public String getDataSet() - { - return dataSet; - } - - public void setDataSet(String dataSet) - { - this.dataSet = dataSet; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java deleted file mode 100644 index 73763f4ce13..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparison.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright 2009 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -/** - * @author Manuel Kohler - */ - -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Properties; -import java.util.Set; - -import net.lemnik.eodsql.QueryTool; - -public class DbDataTypeComparison -{ - private static final String DRY_RUN_FLAG = "--dry-run"; - - private static Connection connect(String jdbcURL) throws ClassNotFoundException, SQLException - { - Class.forName("org.postgresql.Driver"); - final Driver driver = DriverManager.getDriver(jdbcURL); - final Properties props = new Properties(); - props.put("user", System.getProperty("user.name")); - props.put("password", ""); - return driver.connect(jdbcURL, props); - } - - public static void main(String[] args) throws Exception - { - if (args.length < 3) - { - String programName = getProgramName(); - System.err.println("Usage: java -jar " + programName - + " <source_db_jdbc_string> <target_db_jdbc_string> <user_ID> [" + DRY_RUN_FLAG - + "]"); - System.exit(1); - } - - String source_db_jdbc_string = args[0]; - String target_db_jdbc_string = args[1]; - - System.out.println("Used Source: " + source_db_jdbc_string); - System.out.println("Used Target: " + target_db_jdbc_string); - - final Connection sourceconn = connect(source_db_jdbc_string); - final Connection targetconn = connect(target_db_jdbc_string); - - DbDataTypeComparisonDAO dbSourceDao = - QueryTool.getQuery(sourceconn, DbDataTypeComparisonDAO.class); - DbDataTypeComparisonDAO dbTargetDao = - QueryTool.getQuery(targetconn, DbDataTypeComparisonDAO.class); - - Set<String> dataSetTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listDataSetTypeCodes()), - Arrays.asList(dbTargetDao.listDataSetTypeCodes())); - - Set<String> experimentTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listExperimentTypeCodes()), - Arrays.asList(dbTargetDao.listExperimentTypeCodes())); - - Set<String> materialTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listMaterialTypeCodes()), - Arrays.asList(dbTargetDao.listMaterialTypeCodes())); - - Set<String> propertyTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listPropertyTypeCodes()), - Arrays.asList(dbTargetDao.listPropertyTypeCodes())); - - Set<String> sampleTypeCodes = - queryStringLists(Arrays.asList(dbSourceDao.listSampleTypeCodes()), - Arrays.asList(dbTargetDao.listSampleTypeCodes())); - - Set<PropertyTypeAndDataTypeDTO> PropertyTypeAndDataType = - queryStringLists(dbSourceDao.getPropertyTypeAndDataType(), - dbTargetDao.getPropertyTypeAndDataType()); - - // Assignments - Set<SamplePropertyAssignmentsDTO> SamplePropertyAssignments = - queryStringLists(dbSourceDao.getSamplePropertyAssignments(), - dbTargetDao.getSamplePropertyAssignments()); - - Set<DataSetPropertyAssignmentsDTO> DataSetPropertyAssignments = - queryStringLists(dbSourceDao.getDataSetPropertyAssignments(), - dbTargetDao.getDataSetPropertyAssignments()); - - Set<ExperimentPropertyAssignmentsDTO> ExperimentPropertyAssignments = - queryStringLists(dbSourceDao.getExperimentPropertyAssignments(), - dbTargetDao.getExperimentPropertyAssignments()); - - Set<MaterialPropertyAssignmentDTO> MaterialPropertyAssignment = - queryStringLists(dbSourceDao.getMaterialPropertyAssignment(), - dbTargetDao.getMaterialPropertyAssignment()); - - Set<ControlledVocabulariesDTO> ControlledVocabularies = - queryStringLists(dbSourceDao.getControlledVocabularies(), - dbTargetDao.getControlledVocabularies()); - - Set<TermsOfControlledVocabulariesDTO> TermsOfControlledVocabularies = - queryStringLists(dbSourceDao.getTermsOfControlledVocabularies(), - dbTargetDao.getTermsOfControlledVocabularies()); - - System.out.println("Differences:"); - System.out.println("dataSetTypeCodes: " + dataSetTypeCodes); - System.out.println("experimentTypeCodes: " + experimentTypeCodes); - System.out.println("materialTypeCodes: " + materialTypeCodes); - System.out.println("propertyTypeCodes: " + propertyTypeCodes); - System.out.println("sampleTypeCodes: " + sampleTypeCodes); - - System.out.println("===================="); - - System.out.println("PropertyTypeAndDataType: " + PropertyTypeAndDataType); - System.out.println("SamplePropertyAssignments: " + SamplePropertyAssignments); - System.out.println("DataSetPropertyAssignments: " + DataSetPropertyAssignments); - System.out.println("ExperimentPropertyAssignments: " + ExperimentPropertyAssignments); - System.out.println("MaterialPropertyAssignment: " + MaterialPropertyAssignment); - System.out.println("ControlledVocabularies: " + ControlledVocabularies); - System.out.println("TermsOfControlledVocabularies: " + TermsOfControlledVocabularies); - - sourceconn.close(); - targetconn.close(); - } - - private static <T> Set<T> queryStringLists(List<T> sourceList, List<T> targetList) - { - Set<T> intersect = new HashSet<T>(targetList); - intersect.retainAll(sourceList); - System.out.println("Number of common objects: " + intersect.size()); - // System.out.println(intersect); - - Set<T> diff = new HashSet<T>(targetList); - diff.removeAll(sourceList); - System.out.println("Number of differential objects: " + diff.size()); - // System.out.println(diff); - - return diff; - } - - private static String getProgramName() - { - StackTraceElement[] stack = Thread.currentThread().getStackTrace(); - StackTraceElement main = stack[stack.length - 1]; - String mainClass = main.getClassName(); - - // workaround, because the split does not work with a '.' - mainClass = mainClass.replace(".", " "); - String[] tokens = mainClass.split(" "); - - String jarName = tokens[tokens.length - 1] + ".jar"; - return jarName; - } -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java deleted file mode 100644 index 0bc30a8a1e9..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/DbDataTypeComparisonQueryDAO.java +++ /dev/null @@ -1,71 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -/** - * @author Manuel Kohler - */ - -import java.util.List; - -import net.lemnik.eodsql.Select; -import net.lemnik.eodsql.TransactionQuery; - -interface DbDataTypeComparisonDAO extends TransactionQuery -{ - public static final int FETCH_SIZE = 1000; - - // types: - @Select("select code as sample_types from sample_types order by code") - public String[] listSampleTypeCodes(); - - @Select("select code as data_set_types from data_set_types order by code") - public String[] listDataSetTypeCodes(); - - @Select("select code as experiment_types from experiment_types order by code") - public String[] listExperimentTypeCodes(); - - @Select("select code as material_types from material_types order by code") - public String[] listMaterialTypeCodes(); - - @Select("select code as property_types from property_types order by code;") - public String[] listPropertyTypeCodes(); - - // which data_type for a property_type? - @Select("select pt.code as ptCode, dt.code as dtCode from property_types pt join data_types dt on pt.daty_id=dt.id order by pt.code;") - public List<PropertyTypeAndDataTypeDTO> getPropertyTypeAndDataType(); - - // property assignments: - // samples - @Select("select st.code as sampleType, pt.code as propertyType from property_types pt" - + " join sample_type_property_types stpt on pt.id = stpt.prty_id" - + " join sample_types st on stpt.saty_id=st.id order by st.code;") - public List<SamplePropertyAssignmentsDTO> getSamplePropertyAssignments(); - - // data sets - @Select("select dst.code as dataSet, pt.code as propertyType from property_types pt" - + " join data_set_type_property_types dstpt on pt.id = dstpt.prty_id" - + " join data_set_types dst on dstpt.dsty_id=dst.id order by dst.code;") - public List<DataSetPropertyAssignmentsDTO> getDataSetPropertyAssignments(); - - // experiments - @Select("select ep.code as experimentType, pt.code as propertyType from property_types pt" - + " join experiment_type_property_types etpt on pt.id=etpt.exty_id" - + " join experiment_types ep on etpt.exty_id=ep.id order by ep.code;") - public List<ExperimentPropertyAssignmentsDTO> getExperimentPropertyAssignments(); - - // materials - @Select("select mt.code as materialType, pt.code as propertyType from property_types pt" - + " join material_type_property_types mtpt on pt.id=mtpt.prty_id" - + " join material_types mt on mt.id = mtpt.maty_id order by mt.code;") - public List<MaterialPropertyAssignmentDTO> getMaterialPropertyAssignment(); - - // controlled vocabularies - @Select("select code as controlledVocabularies from controlled_vocabularies;") - public List<ControlledVocabulariesDTO> getControlledVocabularies(); - - // controlled vocabularies with terms - @Select("select cv.code as controlledVocabularies, cvt.code as controlledVocabulariesTerms" - + " from controlled_vocabularies cv join controlled_vocabulary_terms cvt" - + " on cv.id=cvt.covo_id order by cv.code;") - public List<TermsOfControlledVocabulariesDTO> getTermsOfControlledVocabularies(); - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java deleted file mode 100644 index 6ffd352fcad..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/ExperimentPropertyAssignmentsDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class ExperimentPropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("experimentType") - private String experimentType; - - @ResultColumn("propertyType") - private String propertyType; - - ExperimentPropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public ExperimentPropertyAssignmentsDTO(String experimentType, String propertyType) - { - super(); - this.experimentType = experimentType; - this.propertyType = propertyType; - } - - public String getExperimentType() - { - return experimentType; - } - - public void setExperimentType(String experimentType) - { - this.experimentType = experimentType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java deleted file mode 100644 index d1033a0718f..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/MaterialPropertyAssignmentDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class MaterialPropertyAssignmentDTO extends AbstractHashable -{ - - @ResultColumn("materialType") - private String materialType; - - @ResultColumn("propertyType") - private String propertyType; - - MaterialPropertyAssignmentDTO() - { - // All Data-Object classes must have a default constructor. - } - - public MaterialPropertyAssignmentDTO(String materialType, String propertyType) - { - super(); - this.materialType = materialType; - this.propertyType = propertyType; - } - - public String getMaterialType() - { - return materialType; - } - - public void setMaterialType(String materialType) - { - this.materialType = materialType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java deleted file mode 100644 index 448d93eead3..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/PropertyTypeAndDataTypeDTO.java +++ /dev/null @@ -1,68 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.AutoGeneratedKeys; -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ - -class PropertyTypeAndDataTypeDTO extends AbstractHashable -{ - @AutoGeneratedKeys - private long id; - - @ResultColumn("ptCode") - private String ptCode; - - @ResultColumn("dtCode") - private String dtCode; - - PropertyTypeAndDataTypeDTO() - { - // All Data-Object classes must have a default constructor. - } - - public int compareTo(PropertyTypeAndDataTypeDTO P) - { - return ptCode.compareTo(P.getPtCode()); - } - - public PropertyTypeAndDataTypeDTO(String ptCode, String dtCode) - { - this.ptCode = ptCode; - this.dtCode = dtCode; - } - - public long getId() - { - return id; - } - - public void setId(long id) - { - this.id = id; - } - - public String getPtCode() - { - return ptCode; - } - - public void setPtCode(String ptCode) - { - this.ptCode = ptCode; - } - - public String getDtCode() - { - return dtCode; - } - - public void setDtCode(String dtCode) - { - this.dtCode = dtCode; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java deleted file mode 100644 index b502f213178..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/SamplePropertyAssignmentsDTO.java +++ /dev/null @@ -1,49 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ -class SamplePropertyAssignmentsDTO extends AbstractHashable -{ - @ResultColumn("sampleType") - private String sampleType; - - @ResultColumn("propertyType") - private String propertyType; - - SamplePropertyAssignmentsDTO() - { - // All Data-Object classes must have a default constructor. - } - - public SamplePropertyAssignmentsDTO(String sampleType, String propertyType) - { - super(); - this.sampleType = sampleType; - this.propertyType = propertyType; - } - - public String getSampleType() - { - return sampleType; - } - - public void setSampleType(String sampleType) - { - this.sampleType = sampleType; - } - - public String getPropertyType() - { - return propertyType; - } - - public void setPropertyType(String propertyType) - { - this.propertyType = propertyType; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java deleted file mode 100644 index 9d0231e3ad1..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/DbDataTypeComparison/TermsOfControlledVocabulariesDTO.java +++ /dev/null @@ -1,50 +0,0 @@ -package ch.ethz.bsse.cisd.DbDataTypeComparison; - -import net.lemnik.eodsql.ResultColumn; -import ch.systemsx.cisd.common.utilities.AbstractHashable; - -/** - * @author Manuel Kohler - */ -class TermsOfControlledVocabulariesDTO extends AbstractHashable -{ - - @ResultColumn("controlledVocabularies") - private String controlledVocabularies; - - @ResultColumn("controlledVocabulariesTerms") - private String controlledVocabulariesTerms; - - TermsOfControlledVocabulariesDTO() - { - // All Data-Object classes must have a default constructor. - } - - public TermsOfControlledVocabulariesDTO(String controlledVocabularies, - String controlledVocabulariesTerms) - { - super(); - this.controlledVocabularies = controlledVocabularies; - this.controlledVocabulariesTerms = controlledVocabulariesTerms; - } - - public String getControlledVocabularies() - { - return controlledVocabularies; - } - - public void setControlledVocabularies(String controlledVocabularies) - { - this.controlledVocabularies = controlledVocabularies; - } - - public String getControlledVocabulariesTerms() - { - return controlledVocabulariesTerms; - } - - public void setControlledVocabulariesTerms(String controlledVocabulariesTerms) - { - this.controlledVocabulariesTerms = controlledVocabulariesTerms; - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java deleted file mode 100644 index 0ee7464c486..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GenomeMap.java +++ /dev/null @@ -1,84 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.properties; - -import java.util.HashMap; - -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author Manuel Kohler - */ - -public class GenomeMap -{ - - private static String PATH_TO_GENOMES = "/array0/Genomes/"; - - private static HashMap<String, String> genomePaths = new HashMap<String, String>(); - static - { - genomePaths.put("10847", PATH_TO_GENOMES + "PhiX"); - genomePaths.put("10090", PATH_TO_GENOMES + "MusMus/Originals"); - genomePaths.put("9606", PATH_TO_GENOMES + "HomSap/Release36.50"); - genomePaths.put("7227", PATH_TO_GENOMES + "DrosMel/Release5"); - genomePaths.put("6239", PATH_TO_GENOMES + "Celegans/Release112708"); - genomePaths.put("562", PATH_TO_GENOMES + "EColi"); - genomePaths.put("10116", PATH_TO_GENOMES + ""); - } - - public static String getGenomePath(String genome) - { - return genomePaths.get(genome); - } - - private static HashMap<String, String> endType = new HashMap<String, String>(); - static - { - endType.put("SINGLE_READ", "eland_extended"); - endType.put("PAIRED_END", "eland_pair"); - } - - public static String getEndType(String openbisEndType) - { - return endType.get(openbisEndType); - } - - private static HashMap<String, String> bowtieIndex = new HashMap<String, String>(); - static - { - bowtieIndex.put("10847", "phiX"); - bowtieIndex.put("10090", "ncbi37_mm9"); - bowtieIndex.put("9606", "h_sapiens_37_asm"); - bowtieIndex.put("7227", "d_melanogaster_fb5_22"); - } - - public static String getBowtieIndex(String genome) - { - return bowtieIndex.get(genome); - } - - private static HashMap<Integer, String> numberOfCycles = new HashMap<Integer, String>(); - static - { - numberOfCycles.put(58, "51+7"); - } - - public static String getNumberOfCycles(int i) - { - return numberOfCycles.get(i); - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java deleted file mode 100644 index 37fe577773a..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dsu/properties/GetSampleProperties.java +++ /dev/null @@ -1,454 +0,0 @@ -package ch.ethz.bsse.cisd.dsu.properties; - -/* - - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import java.io.FileWriter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; -import java.util.TreeMap; - -import org.apache.log4j.Logger; - -import ch.systemsx.cisd.common.logging.LogCategory; -import ch.systemsx.cisd.common.logging.LogFactory; -import ch.systemsx.cisd.common.spring.HttpInvokerUtils; -import ch.systemsx.cisd.common.utilities.PropertyUtils; -import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService; -import ch.systemsx.cisd.openbis.generic.shared.basic.TechId; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria; -import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample; -import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory; - -/** - * @author Franz-Josef Elmer - * @author Manuel Kohler - */ -public class GetSampleProperties -{ - private static String INDEX_SEPARATOR = "-"; - - private static final String SERVICE_PROPERTIES = "etc/service.properties"; - - private static final String ELAND_CONFIG_FILE = "eland_config_file"; - - private static final String BOWTIE_CONFIG_FILE = "bowtie_config_file"; - - private static final String BCL2FASTQ_CONFIG_FILE = "bcl2fastq_config_file"; - - private static final String DEFAULT_FLOW_CELL_SPACE = "default_flow_cell_space"; - - private static final String USERNAME = "username"; - - private static final String PASSWORD = "password"; - - private static final String BCL2FASTQ_SEPARATOR = "bcl2fastq_separator"; - - private static final String PHIX_NAME = "phix_name"; - - private static final String OPERATOR = "operator"; - - private static final String MAIL = "mail"; - - private static final String HEADER = "header"; - - // Flow Cell properties read out - private static final String END_TYPE = "END_TYPE"; - - private static final String CYCLES = "CYCLES_REQUESTED_BY_CUSTOMER"; - - // Biological Sample properties read out ? - private static final String ORGANISM_PROPERTY = "NCBI_ORGANISM_TAXONOMY"; - - private static final String BARCODE_PROPERTY = "BARCODE"; - - private static final String INDEX2 = "INDEX2"; - - private static final String EXTERNAL_SAMPLE_NAME = "EXTERNAL_SAMPLE_NAME"; - - private enum sampleProperties - { - ORGANISM_PROPERTY1, BARCODE_PROPERTY1, BARCODE_PROPERTY2, ISPHIX, EXTERNAL_SAMPLE_NAME1, - CYCLES1 - } - - protected static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, - GetSampleProperties.class); - - public static void main(String[] args) throws IOException - { - Properties prop = PropertyUtils.loadProperties(SERVICE_PROPERTIES); - - // get all values from service.properties - FileWriter elandWriter = new FileWriter(prop.getProperty(ELAND_CONFIG_FILE)); - FileWriter bowtieWriter = new FileWriter(prop.getProperty(BOWTIE_CONFIG_FILE)); - FileWriter bcl2fastqWriter = new FileWriter(prop.getProperty(BCL2FASTQ_CONFIG_FILE)); - String user = prop.getProperty(USERNAME); - String password = prop.getProperty(PASSWORD); - String default_flow_cell_space = prop.getProperty(DEFAULT_FLOW_CELL_SPACE); - String bcl2fastqSeparator = prop.getProperty(BCL2FASTQ_SEPARATOR); - String phixName = prop.getProperty(PHIX_NAME); - String operator = prop.getProperty(OPERATOR); - String mail = prop.getProperty(MAIL); - String header = prop.getProperty(HEADER); - - Long techId = 0L; - ArrayList<String> bcl2fastqList = new ArrayList<String>(); - List<ArrayList<String>> fullList = new ArrayList<ArrayList<String>>(); - String endType = ""; - String cycles = ""; - - if (args.length < 2) - { - String programName = getProgramName(); - System.err.println("Usage: java -jar " + programName + " <server> <FlowCell>"); - System.exit(1); - } - - String serverURL = args[0]; - String sampleIdendtifier = default_flow_cell_space + args[1]; - - IETLLIMSService service = - HttpInvokerUtils.createServiceStub(IETLLIMSService.class, serverURL + "/rmi-etl", - 5000); - - String sessionToken = service.tryToAuthenticate(user, password).getSessionToken(); - - Sample sample = - service.tryGetSampleWithExperiment(sessionToken, - SampleIdentifierFactory.parse(sampleIdendtifier)); - try - { - techId = sample.getId(); - - } catch (Exception ex) - { - System.err.println("Unknown FlowCell " + sampleIdendtifier); - System.exit(1); - } - - operationLog.info("Found Sample " + sample.getCode() + " with Id " + sample.getId()); - String flowCellId = extractFlowCellId(sample.getCode()); - - // which end type: single read or paired end? - List<IEntityProperty> p = sample.getProperties(); - for (IEntityProperty property : p) - { - if (property.getPropertyType().getCode().equals(END_TYPE)) - { - endType = GenomeMap.getEndType(property.tryGetAsString()); - } - if (property.getPropertyType().getCode().equals(CYCLES)) - { - cycles = GenomeMap.getNumberOfCycles(Integer.parseInt(property.tryGetAsString())); - } - - } - - List<Sample> flowLaneSample = - service.listSamples(sessionToken, - ListSampleCriteria.createForContainer(new TechId(techId))); - - Map<Integer, List<Sample>> parentSamples = new TreeMap<Integer, List<Sample>>(); - - for (Sample fl : flowLaneSample) - { - // Just extract the lane number - - Integer ii = Integer.parseInt(fl.getIdentifier().split(":")[1]); - parentSamples.put( - ii, - service.listSamples(sessionToken, - ListSampleCriteria.createForChild(new TechId(fl.getId())))); - - for (Map.Entry<Integer, List<Sample>> entry : parentSamples.entrySet()) - { - - // System.out.println(entry.getKey() + " " + entry.getValue()); - // System.out.println(entry.getValue().size()); - - for (int j = 0; j <= entry.getValue().size() - 1; ++j) - { - // System.out.println(entry.getValue().get(0).getParents()); - Long s = entry.getValue().get(j).getId(); - // System.out.println(s); - List<Sample> setParents = - service.listSamples(sessionToken, - ListSampleCriteria.createForChild(new TechId(s))); - // System.out.println(setParents); - } - // System.out.println(service.listSamples(sessionToken, - // ListSampleCriteria.createForChild(new TechId(entry.getKey())))); - - } - - } - - for (Entry<Integer, List<Sample>> entry : parentSamples.entrySet()) - { - Integer laneNumber = entry.getKey(); - String propertyString = ""; - String pathToGenome = ""; - String bowtieIndexName = ""; - List<Sample> samples = entry.getValue(); - - // get the properties of the first parent - List<IEntityProperty> properties = samples.get(0).getProperties(); - - for (int i = 0; i < samples.size(); i++) - { - - List<IEntityProperty> properties1 = samples.get(i).getProperties(); - String sampleCode = samples.get(i).getCode(); - HashMap<sampleProperties, String> propertiesPerSample = - new HashMap<sampleProperties, String>(); - - for (IEntityProperty property : properties1) - { - if (property.getPropertyType().getCode().equals(ORGANISM_PROPERTY)) - { - propertyString = property.tryGetAsString(); - bowtieIndexName = GenomeMap.getBowtieIndex(propertyString); - if (bowtieIndexName != null) - { - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - bowtieIndexName); - if (bowtieIndexName.equals(phixName)) - { - propertiesPerSample.put(sampleProperties.ISPHIX, "Y"); - } else - { - propertiesPerSample.put(sampleProperties.ISPHIX, "N"); - } - } else - { - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - "NO_REFERENCE_GENOME_AVAILABLE"); - propertiesPerSample.put(sampleProperties.ORGANISM_PROPERTY1, - bowtieIndexName); - propertiesPerSample.put(sampleProperties.ISPHIX, "N"); - - } - - } - - if (property.getPropertyType().getCode().equals(EXTERNAL_SAMPLE_NAME)) - { - propertiesPerSample.put(sampleProperties.EXTERNAL_SAMPLE_NAME1, - property.tryGetAsString()); - } - - if (property.getPropertyType().getCode().equals(BARCODE_PROPERTY)) - { - // only take the first six nucleotides of the barcode - String barcode = property.tryGetAsString(); - String strippedBarcode = barcode.substring(0, barcode.length() - 1); - propertiesPerSample - .put(sampleProperties.BARCODE_PROPERTY1, strippedBarcode); - } - - if (property.getPropertyType().getCode().equals(INDEX2)) - { - String index2 = property.tryGetAsString(); - if (index2 == null || index2.equals("NOINDEX")) - { - index2 = ""; - INDEX_SEPARATOR = ""; - - } - propertiesPerSample.put(sampleProperties.BARCODE_PROPERTY2, index2); - - } - - } - - // not indexed - if (propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) == null) - { - // when it is a single sample in a single lane - if (samples.size() < 2) - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - // single indexed - } else if (propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY2) == null) - - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - // Dual indexed - else - { - bcl2fastqList.add(flowCellId - + bcl2fastqSeparator - + laneNumber - + bcl2fastqSeparator - + sampleCode - + "_" - + flowCellId - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.ORGANISM_PROPERTY1) - + bcl2fastqSeparator - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY1) - + INDEX_SEPARATOR - + propertiesPerSample.get(sampleProperties.BARCODE_PROPERTY2) - + bcl2fastqSeparator - + cleanString(propertiesPerSample - .get(sampleProperties.EXTERNAL_SAMPLE_NAME1)) - + bcl2fastqSeparator + propertiesPerSample.get(sampleProperties.ISPHIX) - + bcl2fastqSeparator + cycles + bcl2fastqSeparator + operator - + bcl2fastqSeparator + sample.getCode() + "_" + laneNumber + "\n"); - } - } - fullList.add(bcl2fastqList); - bcl2fastqList = new ArrayList<String>(); - - for (IEntityProperty property : properties) - { - if (property.getPropertyType().getCode().equals(BARCODE_PROPERTY)) - { - propertyString = property.tryGetAsString(); - } - - if (property.getPropertyType().getCode().equals(ORGANISM_PROPERTY)) - { - try - { - propertyString = property.tryGetAsString(); - pathToGenome = GenomeMap.getGenomePath(propertyString); - bowtieIndexName = GenomeMap.getBowtieIndex(propertyString); - if (pathToGenome != null) - // TODO: if null then handle properly - { - elandWriter.write(laneNumber + ":ELAND_GENOME " + pathToGenome + "\n"); - elandWriter.write(laneNumber + ":ANALYSIS " + endType + "\n"); - bowtieWriter.write(bowtieIndexName + "\n"); - } - - } catch (IOException ex) - { - ex.printStackTrace(); - } - } - } - } - elandWriter.write("ELAND_FASTQ_FILES_PER_PROCESS 8\n" + "EMAIL_LIST " + mail); - elandWriter.close(); - bowtieWriter.close(); - writebcl2fastqList(bcl2fastqWriter, fullList, header); - operationLog.info("Writing " + prop.getProperty(BCL2FASTQ_CONFIG_FILE) - + " for BCL to FASTQ conversion"); - operationLog - .info("Writing " + prop.getProperty(ELAND_CONFIG_FILE) + " for Eland Alignment"); - operationLog.info("Writing " + prop.getProperty(BOWTIE_CONFIG_FILE) - + " for Bowtie Alignment"); - service.logout(sessionToken); - } - - private static void writebcl2fastqList(FileWriter bcl2fastqWriter, - List<ArrayList<String>> fullList, String header) throws IOException - { - bcl2fastqWriter.write(header + "\n"); - - for (List<String> element : fullList) - { - for (String e : element) - { - operationLog.debug(e); - bcl2fastqWriter.write(e); - } - } - bcl2fastqWriter.close(); - } - - private static String getProgramName() - { - StackTraceElement[] stack = Thread.currentThread().getStackTrace(); - StackTraceElement main = stack[stack.length - 1]; - String mainClass = main.getClassName(); - - // workaround, because the split does not work with a '.' - mainClass = mainClass.replace(".", " "); - String[] tokens = mainClass.split(" "); - - String jarName = tokens[tokens.length - 1] + ".jar"; - return jarName; - } - - private static String extractFlowCellId(String flowCellName) - { - String flowCell[] = flowCellName.split("_"); - // this is a GA - if (flowCell.length == 2) - { - return (flowCell[flowCell.length - 1]); - } else - { - // substring removes the A or B which is the Flow Cell tray in the HiSeq - return (flowCell[flowCell.length - 1].substring(1)); - } - } - - public static String cleanString(String dirtyString) - /* - * Replace all (Unicode) characters that are neither letters nor numbers with a "_" - */ - { - String cleanString = dirtyString.replaceAll("[^\\p{L}\\p{N}]", "_"); - return cleanString; - - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java deleted file mode 100644 index 0c5f6d8a1ad..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/CategoryOracle.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -/** - * @author Izabela Adamczyk - */ -class CategoryOracle -{ - private static final String DISCARD = "Discard"; - - private static final String UP = "up"; - - private static final String YES = "yes"; - - private static final String NO = "no"; - - private static final String CONSTANT = "Constant"; - - private static final String GOOD = "Good"; - - private enum Category - { - OTHER, DISCARDED_CHAMBER, GOOD_CHAMBER_INTENSITY_AND_LOCALIZATION_CHANGE, - GOOD_CHAMBER_LOCALIZATION_CHANGE, GOOD_CHAMBER_INTENSITY_UP, GOOD_CHAMBER_NO_CHANGE; - } - - public static String calculateCategory(InputRow in) - { - String quality = in.getQuality(); - String intensityChange = in.getIntensityChange(); - String localizationChange = in.getLocalizationChange(); - return calculateCategory(quality, intensityChange, localizationChange).toString(); - } - - private static Category calculateCategory(String quality, String intensityChange, - String localizationChange) - { - if (eq(quality, GOOD) && eq(intensityChange, CONSTANT) && eq(localizationChange, NO)) - { - return Category.GOOD_CHAMBER_NO_CHANGE; - } else if (eq(quality, GOOD) && eq(intensityChange, UP) && eq(localizationChange, NO)) - { - return Category.GOOD_CHAMBER_INTENSITY_UP; - } else if (eq(quality, GOOD) && eq(intensityChange, NO) && eq(localizationChange, YES)) - { - return Category.GOOD_CHAMBER_LOCALIZATION_CHANGE; - } else if (eq(quality, GOOD) && eq(intensityChange, CONSTANT) - && eq(localizationChange, YES)) - { - return Category.GOOD_CHAMBER_INTENSITY_AND_LOCALIZATION_CHANGE; - } else if (eq(quality, DISCARD)) - { - return Category.DISCARDED_CHAMBER; - } else - { - return Category.OTHER; - } - } - - private static boolean eq(String property, String value) - { - return equalsIgnoreCase(property, value); - } - - private static boolean equalsIgnoreCase(String str1, String str2) - { - return str1 == null ? str2 == null : str1.equalsIgnoreCase(str2); - } -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java deleted file mode 100644 index 9fd80590b4d..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/FeatureVectorConverter.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import org.apache.commons.io.FileUtils; - -import ch.systemsx.cisd.common.filesystem.FileUtilities; -import ch.systemsx.cisd.common.parser.IParserObjectFactory; -import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory; -import ch.systemsx.cisd.common.parser.IPropertyMapper; -import ch.systemsx.cisd.common.parser.ParserException; -import ch.systemsx.cisd.common.parser.ParsingException; -import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader; - -/** - * @author Izabela Adamczyk - */ -public class FeatureVectorConverter -{ - - public static void main(String[] args) throws ParserException, ParsingException, - IllegalArgumentException, IOException - { - String in = args[0]; - IParserObjectFactoryFactory<InputRow> parser = new IParserObjectFactoryFactory<InputRow>() - { - public IParserObjectFactory<InputRow> createFactory(IPropertyMapper propertyMapper) - throws ParserException - { - return new InputRowFactory(InputRow.class, propertyMapper); - } - }; - BisTabFileLoader<InputRow> loader = new BisTabFileLoader<InputRow>(parser, false); - File inFile = new File(in); - Map<String, String> defaults = Collections.emptyMap(); - List<InputRow> list = loader.load(FileUtils.openInputStream(inFile), defaults); - List<InputRowsNamedCollection> experiments = InputRowsHelper.extract(list); - for (InputRowsNamedCollection e : experiments) - { - String outName = e.getName() + ".csv"; - File outFile = - FileUtilities.createNextNumberedFile(new File(inFile.getParent(), outName), - null); - FileUtils.writeLines(outFile, InputRowsHelper.toTsv(e.getRows())); - System.out.println(outFile.getPath()); - } - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java deleted file mode 100644 index b57d9202843..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/Features.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.Arrays; -import java.util.List; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -public class Features -{ - - private static final String POSITION = "position"; - - private static final String SIDE = "side"; - - private static final String QUALITY = "quality"; - - private static final String QUALITY_DESC = "quality_desc"; - - private static final String INTENSITY_CHANGE = "intensity_change"; - - private static final String LOCALIZATION_CHANGE = "localization_change"; - - private static final String END_LOCALIZATION = "end_localization"; - - private static final String INITIAL_LOCALIZATION = "initial_localization"; - - private String position; - - private String side; - - private String quality; - - private String qualityDesc; - - private String intensityChange; - - private String localizationChange; - - private String initialLocalization; - - private String endLocalization; - - public Features() - { - } - - public String getPosition() - { - return position; - } - - @BeanProperty(label = POSITION) - public void setPosition(String position) - { - this.position = position; - } - - public String getSide() - { - return side; - } - - @BeanProperty(label = SIDE) - public void setSide(String side) - { - this.side = side; - } - - public String getQuality() - { - return quality; - } - - @BeanProperty(label = QUALITY) - public void setQuality(String quality) - { - this.quality = quality; - } - - public String getQualityDesc() - { - return qualityDesc; - } - - @BeanProperty(label = QUALITY_DESC) - public void setQualityDesc(String qualityDesc) - { - this.qualityDesc = qualityDesc; - } - - public String getIntensityChange() - { - return intensityChange; - } - - @BeanProperty(label = INTENSITY_CHANGE) - public void setIntensityChange(String intensityChange) - { - this.intensityChange = intensityChange; - } - - public String getLocalizationChange() - { - return localizationChange; - } - - @BeanProperty(label = LOCALIZATION_CHANGE) - public void setLocalizationChange(String localizationChange) - { - this.localizationChange = localizationChange; - } - - public String getInitialLocalization() - { - return initialLocalization; - } - - @BeanProperty(label = INITIAL_LOCALIZATION) - public void setInitialLocalization(String initialLocalization) - { - this.initialLocalization = initialLocalization; - } - - public String getEndLocalization() - { - return endLocalization; - } - - @BeanProperty(label = END_LOCALIZATION) - public void setEndLocalization(String endLocalization) - { - this.endLocalization = endLocalization; - } - - /** NOTE: Order strictly connected with {@link #getColumns()} */ - public static List<String> getHeaderColumns() - { - return Arrays.asList(asHeader(END_LOCALIZATION, "End Localization"), - asHeader(INITIAL_LOCALIZATION, "Initial Localization"), - asHeader(INTENSITY_CHANGE, "Intensity Change"), - asHeader(LOCALIZATION_CHANGE, "Localization Change"), asHeader(POSITION, "Position"), - asHeader(QUALITY, "Quality"), asHeader(QUALITY_DESC, "Quality Description"), - asHeader(SIDE, "Side")); - } - - static String asHeader(String code, String label) - { - return "<" + code + "> " + label; - } - - /** NOTE: Order strictly connected with {@link #getHeaderColumns()} */ - public List<String> getColumns() - { - return Arrays.asList(getEndLocalization(), getInitialLocalization(), getIntensityChange(), - getLocalizationChange(), getPosition(), getQuality(), getQualityDesc(), getSide()); - } -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java deleted file mode 100644 index cf8b599317f..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRow.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -public final class InputRow extends Features -{ - private static final String IDENTIFIER = "identifier"; - - private static final String CONTAINER = "container"; - - private static final String YORF = "yorf"; - - private String yorf; - - private String container; - - private String identifier; - - public InputRow() - { - } - - public String getContainer() - { - return container; - } - - @BeanProperty(label = CONTAINER) - public void setContainer(String container) - { - this.container = container; - } - - public String getIdentifier() - { - return identifier; - } - - @BeanProperty(label = IDENTIFIER) - public void setIdentifier(String identifier) - { - this.identifier = identifier; - } - - public String getYorf() - { - return yorf; - } - - @BeanProperty(label = YORF) - public void setYorf(String yorf) - { - this.yorf = yorf; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java deleted file mode 100644 index 9716d2cf084..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import ch.systemsx.cisd.common.parser.AbstractParserObjectFactory; -import ch.systemsx.cisd.common.parser.IPropertyMapper; - -/** - * @author Izabela Adamczyk - */ -final class InputRowFactory extends AbstractParserObjectFactory<InputRow> -{ - - protected InputRowFactory(Class<InputRow> beanClass, IPropertyMapper propertyMapper) - { - super(beanClass, propertyMapper); - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java deleted file mode 100644 index 471bcdfea90..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsHelper.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import ch.systemsx.cisd.common.utilities.BeanUtils; - -/** - * @author Izabela Adamczyk - */ -class InputRowsHelper -{ - - public static List<InputRowsNamedCollection> extract(List<InputRow> list) - { - Map<String, List<InputRow>> map = new HashMap<String, List<InputRow>>(); - for (InputRow r : list) - { - String name = r.getContainer(); - if (map.get(name) == null) - { - map.put(name, new ArrayList<InputRow>()); - } - map.get(name).add(r); - } - ArrayList<InputRowsNamedCollection> result = new ArrayList<InputRowsNamedCollection>(); - for (String key : map.keySet()) - { - InputRowsNamedCollection exp = new InputRowsNamedCollection(); - exp.setName(key); - exp.setRows(map.get(key)); - result.add(exp); - } - return result; - } - - public static List<String> toTsv(List<InputRow> list) - { - ArrayList<String> result = new ArrayList<String>(); - result.add(new TsvBuilder(OutputRow.getHeaderColumns()).toString()); - for (InputRow r : list) - { - result.add(new TsvBuilder(convert(r).getColumns()).toString()); - } - return result; - } - - private static OutputRow convert(InputRow in) - { - OutputRow outputRow = new OutputRow(); - BeanUtils.fillBean(OutputRow.class, outputRow, in); - outputRow.setWellName(in.getIdentifier().split(":")[1]); - String category = CategoryOracle.calculateCategory(in); - outputRow.setCategory(category); - return outputRow; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java deleted file mode 100644 index 7ffc9d82556..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/InputRowsNamedCollection.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.List; - -/** - * @author Izabela Adamczyk - */ -class InputRowsNamedCollection -{ - String name; - - List<InputRow> rows; - - public String getName() - { - return name; - } - - public void setName(String name) - { - this.name = name; - } - - public List<InputRow> getRows() - { - return rows; - } - - public void setRows(List<InputRow> rows) - { - this.rows = rows; - } - -} diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java deleted file mode 100644 index 57f4018edaa..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/OutputRow.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.ArrayList; -import java.util.List; - -import ch.systemsx.cisd.common.annotation.BeanProperty; - -/** - * @author Izabela Adamczyk - */ -final class OutputRow extends Features -{ - - private static final String CATEGORY = "category"; - - private static final String WELL_NAME = "WellName"; - - private String wellName; - - private String category; - - public String getWellName() - { - return wellName; - } - - @BeanProperty(label = WELL_NAME) - public void setWellName(String wellName) - { - this.wellName = wellName; - } - - public String getCategory() - { - return category; - } - - @BeanProperty(label = CATEGORY) - public void setCategory(String category) - { - this.category = category; - } - - /** NOTE: Order strictly connected with {@link #getColumns()} */ - public static List<String> getHeaderColumns() - { - ArrayList<String> list = new ArrayList<String>(); - list.add(WELL_NAME); - list.add(Features.asHeader(CATEGORY, "Category")); - list.addAll(Features/* super class */.getHeaderColumns()); - return list; - } - - /** NOTE: Order strictly connected with {@link #getHeaderColumns()} */ - @Override - public List<String> getColumns() - { - ArrayList<String> list = new ArrayList<String>(); - list.add(getWellName()); - list.add(getCategory()); - list.addAll(super.getColumns()); - return list; - } - -} \ No newline at end of file diff --git a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java b/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java deleted file mode 100644 index 5fc49229f79..00000000000 --- a/openbis_contrib/source/java/ch/ethz/bsse/cisd/dynamix/categoryoracle/TsvBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2010 ETH Zuerich, CISD - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package ch.ethz.bsse.cisd.dynamix.categoryoracle; - -import java.util.List; - -/** - * @author Izabela Adamczyk - */ -public class TsvBuilder -{ - static final String TSV_SEPARATOR = ";"; - - StringBuilder builder = new StringBuilder(); - - boolean empty = true; - - public TsvBuilder() - { - } - - public TsvBuilder(List<String> columns) - { - addColumns(columns.toArray(new String[0])); - } - - public void addColumns(String... columns) - { - for (String c : columns) - { - if (empty) - { - empty = false; - } else - { - builder.append(TsvBuilder.TSV_SEPARATOR); - } - builder.append(c); - } - } - - @Override - public String toString() - { - return builder.toString(); - } - -} diff --git a/openbis_contrib/source/java/log.xml b/openbis_contrib/source/java/log.xml deleted file mode 100644 index 5cee0a68436..00000000000 --- a/openbis_contrib/source/java/log.xml +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" ?> -<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> - -<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> - - <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> - <layout class="org.apache.log4j.PatternLayout"> - <param name="ConversionPattern" value="%d %-5p [%t] %c - %m%n"/> - </layout> - </appender> - - <appender name="NULL" class="org.apache.log4j.varia.NullAppender" /> - - <root> - <priority value ="info" /> - <appender-ref ref="STDOUT" /> - </root> - -</log4j:configuration> diff --git a/openbis_contrib/source/java/log4j.properties b/openbis_contrib/source/java/log4j.properties deleted file mode 100644 index 50010acd53e..00000000000 --- a/openbis_contrib/source/java/log4j.properties +++ /dev/null @@ -1,11 +0,0 @@ -# Default Logging Configuration - -log4j.rootLogger=INFO, stdout -#to increase logging level -#log4j.logger.org.dcm4cheri=DEBUG -#to decrease logging level -#log4j.logger.org.dcm4cheri=ERROR - -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %-5p %x - %m\n diff --git a/openbis_standard_technologies/build.gradle b/openbis_standard_technologies/build.gradle index e7b48dad3c7..177a7947f03 100644 --- a/openbis_standard_technologies/build.gradle +++ b/openbis_standard_technologies/build.gradle @@ -37,7 +37,6 @@ evaluationDependsOn(':dbmigration') evaluationDependsOn(':openbis') evaluationDependsOn(':datastore_server') evaluationDependsOn(':screening') -evaluationDependsOn(':deep_sequencing_unit') evaluationDependsOn(':big_data_link_server') evaluationDependsOn(':openbis_ng_ui') @@ -79,8 +78,7 @@ dependencies { zipping "eclipse:jetty-distribution:${jettyVersion}@zip" - datastore_server project(':deep_sequencing_unit'), - project(':screening'), + datastore_server project(':screening'), 'bioformats:bioformats:6.5.1', 'imagej:ij:1.43u', 'cisd:cisd-openbis-knime-server:13.6.0.r29301', @@ -341,7 +339,6 @@ task zipCorePlugins(type: SymZip) { downloadCorePlugin('https://github.com/aarpon/obit_microscopy_core_technology/archive/release/20.x.zip', 'microscopy') downloadCorePlugin('https://github.com/aarpon/obit_shared_core_technology/archive/release/20.x.zip', 'shared') from project(':screening').fileTree(dir: 'source/core-plugins', includes:['screening/**', 'screening-optional/**'], excludes:['**/package-to-dist']) - from project(':deep_sequencing_unit').fileTree(dir: 'source/core-plugins', includes:['illumina-ngs/**'], excludes:['**/package-to-dist']) from fileTree(dir: 'targets/downloads/obit_flow_core_technology-release-20.x/core-plugins', includes:['flow/**']) from fileTree(dir: 'targets/downloads/obit_microscopy_core_technology-release-20.x/core-plugins', includes:['microscopy/**']) from fileTree(dir: 'targets/downloads/obit_shared_core_technology-release-20.x/core-plugins', includes:['shared/**']) diff --git a/openbis_standard_technologies/settings.gradle b/openbis_standard_technologies/settings.gradle index 3965356da9a..6a63d12efca 100644 --- a/openbis_standard_technologies/settings.gradle +++ b/openbis_standard_technologies/settings.gradle @@ -1,3 +1,3 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'big_data_link_server', + 'datastore_server', 'screening', 'big_data_link_server', 'openbis_ng_ui', 'microservice_server_template' diff --git a/ui-test/settings.gradle b/ui-test/settings.gradle index 461cbd212e2..40136a17f7f 100644 --- a/ui-test/settings.gradle +++ b/ui-test/settings.gradle @@ -1,2 +1,2 @@ includeFlat 'commonbase', 'common', 'openbis_api', 'openbis-common', 'authentication', 'dbmigration', 'openbis', - 'datastore_server', 'screening', 'deep_sequencing_unit', 'openbis_standard_technologies' + 'datastore_server', 'screening', 'openbis_standard_technologies' -- GitLab